blob: ad20d6bdd51b5e2917f8cef9fa4bce3d015332d3 [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
Patrick Williams7784c422022-11-17 07:29:11 -060038 ['Kirkstone','4.0','April 2022','4.0.5 (October 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
Patrick Williams7784c422022-11-17 07:29:11 -060044 ['Langdale','4.1','October 2022','4.1.1 (November 2022)','Support for 7 months (until May 2023)','','2.2'],
45# ['Honister','3.4','October 2021','3.4.2 (February 2022)','Support for 7 months (until May 2022)','26.0','1.52'],
46# ['Gatesgarth','3.2','Oct 2020','3.2.4 (May 2021)','EOL','24.0','1.48'],
Andrew Geissler9aee5002022-03-30 16:27:02 +000047 # Optional Release slot #4
Patrick Williams7784c422022-11-17 07:29:11 -060048 # 'dunfell' seems to have a bug:
49 # Bitbake crash
50 # Traceback (most recent call last):
51 # File "/home/usersetup/poky/bitbake/lib/bb/ui/toasterui.py", line 337, in main
52 # buildinfohelper.update_and_store_task(event)
53 # File "/home/usersetup/poky/bitbake/lib/bb/ui/buildinfohelper.py", line 1267, in update_and_store_task
54 # assert identifier in self.internal_state['taskdata']
55 # AssertionError
56# ['Dunfell','3.1','April 2021','3.1.20 (October 2022)','Stable - Long Term Support (until Apr. 2024)','23.0','1.46'],
57# ['Hardknott','3.3','April 2021','3.3.5 (March 2022)','Stable - Support for 13 months (until Apr. 2022)','25.0','1.50'],
Andrew Geissler9aee5002022-03-30 16:27:02 +000058]
59
60default_poky_layers = [
61 'openembedded-core',
62 'meta-poky',
63 'meta-yocto-bsp',
64]
65
66default_oe_core_layers = [
67 'openembedded-core',
68]
69
70####################################
71# Templates
72
73prolog_template = '''\
74<?xml version="1.0" encoding="utf-8"?>
75<django-objects version="1.0">
76 <!-- Set the project default value for DISTRO -->
77 <object model="orm.toastersetting" pk="1">
78 <field type="CharField" name="name">DEFCONF_DISTRO</field>
79 <field type="CharField" name="value">{{distro}}</field>
80 </object>
81'''
82
83#<!-- Bitbake versions which correspond to the metadata release -->')
84bitbakeversion_poky_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.yoctoproject.org/poky</field>
88 <field type="CharField" name="branch">{{branch}}</field>
89 <field type="CharField" name="dirpath">bitbake</field>
90 </object>
91'''
92bitbakeversion_oecore_template = '''\
93 <object model="orm.bitbakeversion" pk="{{bitbake_id}}">
94 <field type="CharField" name="name">{{name}}</field>
95 <field type="CharField" name="giturl">git://git.openembedded.org/bitbake</field>
96 <field type="CharField" name="branch">{{bitbakeversion}}</field>
97 </object>
98'''
99
100# <!-- Releases available -->
101releases_available_template = '''\
102 <object model="orm.release" pk="{{ra_count}}">
103 <field type="CharField" name="name">{{name}}</field>
104 <field type="CharField" name="description">{{description}}</field>
105 <field rel="ManyToOneRel" to="orm.bitbakeversion" name="bitbake_version">{{ra_count}}</field>
106 <field type="CharField" name="branch_name">{{release}}</field>
107 <field type="TextField" name="helptext">Toaster will run your builds {{help_source}}.</field>
108 </object>
109'''
110
111# <!-- Default project layers for each release -->
112default_layers_template = '''\
113 <object model="orm.releasedefaultlayer" pk="{{rdl_count}}">
114 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
115 <field type="CharField" name="layer_name">{{layer}}</field>
116 </object>
117'''
118
119default_layers_preface = '''\
120 <!-- Default layers provided by poky
121 openembedded-core
122 meta-poky
123 meta-yocto-bsp
124 -->
125'''
126
127layer_poky_template = '''\
128 <object model="orm.layer" pk="{{layer_id}}">
129 <field type="CharField" name="name">{{layer}}</field>
130 <field type="CharField" name="layer_index_url"></field>
131 <field type="CharField" name="vcs_url">{{vcs_url}}</field>
132 <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field>
133 <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field>
134 <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field>
135 </object>
136'''
137
138layer_oe_core_template = '''\
139 <object model="orm.layer" pk="{{layer_id}}">
140 <field type="CharField" name="name">{{layer}}</field>
141 <field type="CharField" name="vcs_url">{{vcs_url}}</field>
142 <field type="CharField" name="vcs_web_url">{{vcs_web_url}}</field>
143 <field type="CharField" name="vcs_web_tree_base_url">{{vcs_web_tree_base_url}}</field>
144 <field type="CharField" name="vcs_web_file_base_url">{{vcs_web_file_base_url}}</field>
145 </object>
146'''
147
148layer_version_template = '''\
149 <object model="orm.layer_version" pk="{{lv_count}}">
150 <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field>
151 <field type="IntegerField" name="layer_source">0</field>
152 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
153 <field type="CharField" name="branch">{{branch}}</field>
154 <field type="CharField" name="dirpath">{{dirpath}}</field>
155 </object>
156'''
157
158layer_version_HEAD_template = '''\
159 <object model="orm.layer_version" pk="{{lv_count}}">
160 <field rel="ManyToOneRel" to="orm.layer" name="layer">{{layer_id}}</field>
161 <field type="IntegerField" name="layer_source">0</field>
162 <field rel="ManyToOneRel" to="orm.release" name="release">{{release_id}}</field>
163 <field type="CharField" name="branch">{{branch}}</field>
164 <field type="CharField" name="commit">{{commit}}</field>
165 <field type="CharField" name="dirpath">{{dirpath}}</field>
166 </object>
167'''
168
169layer_version_oe_core_template = '''\
170 <object model="orm.layer_version" pk="1">
171 <field rel="ManyToOneRel" to="orm.layer" name="layer">1</field>
172 <field rel="ManyToOneRel" to="orm.release" name="release">2</field>
173 <field type="CharField" name="local_path">OE-CORE-LAYER-DIR</field>
174 <field type="CharField" name="branch">HEAD</field>
175 <field type="CharField" name="dirpath">meta</field>
176 <field type="IntegerField" name="layer_source">0</field>
177 </object>
178'''
179
180epilog_template = '''\
181</django-objects>
182'''
183
184#################################
185# Helper Routines
186#
187
188def print_str(str,fd):
189 # Avoid extra newline at end
190 if str and (str[-1] == '\n'):
191 str = str[0:-1]
192 print(str,file=fd)
193
194def print_template(template,params,fd):
195 for line in template.split('\n'):
196 p = line.find('{{')
197 while p > 0:
198 q = line.find('}}')
199 key = line[p+2:q]
200 if key in params:
201 line = line[0:p] + params[key] + line[q+2:]
202 else:
203 line = line[0:p] + '?' + key + '?' + line[q+2:]
204 p = line.find('{{')
205 if line:
206 print(line,file=fd)
207
208#################################
209# Generate poky.xml
210#
211
212def generate_poky():
213 fd = open('poky.xml','w')
214
215 params = {}
216 params['distro'] = 'poky'
217 print_template(prolog_template,params,fd)
218 print_str('',fd)
219
220 print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd)
221 for i,release in enumerate(current_releases):
222 params = {}
223 params['release'] = release[0]
224 params['Release'] = release[0]
225 params['release_version'] = release[1]
226 if not (params['release'] in ('HEAD')): # 'master',
227 params['release'] = params['release'][0].lower() + params['release'][1:]
228 params['name'] = params['release']
229 params['bitbake_id'] = str(i+1)
230 params['branch'] = params['release']
231 print_template(bitbakeversion_poky_template,params,fd)
232 print_str('',fd)
233
234 print_str('',fd)
235 print_str(' <!-- Releases available -->',fd)
236 for i,release in enumerate(current_releases):
237 params = {}
238 params['release'] = release[0]
239 params['Release'] = release[0]
240 params['release_version'] = release[1]
241 if not (params['release'] in ('HEAD')): #'master',
242 params['release'] = params['release'][0].lower() + params['release'][1:]
243 params['h_release'] = '?h={{release}}'
244 params['name'] = params['release']
245 params['ra_count'] = str(i+1)
246 params['branch'] = params['release']
247
248 if 'HEAD' == params['release']:
249 params['help_source'] = 'with the version of the Yocto Project you have cloned or downloaded to your computer'
250 params['description'] = 'Local Yocto Project'
251 params['name'] = 'local'
252 else:
253 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;'
254 params['description'] = 'Yocto Project {{release_version}} "{{Release}}"'
255 if 'master' == params['release']:
256 params['h_release'] = ''
257 params['description'] = 'Yocto Project master'
258
259 print_template(releases_available_template,params,fd)
260 print_str('',fd)
261
262 print_str(' <!-- Default project layers for each release -->',fd)
263 rdl_count = 1
264 for i,release in enumerate(current_releases):
265 for j,layer in enumerate(default_poky_layers):
266 params = {}
267 params['layer'] = layer
268 params['release'] = release[0]
269 params['Release'] = release[0]
270 params['release_version'] = release[1]
271 if not (params['release'] in ('master','HEAD')):
272 params['release'] = params['release'][0].lower() + params['release'][1:]
273 params['release_id'] = str(i+1)
274 params['rdl_count'] = str(rdl_count)
275 params['branch'] = params['release']
276 print_template(default_layers_template,params,fd)
277 rdl_count += 1
278 print_str('',fd)
279
280 print_str(default_layers_preface,fd)
281 lv_count = 1
282 for i,layer in enumerate(default_poky_layers):
283 params = {}
284 params['layer'] = layer
285 params['layer_id'] = str(i+1)
286 params['vcs_url'] = 'git://git.yoctoproject.org/poky'
287 params['vcs_web_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky'
288 params['vcs_web_tree_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%'
289 params['vcs_web_file_base_url'] = 'https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/%path%?h=%branch%'
290
291 if i:
292 print_str('',fd)
293 print_template(layer_poky_template,params,fd)
294 for j,release in enumerate(current_releases):
295 params['release'] = release[0]
296 params['Release'] = release[0]
297 params['release_version'] = release[1]
298 if not (params['release'] in ('master','HEAD')):
299 params['release'] = params['release'][0].lower() + params['release'][1:]
300 params['release_id'] = str(j+1)
301 params['lv_count'] = str(lv_count)
302 params['branch'] = params['release']
303 params['commit'] = params['release']
304
305 params['dirpath'] = params['layer']
306 if params['layer'] in ('openembedded-core'): #'openembedded-core',
307 params['dirpath'] = 'meta'
308
309 if 'HEAD' == params['release']:
310 print_template(layer_version_HEAD_template,params,fd)
311 else:
312 print_template(layer_version_template,params,fd)
313 lv_count += 1
314
315 print_str(epilog_template,fd)
316 fd.close()
317
318#################################
319# Generate oe-core.xml
320#
321
322def generate_oe_core():
323 fd = open('oe-core.xml','w')
324
325 params = {}
326 params['distro'] = 'nodistro'
327 print_template(prolog_template,params,fd)
328 print_str('',fd)
329
330 print_str(' <!-- Bitbake versions which correspond to the metadata release -->',fd)
331 for i,release in enumerate(current_releases):
332 params = {}
333 params['release'] = release[0]
334 params['Release'] = release[0]
335 params['bitbakeversion'] = release[6]
336 params['release_version'] = release[1]
337 if not (params['release'] in ('HEAD')): # 'master',
338 params['release'] = params['release'][0].lower() + params['release'][1:]
339 params['name'] = params['release']
340 params['bitbake_id'] = str(i+1)
341 params['branch'] = params['release']
342 print_template(bitbakeversion_oecore_template,params,fd)
343 print_str('',fd)
344
345 print_str(' <!-- Releases available -->',fd)
346 for i,release in enumerate(current_releases):
347 params = {}
348 params['release'] = release[0]
349 params['Release'] = release[0]
350 params['release_version'] = release[1]
351 if not (params['release'] in ('HEAD')): #'master',
352 params['release'] = params['release'][0].lower() + params['release'][1:]
353 params['h_release'] = '?h={{release}}'
354 params['name'] = params['release']
355 params['ra_count'] = str(i+1)
356 params['branch'] = params['release']
357
358 if 'HEAD' == params['release']:
359 params['help_source'] = 'with the version of OpenEmbedded that you have cloned or downloaded to your computer'
360 params['description'] = 'Local Openembedded'
361 params['name'] = 'local'
362 else:
363 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'
364 params['description'] = 'Openembedded {{Release}}'
365 if 'master' == params['release']:
366 params['h_release'] = ''
367 params['description'] = 'OpenEmbedded core master'
368 params['Release'] = params['release']
369
370 print_template(releases_available_template,params,fd)
371 print_str('',fd)
372
373 print_str(' <!-- Default layers for each release -->',fd)
374 rdl_count = 1
375 for i,release in enumerate(current_releases):
376 for j,layer in enumerate(default_oe_core_layers):
377 params = {}
378 params['layer'] = layer
379 params['release'] = release[0]
380 params['Release'] = release[0]
381 params['release_version'] = release[1]
382 if not (params['release'] in ('master','HEAD')):
383 params['release'] = params['release'][0].lower() + params['release'][1:]
384 params['release_id'] = str(i+1)
385 params['rdl_count'] = str(rdl_count)
386 params['branch'] = params['release']
387 print_template(default_layers_template,params,fd)
388 rdl_count += 1
389 print_str('',fd)
390
391 print_str('',fd)
392 print_str(' <!-- Layer for the Local release -->',fd)
393 lv_count = 1
394 for i,layer in enumerate(default_oe_core_layers):
395 params = {}
396 params['layer'] = layer
397 params['layer_id'] = str(i+1)
398 params['vcs_url'] = 'git://git.openembedded.org/openembedded-core'
399 params['vcs_web_url'] = 'https://cgit.openembedded.org/openembedded-core'
400 params['vcs_web_tree_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%'
401 params['vcs_web_file_base_url'] = 'https://cgit.openembedded.org/openembedded-core/tree/%path%?h=%branch%'
402 if i:
403 print_str('',fd)
404 print_template(layer_oe_core_template,params,fd)
405
406 print_template(layer_version_oe_core_template,params,fd)
407 print_str('',fd)
408
409 print_str(epilog_template,fd)
410 fd.close()
411
412#################################
413# Help
414#
415
416def list_releases():
417 print("Release ReleaseVer BitbakeVer Support Level")
418 print("========== =========== ========== ==============================================")
419 for release in current_releases:
420 print("%10s %10s %11s %s" % (release[0],release[1],release[6],release[4]))
421
422#################################
423# main
424#
425
426def main(argv):
427 global verbose
428
429 parser = argparse.ArgumentParser(description='gen_fixtures.py: table generate the fixture files')
430 parser.add_argument('--poky', '-p', action='store_const', const='poky', dest='command', help='Generate the poky.xml file')
431 parser.add_argument('--oe-core', '-o', action='store_const', const='oe_core', dest='command', help='Generate the oe-core.xml file')
432 parser.add_argument('--all', '-a', action='store_const', const='all', dest='command', help='Generate all fixture files')
433 parser.add_argument('--list', '-l', action='store_const', const='list', dest='command', help='List the release table')
434 parser.add_argument('--verbose', '-v', action='store_true', dest='verbose', help='Enable verbose debugging output')
435 args = parser.parse_args()
436
437 verbose = args.verbose
438 if 'poky' == args.command:
439 generate_poky()
440 elif 'oe_core' == args.command:
441 generate_oe_core()
442 elif 'all' == args.command:
443 generate_poky()
444 generate_oe_core()
445 elif 'all' == args.command:
446 list_releases()
447 elif 'list' == args.command:
448 list_releases()
449
450 else:
451 print("No command for 'gen_fixtures.py' selected")
452
453if __name__ == '__main__':
454 main(sys.argv[1:])