[PATCH 4/6] build: Add support to make bootloader images
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Feb 27 15:15:21 UTC 2024
Add a new build item type to provide optional BSP-specific tools to make
bootloader images. The tools are installed as Python scripts in:
${prefix}/bin/rtems-mkimage-${ARCH}-${BSP_NAME}.py
Application build systems can query the tool using the RTEMS_MKIMAGE package
configuration varible, for example:
pkg-config --variable=RTEMS_MKIMAGE ${prefix}/lib/pkgconfig/${ARCH}-${BSP_NAME}.pc
If the BSP does not provide a tool, then the variable RTEMS_MKIMAGE is set to
"false".
Update #4272.
---
spec/build/bsps/bspopts.yml | 2 ++
spec/build/bsps/optpkgmkimage.yml | 19 ++++++++++
spec/build/bsps/pkgconfig.yml | 1 +
spec/build/cpukit/cpuopts.yml | 4 +++
spec/build/cpukit/optbootimageext.yml | 17 +++++++++
spec/build/cpukit/optbuildbootimages.yml | 16 +++++++++
wscript | 45 ++++++++++++++++++++++--
7 files changed, 102 insertions(+), 2 deletions(-)
create mode 100644 spec/build/bsps/optpkgmkimage.yml
create mode 100644 spec/build/cpukit/optbootimageext.yml
create mode 100644 spec/build/cpukit/optbuildbootimages.yml
diff --git a/spec/build/bsps/bspopts.yml b/spec/build/bsps/bspopts.yml
index 734292f421..74fe6d17f9 100644
--- a/spec/build/bsps/bspopts.yml
+++ b/spec/build/bsps/bspopts.yml
@@ -33,6 +33,8 @@ links:
uid: optldflagsbsp
- role: build-dependency
uid: optmakelegacy
+- role: build-dependency
+ uid: optpkgmkimage
- role: build-dependency
uid: optprintexcpt
- role: build-dependency
diff --git a/spec/build/bsps/optpkgmkimage.yml b/spec/build/bsps/optpkgmkimage.yml
new file mode 100644
index 0000000000..00d9a0171f
--- /dev/null
+++ b/spec/build/bsps/optpkgmkimage.yml
@@ -0,0 +1,19 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+actions:
+- get-string: null
+- substitute: null
+- env-assign: null
+build-type: option
+copyrights:
+- Copyright (C) 2024 embedded brains GmbH & Co. KG
+default:
+- enabled-by: HAVE_MKIMAGE
+ value: $${prefix}/bin/rtems-mkimage-${ARCH}-${BSP_NAME}.py
+- enabled-by: true
+ value: 'false'
+description: ''
+enabled-by: true
+format: '{}'
+links: []
+name: PKGCONFIG_MKIMAGE
+type: build
diff --git a/spec/build/bsps/pkgconfig.yml b/spec/build/bsps/pkgconfig.yml
index afaffbbf0f..e1cdc9a70e 100644
--- a/spec/build/bsps/pkgconfig.yml
+++ b/spec/build/bsps/pkgconfig.yml
@@ -20,6 +20,7 @@ content: |
RTEMS_MAJOR=${__RTEMS_MAJOR__}
RTEMS_MINOR=${__RTEMS_MINOR__}
RTEMS_REVISION=${__RTEMS_REVISION__}
+ RTEMS_MKIMAGE=${PKGCONFIG_MKIMAGE}
Name: ${ARCH}-rtems${__RTEMS_MAJOR__}-${BSP_NAME}
Version: ${RTEMS_VERSION}
diff --git a/spec/build/cpukit/cpuopts.yml b/spec/build/cpukit/cpuopts.yml
index 1d28ace552..bdf8fc2f66 100644
--- a/spec/build/cpukit/cpuopts.yml
+++ b/spec/build/cpukit/cpuopts.yml
@@ -75,6 +75,10 @@ links:
uid: optcoverageldflags
- role: build-dependency
uid: optnocoverageldflags
+- role: build-dependency
+ uid: optbootimageext
+- role: build-dependency
+ uid: optbuildbootimages
- role: build-dependency
uid: optversion
target: cpukit/include/rtems/score/cpuopts.h
diff --git a/spec/build/cpukit/optbootimageext.yml b/spec/build/cpukit/optbootimageext.yml
new file mode 100644
index 0000000000..c9347ffba8
--- /dev/null
+++ b/spec/build/cpukit/optbootimageext.yml
@@ -0,0 +1,17 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+actions:
+- get-string: null
+- env-assign: null
+build-type: option
+copyrights:
+- Copyright (C) 2024 embedded brains GmbH & Co. KG
+default:
+- enabled-by: true
+ value: .img
+description: |
+ Defines the file extension of boot images.
+enabled-by: true
+format: '{}'
+links: []
+name: BOOT_IMAGE_EXTENSION
+type: build
diff --git a/spec/build/cpukit/optbuildbootimages.yml b/spec/build/cpukit/optbuildbootimages.yml
new file mode 100644
index 0000000000..12328b006d
--- /dev/null
+++ b/spec/build/cpukit/optbuildbootimages.yml
@@ -0,0 +1,16 @@
+SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
+actions:
+- get-boolean: null
+- env-enable: null
+build-type: option
+copyrights:
+- Copyright (C) 2024 embedded brains GmbH & Co. KG
+default:
+- enabled-by: true
+ value: false
+description: |
+ If this option is enabled, then boot images for the test programs are built.
+enabled-by: true
+links: []
+name: BUILD_BOOT_IMAGES
+type: build
diff --git a/wscript b/wscript
index e43ae8ba3e..c6cfad147a 100755
--- a/wscript
+++ b/wscript
@@ -197,6 +197,15 @@ def make_tar_info_reproducible(info):
return info
+def make_image(bld, target):
+ if not target.endswith(".norun.exe"):
+ if bld.env.BUILD_TOOL_MKIMAGE:
+ image = os.path.splitext(target)[0] + bld.env.BOOT_IMAGE_EXTENSION
+ bld(rule="${BUILD_TOOL_MKIMAGE} ${SRC} ${TGT}",
+ source=target,
+ target=image)
+
+
class Item(object):
def __init__(self, uid, data):
@@ -590,6 +599,30 @@ class ConfigFileItem(Item):
self.install_target(bld)
+class MakeImageItem(Item):
+
+ def __init__(self, uid, data):
+ super(MakeImageItem, self).__init__(uid, data)
+
+ def do_configure(self, conf, cic):
+ content = self.substitute(conf, self.data["content"])
+ f = conf.bldnode.make_node(conf.env.VARIANT + "/bin/mkimage.py")
+ f.parent.mkdir()
+ f.write(content)
+ # 493 == 0755
+ f.chmod(493)
+ file_path = f.abspath()
+ conf.env.BUILD_TOOL_MKIMAGE = file_path
+ conf.env.append_value("cfg_files", file_path)
+ conf.env.append_value("ENABLE", "HAVE_MKIMAGE")
+
+ def do_build(self, bld, bic):
+ bld.install_as("${PREFIX}/bin/rtems-mkimage-" + bld.env.ARCH + "-" +
+ bld.env.BSP_NAME + ".py",
+ "bin/mkimage.py",
+ chmod=493)
+
+
class ConfigHeaderItem(Item):
def __init__(self, uid, data):
@@ -745,6 +778,7 @@ class TestProgramItem(Item):
)
def do_build(self, bld, bic):
+ target = self.get(bld, "target")
bld(
cflags=bic.cflags,
cppflags=bic.cppflags,
@@ -756,9 +790,10 @@ class TestProgramItem(Item):
source=self.data["source"],
start_files=True,
stlib=self.data["stlib"],
- target=self.get(bld, "target"),
+ target=target,
use=bic.objects + bic.use,
)
+ make_image(bld, target)
class AdaTestProgramItem(TestProgramItem):
@@ -770,14 +805,16 @@ class AdaTestProgramItem(TestProgramItem):
objs = []
for s in self.data["source"]:
objs.append(self.cc(bld, bic, s))
+ target = self.get(bld, "target")
self.gnatmake(
bld,
bic,
self.data["ada-object-directory"],
objs,
self.data["ada-main"],
- self.data["target"],
+ target,
)
+ make_image(bld, target)
class OptionItem(Item):
@@ -1161,6 +1198,9 @@ class ScriptItem(Item):
script = self.data["do-build"]
if script:
exec(script)
+ target = self.data.get("target", None)
+ if target is not None:
+ make_image(bld, self.substitute(bld, target))
class ConfigItemContext(object):
@@ -1284,6 +1324,7 @@ def load_items(ctx, specs):
"test-program": TestProgramItem,
"group": GroupItem,
"library": LibraryItem,
+ "mkimage": MakeImageItem,
"objects": ObjectsItem,
"option": OptionItem,
"script": ScriptItem,
--
2.35.3
More information about the devel
mailing list