mirror of
https://git.yoctoproject.org/meta-zephyr
synced 2026-01-29 21:58:41 +01:00
zephyr-core/scripts: Introduce script to generate new versions
Add a Python script which can be used to automatically generate configuration for new Zephyr versions. This script: * Takes the Zephyr version as a single argument * Uses the Github API to find the version tag's SHA1 * Uses West as a library to parse the version's manifest file * Uses a Jinja template to generate a .inc file for the version * Outputs the .inc file directly into the zephyr-kernel directory The generated .inc file includes: * SRCREVs for all modules * Separate SRC_URI_x variables for each module, to make it easier to swap out a specific URL for a fork or mirror * A version-specific SRC_URI, containing only the modules defined in the release * A list of the ZEPHYR_MODULES Signed-off-by: Peter Hoyes <Peter.Hoyes@arm.com> Tested-by: Jon Mason <jon.mason@arm.com> Signed-off-by: Naveen Saini <naveen.kumar.saini@intel.com>
This commit is contained in:
committed by
Naveen Saini
parent
e3177011b2
commit
f12da18fe0
17
README.txt
17
README.txt
@@ -125,6 +125,23 @@ you will need to run the above, copy the conf files from the deploy dir to the
|
||||
machine conf directory and then run your build. This shouldn't need to happen
|
||||
often.
|
||||
|
||||
Generating new Zephyr recipe versions
|
||||
=====================================
|
||||
The script meta-zephyr-core/scripts/generate-version.py is used to generate
|
||||
Yocto configuration for a Zephyr version from the West configuration in the
|
||||
Zephyr repository. It requires the west and jinja2 Python packages to be
|
||||
installed on the host. Run it as follows:
|
||||
|
||||
$ ./meta-zephyr-core/scripts/generate-version.py x.x.x
|
||||
|
||||
where x.x.x is the Zephyr version.
|
||||
|
||||
The patch files added to SRC_URI in the generated file should be validated and
|
||||
modified if required.
|
||||
|
||||
The new version should be committed and submitted to the mailing list as
|
||||
described in "Contributing".
|
||||
|
||||
Contributing
|
||||
============
|
||||
|
||||
|
||||
73
meta-zephyr-core/scripts/generate-version.py
Executable file
73
meta-zephyr-core/scripts/generate-version.py
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import json
|
||||
import pathlib
|
||||
import re
|
||||
import sys
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
# These non-standard modules must be installed on the host
|
||||
import jinja2
|
||||
import west.manifest
|
||||
|
||||
# This script takes one argument - the Zephyr version in the form x.y.z
|
||||
version = sys.argv[1]
|
||||
if not re.match(r'\d+.\d+.\d+', version):
|
||||
raise ValueError("Please provide a valid Zephyr version")
|
||||
|
||||
# Convert the version (x.y.z) into the Git commit SHA using the Github API
|
||||
# This is a two-step process - first obtain the tag SHA
|
||||
ref_url = f'https://api.github.com/repos/zephyrproject-rtos/zephyr/git/refs/tags/v{version}'
|
||||
with urllib.request.urlopen(ref_url) as f:
|
||||
ref_data = json.load(f)
|
||||
ref_sha = ref_data['object']['sha']
|
||||
|
||||
# Secondly, obtain the commit SHA of the tag SHA
|
||||
tag_url = f'https://api.github.com/repos/zephyrproject-rtos/zephyr/git/tags/{ref_sha}'
|
||||
with urllib.request.urlopen(tag_url) as f:
|
||||
tag_data = json.load(f)
|
||||
tag_sha = tag_data['object']['sha']
|
||||
|
||||
# Obtain the West manifest and decode using west as a library
|
||||
manifest_url = f'https://raw.githubusercontent.com/zephyrproject-rtos/zephyr/v{version}/west.yml'
|
||||
with urllib.request.urlopen(manifest_url) as f:
|
||||
source_data = f.read().decode()
|
||||
manifest = west.manifest.Manifest(source_data=source_data,
|
||||
import_flags=west.manifest.ImportFlag.IGNORE)
|
||||
projects = manifest.get_projects([])
|
||||
|
||||
# projects contains a 'manifest' project for 'self' which we don't want to use
|
||||
projects = list(filter(lambda project: project.name != 'manifest', projects))
|
||||
template_params = dict(version=version, tag_sha=tag_sha, projects=projects)
|
||||
|
||||
def git_url_to_bitbake(url):
|
||||
"""
|
||||
A template helper function which converts an URL for a Git repository into
|
||||
a Bitbake-style URL with a 'protocol' suffix
|
||||
"""
|
||||
parts = urllib.parse.urlparse(url)
|
||||
original_sceme = parts.scheme
|
||||
parts = parts._replace(scheme='git')
|
||||
return parts.geturl() + ';protocol=' + original_sceme
|
||||
|
||||
def bitbake_var(name):
|
||||
"""
|
||||
Returns a string suitable for use in a Bitbake variable name
|
||||
"""
|
||||
return name.upper().replace('-', '_')
|
||||
|
||||
# Set up the Jinja environment
|
||||
template_dir = pathlib.Path(__file__).parent
|
||||
env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir))
|
||||
env.filters['git_url_to_bitbake'] = git_url_to_bitbake
|
||||
env.filters['bitbake_var'] = bitbake_var
|
||||
template = env.get_template('zephyr-kernel-src.inc.jinja')
|
||||
|
||||
# Output directly to the zephyr-kernel directory
|
||||
dest_path = pathlib.Path(__file__).parents[1] / 'recipes-kernel' /\
|
||||
'zephyr-kernel' / f'zephyr-kernel-src-{version}.inc'
|
||||
|
||||
# Generate the Bitbake include file
|
||||
with open(dest_path, 'w') as f:
|
||||
f.write(template.render(**template_params))
|
||||
35
meta-zephyr-core/scripts/zephyr-kernel-src.inc.jinja
Normal file
35
meta-zephyr-core/scripts/zephyr-kernel-src.inc.jinja
Normal file
@@ -0,0 +1,35 @@
|
||||
# Auto-generated from zephyr-kernel-src.inc.jinja
|
||||
{%- set short_version = '.'.join(version.split('.')[0:2]) %}
|
||||
|
||||
SRCREV_FORMAT = "default"
|
||||
|
||||
SRCREV_default = "{{ tag_sha }}"
|
||||
{% for project in projects -%}
|
||||
SRCREV_{{ project.name }} = "{{ project.revision }}"
|
||||
{% endfor %}
|
||||
SRC_URI_ZEPHYR ?= "git://github.com/zephyrproject-rtos/zephyr.git;protocol=https"
|
||||
{%- for project in projects %}
|
||||
SRC_URI_{{ project.name | bitbake_var }} ?= "{{ project.url | git_url_to_bitbake }}"
|
||||
{%- endfor %}
|
||||
|
||||
SRC_URI_PATCHES ?= "\
|
||||
file://0001-{{ short_version }}-cmake-add-yocto-toolchain.patch;patchdir=zephyr \
|
||||
file://0001-{{ short_version }}-x86-fix-efi-binary-generation-issue-in-cross-compila.patch;patchdir=zephyr \
|
||||
"
|
||||
|
||||
SRC_URI = "\
|
||||
${SRC_URI_ZEPHYR};branch=${ZEPHYR_BRANCH};name=default;destsuffix=git/zephyr \
|
||||
{%- for project in projects %}
|
||||
${SRC_URI_{{ project.name | bitbake_var }}};name={{ project.name }};nobranch=1;destsuffix=git/{{ project.path }} \
|
||||
{%- endfor %}
|
||||
${SRC_URI_PATCHES} \
|
||||
"
|
||||
|
||||
ZEPHYR_MODULES = "\{% for project in projects %}
|
||||
${S}/{{ project.path }}\;\
|
||||
{%- endfor %}
|
||||
"
|
||||
|
||||
ZEPHYR_BRANCH = "v{{ short_version }}-branch"
|
||||
PV = "{{ version }}+git${SRCPV}"
|
||||
|
||||
Reference in New Issue
Block a user