blob: 69f557657ad6494f90e0743ffc8f38a62e956dda [file] [log] [blame]
Andrew Geissler9aee5002022-03-30 16:27:02 +00001#!/usr/bin/env python3
2# ex:ts=4:sw=4:sts=4:et
3# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4#
5# Generate Toaster Fixtures for 'poky.xml' and 'oe-core.xml'
6#
7# Copyright (C) 2022 Wind River Systems
8# SPDX-License-Identifier: GPL-2.0-only
9#
10# Edit the 'current_releases' table for each new release cycle
11#
12# Usage: ./get_fixtures all
13#
14
15import os
16import sys
17import argparse
18
19verbose = False
20
21####################################
22# Releases
23#
24# https://wiki.yoctoproject.org/wiki/Releases
25#
26# NOTE: for the current releases table, it helps to keep continuing releases
27# in the same table positions since this minimizes the patch diff for review.
28# The order of the table does not matter since Toaster presents them sorted.
29#
30# Traditionally, the two most current releases are included in addition to the
31# 'master' branch and the local installation's 'HEAD'.
32# It is also policy to include all active LTS releases.
33#
34
35# [Codename, Yocto Project Version, Release Date, Current Version, Support Level, Poky Version, BitBake branch]
36current_releases = [
37 # Release slot #1
Andrew Geisslerc5535c92023-01-27 16:10:19 -060038 ['Kirkstone','4.0','April 2022','4.0.6 (December 2022)','Stable - Long Term Support (until Apr. 2024)','','2.0'],
Andrew Geissler9aee5002022-03-30 16:27:02 +000039 # Release slot #2 'local'
40 ['HEAD','HEAD','','Local Yocto Project','HEAD','','HEAD'],
41 # Release slot #3 'master'
42 ['Master','master','','Yocto Project master','master','','master'],
43 # Release slot #4
Andrew Geisslerc5535c92023-01-27 16:10:19 -060044 ['Langdale','4.1','October 2022','4.1.2 (January 2023)','Support for 7 months (until May 2023)','','2.2'],
Patrick Williams7784c422022-11-17 07:29:11 -060045# ['Honister','3.4','October 2021','3.4.2 (February 2022)','Support for 7 months (until May 2022)','26.0','1.52'],
Patrick Williams7784c422022-11-17 07:29:11 -060046# ['Hardknott','3.3','April 2021','3.3.5 (March 2022)','Stable - Support for 13 months (until Apr. 2022)','25.0','1.50'],
Andrew Geisslerc5535c92023-01-27 16:10:19 -060047# ['Gatesgarth','3.2','Oct 2020','3.2.4 (May 2021)','EOL','24.0','1.48'],
48 # Optional Release slot #5
49 ['Dunfell','3.1','April 2020','3.1.22 (January 2023)','Stable - Long Term Support (until Apr. 2024)','23.0','1.46'],
Andrew Geissler9aee5002022-03-30 16:27:02 +000050]
51
52default_poky_layers = [
53 'openembedded-core',
54 'meta-poky',
55 'meta-yocto-bsp',
56]
57
58default_oe_core_layers = [
59 'openembedded-core',
60]
61
62####################################
63# Templates
64
65prolog_template = '''\
66<?xml version="1.0" encoding="utf-8"?>
67<django-objects version="1.0">
68 <!-- Set the project default value for DISTRO -->
69 <object model="orm.toastersetting" pk="1">
70 <field type="CharField" name="name">DEFCONF_DISTRO</field>
71 <field type="CharField" name="value">{{distro}}</field>
72 </object>
73'''
74
75#<!-- Bitbake versions which correspond to the metadata release -->')
76bitbakeversion_poky_template = '''\
77 <object model="orm.bitbakeversion" pk="{{bitbake_id}}">
78 <field type="CharField" name="name">{{name}}</field>
79 <field type="CharField" name="giturl">git://git.yoctoproject.org/poky</field>
80 <field type="CharField" name="branch">{{branch}}</field>
81 <field type="CharField" name="dirpath">bitbake</field>
82 </object>
83'''
84bitbakeversion_oecore_template = '''\
85 <object model="orm.bitbakeversion" pk="{{bitbake_id}}">
86 <field type="CharField" name="name">{{name}}</field>
87 <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
88 <field type="CharField" name="branch">{{bitbakeversion}}</field>
89 </object>
90'''
91
92# <!-- Releases available -->
93releases_available_template = '''\
94 <object model="orm.release" pk="{{ra_count}}">
95 <field type="CharField" name="name">{{name}}</field>
96 <field type="CharField" name="description">{{description}}</field>
97 <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">{{ra_count}}</field>
98 <field type="CharField" name="branch_name">{{release}}</field>
99 <field type="TextField" name="helptext">Toaster will run your builds {{help_source}}.</field>
100 </object>
101'''
102
103# <!-- Default project layers for each release -->
104default_layers_template = '''\
105 <object model="orm.releasedefaultlayer" pk="{{rdl_count}}">
106 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
107 <field type="CharField" name="layer_name">{{layer}}</field>
108 </object>
109'''
110
111default_layers_preface = '''\
112 <!-- Default layers provided by poky
113 openembedded-core
114 meta-poky
115 meta-yocto-bsp
116 -->
117'''
118
119layer_poky_template = '''\
120 <object model="orm.layer" pk="{{layer_id}}">
121 <field type="CharField" name="name">{{layer}}</field>
122 <field type="CharField" name="layer_index_url"></field>
123 <field type="CharField" name="vcs_url">{{vcs_url}}</field>
124 <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field>
125 <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field>
126 <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field>
127 </object>
128'''
129
130layer_oe_core_template = '''\
131 <object model="orm.layer" pk="{{layer_id}}">
132 <field type="CharField" name="name">{{layer}}</field>
133 <field type="CharField" name="vcs_url">{{vcs_url}}</field>
134 <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field>
135 <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field>
136 <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field>
137 </object>
138'''
139
140layer_version_template = '''\
141 <object model="orm.layer_version" pk="{{lv_count}}">
142 <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field>
143 <field type="IntegerField" name="layer_source">0</field>
144 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
145 <field type="CharField" name="branch">{{branch}}</field>
146 <field type="CharField" name="dirpath">{{dirpath}}</field>
147 </object>
148'''
149
150layer_version_HEAD_template = '''\
151 <object model="orm.layer_version" pk="{{lv_count}}">
152 <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field>
153 <field type="IntegerField" name="layer_source">0</field>
154 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
155 <field type="CharField" name="branch">{{branch}}</field>
156 <field type="CharField" name="commit">{{commit}}</field>
157 <field type="CharField" name="dirpath">{{dirpath}}</field>
158 </object>
159'''
160
161layer_version_oe_core_template = '''\
162 <object model="orm.layer_version" pk="1">
163 <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field>
164 <field rel="ManyToOneRel" to="orm.release" name="release">2</field>
165 <field type="CharField" name="local_path">OE-CORE-LAYER-DIR</field>
166 <field type="CharField" name="branch">HEAD</field>
167 <field type="CharField" name="dirpath">meta</field>
168 <field type="IntegerField" name="layer_source">0</field>
169 </object>
170'''
171
172epilog_template = '''\
173</django-objects>
174'''
175
176#################################
177# Helper Routines
178#
179
180def print_str(str,fd):
181 # Avoid extra newline at end
182 if str and (str[-1] == '\n'):
183 str = str[0:-1]
184 print(str,file=fd)
185
186def print_template(template,params,fd):
187 for line in template.split('\n'):
188 p = line.find('{{')
189 while p > 0:
190 q = line.find('}}')
191 key = line[p+2:q]
192 if key in params:
193 line = line[0:p] + params[key] + line[q+2:]
194 else:
195 line = line[0:p] + '?' + key + '?' + line[q+2:]
196 p = line.find('{{')
197 if line:
198 print(line,file=fd)
199
200#################################
201# Generate poky.xml
202#
203
204def generate_poky():
205 fd = open('poky.xml','w')
206
207 params = {}
208 params['distro'] = 'poky'
209 print_template(prolog_template,params,fd)
210 print_str('',fd)
211
212 print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd)
213 for i,release in enumerate(current_releases):
214 params = {}
215 params['release'] = release[0]
216 params['Release'] = release[0]
217 params['release_version'] = release[1]
218 if not (params['release'] in ('HEAD')): # 'master',
219 params['release'] = params['release'][0].lower() + params['release'][1:]
220 params['name'] = params['release']
221 params['bitbake_id'] = str(i+1)
222 params['branch'] = params['release']
223 print_template(bitbakeversion_poky_template,params,fd)
224 print_str('',fd)
225
226 print_str('',fd)
227 print_str(' <!-- Releases available -->',fd)
228 for i,release in enumerate(current_releases):
229 params = {}
230 params['release'] = release[0]
231 params['Release'] = release[0]
232 params['release_version'] = release[1]
233 if not (params['release'] in ('HEAD')): #'master',
234 params['release'] = params['release'][0].lower() + params['release'][1:]
235 params['h_release'] = '?h={{release}}'
236 params['name'] = params['release']
237 params['ra_count'] = str(i+1)
238 params['branch'] = params['release']
239
240 if 'HEAD' == params['release']:
241 params['help_source'] = 'with the version of the Yocto Project you have cloned or downloaded to your computer'
242 params['description'] = 'Local Yocto Project'
243 params['name'] = 'local'
244 else:
245 params['help_source'] = 'using the tip of the &lt;a href="https://git.yoctoproject.org/cgit/cgit.cgi/poky/log/{{h_release}}"&gt;Yocto Project {{Release}} branch&lt;/a&gt;'
246 params['description'] = 'Yocto Project {{release_version}} "{{Release}}"'
247 if 'master' == params['release']:
248 params['h_release'] = ''
249 params['description'] = 'Yocto Project master'
250
251 print_template(releases_available_template,params,fd)
252 print_str('',fd)
253
254 print_str(' <!-- Default project layers for each release -->',fd)
255 rdl_count = 1
256 for i,release in enumerate(current_releases):
257 for j,layer in enumerate(default_poky_layers):
258 params = {}
259 params['layer'] = layer
260 params['release'] = release[0]
261 params['Release'] = release[0]
262 params['release_version'] = release[1]
263 if not (params['release'] in ('master','HEAD')):
264 params['release'] = params['release'][0].lower() + params['release'][1:]
265 params['release_id'] = str(i+1)
266 params['rdl_count'] = str(rdl_count)
267 params['branch'] = params['release']
268 print_template(default_layers_template,params,fd)
269 rdl_count += 1
270 print_str('',fd)
271
272 print_str(default_layers_preface,fd)
273 lv_count = 1
274 for i,layer in enumerate(default_poky_layers):
275 params = {}
276 params['layer'] = layer
277 params['layer_id'] = str(i+1)
278 params['vcs_url'] = 'git://git.yoctoproject.org/poky'
279 params['vcs_web_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky'
280 params['vcs_web_tree_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%'
281 params['vcs_web_file_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%'
282
283 if i:
284 print_str('',fd)
285 print_template(layer_poky_template,params,fd)
286 for j,release in enumerate(current_releases):
287 params['release'] = release[0]
288 params['Release'] = release[0]
289 params['release_version'] = release[1]
290 if not (params['release'] in ('master','HEAD')):
291 params['release'] = params['release'][0].lower() + params['release'][1:]
292 params['release_id'] = str(j+1)
293 params['lv_count'] = str(lv_count)
294 params['branch'] = params['release']
295 params['commit'] = params['release']
296
297 params['dirpath'] = params['layer']
298 if params['layer'] in ('openembedded-core'): #'openembedded-core',
299 params['dirpath'] = 'meta'
300
301 if 'HEAD' == params['release']:
302 print_template(layer_version_HEAD_template,params,fd)
303 else:
304 print_template(layer_version_template,params,fd)
305 lv_count += 1
306
307 print_str(epilog_template,fd)
308 fd.close()
309
310#################################
311# Generate oe-core.xml
312#
313
314def generate_oe_core():
315 fd = open('oe-core.xml','w')
316
317 params = {}
318 params['distro'] = 'nodistro'
319 print_template(prolog_template,params,fd)
320 print_str('',fd)
321
322 print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd)
323 for i,release in enumerate(current_releases):
324 params = {}
325 params['release'] = release[0]
326 params['Release'] = release[0]
327 params['bitbakeversion'] = release[6]
328 params['release_version'] = release[1]
329 if not (params['release'] in ('HEAD')): # 'master',
330 params['release'] = params['release'][0].lower() + params['release'][1:]
331 params['name'] = params['release']
332 params['bitbake_id'] = str(i+1)
333 params['branch'] = params['release']
334 print_template(bitbakeversion_oecore_template,params,fd)
335 print_str('',fd)
336
337 print_str(' <!-- Releases available -->',fd)
338 for i,release in enumerate(current_releases):
339 params = {}
340 params['release'] = release[0]
341 params['Release'] = release[0]
342 params['release_version'] = release[1]
343 if not (params['release'] in ('HEAD')): #'master',
344 params['release'] = params['release'][0].lower() + params['release'][1:]
345 params['h_release'] = '?h={{release}}'
346 params['name'] = params['release']
347 params['ra_count'] = str(i+1)
348 params['branch'] = params['release']
349
350 if 'HEAD' == params['release']:
351 params['help_source'] = 'with the version of OpenEmbedded that you have cloned or downloaded to your computer'
352 params['description'] = 'Local Openembedded'
353 params['name'] = 'local'
354 else:
355 params['help_source'] = 'using the tip of the &lt;a href=\\"https://cgit.openembedded.org/openembedded-core/log/{{h_release}}\\"&gt;OpenEmbedded {{Release}}&lt;/a&gt; branch'
356 params['description'] = 'Openembedded {{Release}}'
357 if 'master' == params['release']:
358 params['h_release'] = ''
359 params['description'] = 'OpenEmbedded core master'
360 params['Release'] = params['release']
361
362 print_template(releases_available_template,params,fd)
363 print_str('',fd)
364
365 print_str(' <!-- Default layers for each release -->',fd)
366 rdl_count = 1
367 for i,release in enumerate(current_releases):
368 for j,layer in enumerate(default_oe_core_layers):
369 params = {}
370 params['layer'] = layer
371 params['release'] = release[0]
372 params['Release'] = release[0]
373 params['release_version'] = release[1]
374 if not (params['release'] in ('master','HEAD')):
375 params['release'] = params['release'][0].lower() + params['release'][1:]
376 params['release_id'] = str(i+1)
377 params['rdl_count'] = str(rdl_count)
378 params['branch'] = params['release']
379 print_template(default_layers_template,params,fd)
380 rdl_count += 1
381 print_str('',fd)
382
383 print_str('',fd)
384 print_str(' <!-- Layer for the Local release -->',fd)
385 lv_count = 1
386 for i,layer in enumerate(default_oe_core_layers):
387 params = {}
388 params['layer'] = layer
389 params['layer_id'] = str(i+1)
390 params['vcs_url'] = 'git://git.openembedded.org/openembedded-core'
391 params['vcs_web_url'] = 'https://cgit.openembedded.org/openembedded-core'
392 params['vcs_web_tree_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%'
393 params['vcs_web_file_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%'
394 if i:
395 print_str('',fd)
396 print_template(layer_oe_core_template,params,fd)
397
398 print_template(layer_version_oe_core_template,params,fd)
399 print_str('',fd)
400
401 print_str(epilog_template,fd)
402 fd.close()
403
404#################################
405# Help
406#
407
408def list_releases():
409 print("Release ReleaseVer BitbakeVer Support Level")
410 print("========== =========== ========== ==============================================")
411 for release in current_releases:
412 print("%10s %10s %11s %s" % (release[0],release[1],release[6],release[4]))
413
414#################################
415# main
416#
417
418def main(argv):
419 global verbose
420
421 parser = argparse.ArgumentParser(description='gen_fixtures.py: table generate the fixture files')
422 parser.add_argument('--poky', '-p', action='store_const', const='poky', dest='command', help='Generate the poky.xml file')
423 parser.add_argument('--oe-core', '-o', action='store_const', const='oe_core', dest='command', help='Generate the oe-core.xml file')
424 parser.add_argument('--all', '-a', action='store_const', const='all', dest='command', help='Generate all fixture files')
425 parser.add_argument('--list', '-l', action='store_const', const='list', dest='command', help='List the release table')
426 parser.add_argument('--verbose', '-v', action='store_true', dest='verbose', help='Enable verbose debugging output')
427 args = parser.parse_args()
428
429 verbose = args.verbose
430 if 'poky' == args.command:
431 generate_poky()
432 elif 'oe_core' == args.command:
433 generate_oe_core()
434 elif 'all' == args.command:
435 generate_poky()
436 generate_oe_core()
437 elif 'all' == args.command:
438 list_releases()
439 elif 'list' == args.command:
440 list_releases()
441
442 else:
443 print("No command for 'gen_fixtures.py' selected")
444
445if __name__ == '__main__':
446 main(sys.argv[1:])