zephyr: port build system to CMake
Convert the Zephyr build to the new CMake-based sytem.
Signed-off-by: Marti Bolivar <marti@opensourcefoundries.com>
diff --git a/samples/zephyr/Makefile b/samples/zephyr/Makefile
index ecfd4b4..8d55e30 100644
--- a/samples/zephyr/Makefile
+++ b/samples/zephyr/Makefile
@@ -2,6 +2,7 @@
# Sample multi-part application Makefile
#
# Copyright (c) 2017 Linaro Limited
+# Copyright (c) 2017 Open Source Foundries Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -47,12 +48,12 @@
# then revert back to the first app, since we did not mark this image
# as good.
-BOARD ?=
-
-# We can override the Zephyr configuration for the bootloader by
+# We can add on to the CMake configuration for the bootloader by
# setting this.
BOOTLOADER_CONFIG ?=
+BOARD ?= frdm_k64f
+
.PHONY: check boot hello1 clean_boot clean_hello1 \
hello2 clean_hello2 flash_boot flash_hello1 flash_hello2
@@ -76,15 +77,21 @@
ASSEMBLE = ../../scripts/assemble.py
PYOCD_FLASHTOOL = pyocd-flashtool
+SOURCE_DIRECTORY := $(CURDIR)
+BUILD_DIRECTORY := $(CURDIR)/build/$(BOARD)
+BUILD_DIR_BOOT := $(BUILD_DIRECTORY)/mcuboot
+BUILD_DIR_HELLO1 := $(BUILD_DIRECTORY)/hello1
+BUILD_DIR_HELLO2 := $(BUILD_DIRECTORY)/hello2
+
help:
@echo "make <target> BOARD=<board>"
@echo "<target>: all, boot, hello1, full.bin"
- @echo "<board>: frdm_k64f, 96b_carbon, etc."
+ @echo "<board>: frdm_k64f only for now"
all: boot hello1 hello2
full.bin: boot hello1 hello2
- $(ASSEMBLE) -b ../../outdir/$(BOARD) \
+ $(ASSEMBLE) -b $(BUILD_DIR_BOOT) \
-p signed-hello1.bin \
-s signed-hello2.bin \
-o full.bin
@@ -96,26 +103,38 @@
boot: check
@rm -f mcuboot.bin
- $(MAKE) -C ../.. BOARD=$(BOARD) -j$(nproc) $(BOOTLOADER_CONFIG)
- cp ../../outdir/$(BOARD)/zephyr.bin mcuboot.bin
+ (mkdir -p $(BUILD_DIR_BOOT) && \
+ cd $(BUILD_DIR_BOOT) && \
+ cmake $(BOOTLOADER_CONFIG) \
+ -G"Unix Makefiles" \
+ -DBOARD=$(BOARD) \
+ $(SOURCE_DIRECTORY)/../../boot/zephyr && \
+ make -j$(nproc))
+ cp $(BUILD_DIR_BOOT)/zephyr/zephyr.bin mcuboot.bin
clean_boot: check
- rm -rf ../../outdir/$(BOARD)
+ rm -rf $(BUILD_DIR_BOOT)
# Build and sign "hello1".
hello1: check
- $(MAKE) -C hello-world FROM_WHO="hello1" O=outdir/hello1/$(BOARD) BOARD=$(BOARD) -j$(nproc)
+ (mkdir -p $(BUILD_DIR_HELLO1) && \
+ cd $(BUILD_DIR_HELLO1) && \
+ cmake -DFROM_WHO=hello1 \
+ -G"Unix Makefiles" \
+ -DBOARD=$(BOARD) \
+ $(SOURCE_DIRECTORY)/hello-world && \
+ make -j$(nproc))
$(IMGTOOL) sign \
--key $(SIGNING_KEY) \
--header-size $(BOOT_HEADER_LEN) \
--align $(FLASH_ALIGNMENT) \
--version 1.2 \
--included-header \
- hello-world/outdir/hello1/$(BOARD)/zephyr.bin \
+ $(BUILD_DIR_HELLO1)/zephyr/zephyr.bin \
signed-hello1.bin
clean_hello1: check
- rm -rf hello-world/outdir/hello1/$(BOARD)
+ rm -rf $(BUILD_DIR_HELLO1)
# Build and sign "hello2".
# This is the same signing command as above, except that it adds the
@@ -123,7 +142,13 @@
# this image is intended to be an upgrade. It should be flashed into
# slot1 instead of slot0.
hello2: check
- $(MAKE) -C hello-world FROM_WHO="hello2" O=outdir/hello2/$(BOARD) BOARD=$(BOARD) -j$(nproc)
+ (mkdir -p $(BUILD_DIR_HELLO2) && \
+ cd $(BUILD_DIR_HELLO2) && \
+ cmake -DFROM_WHO=hello2 \
+ -G"Unix Makefiles" \
+ -DBOARD=$(BOARD) \
+ $(SOURCE_DIRECTORY)/hello-world && \
+ make -j$(nproc))
$(IMGTOOL) sign \
--key $(SIGNING_KEY) \
--header-size $(BOOT_HEADER_LEN) \
@@ -131,11 +156,11 @@
--version 1.2 \
--included-header \
--pad 0x60000 \
- hello-world/outdir/hello2/$(BOARD)/zephyr.bin \
+ $(BUILD_DIR_HELLO2)/zephyr/zephyr.bin \
signed-hello2.bin
clean_hello2: check
- rm -rf hello-world/outdir/hello2/$(BOARD)
+ rm -rf $(BUILD_DIR_HELLO2)
# These flash_* targets use pyocd to flash the images. The addresses
# are hardcoded at this time.
@@ -161,28 +186,21 @@
# flash_hello1: hello1 runs
# flash_hello2: hello2 runs
# reset: hello1 runs
-test-good-rsa:
+test-good-rsa: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- clean
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- all
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=RSA" \
+ all
# Test a good image, with a good upgrade, using ECDSA signatures.
# flash_boot: Unable to find bootable image
# flash_hello1: hello1 runs
# flash_hello2: hello2 runs
# reset: hello1 runs
-test-good-ecdsa:
+test-good-ecdsa: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=../../root-ec-p256.pem \
- clean
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=../../root-ec-p256.pem \
- all
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=ECDSA_P256" \
+ SIGNING_KEY=../../root-ec-p256.pem \
+ all
# Test (with RSA) that overwrite-only works. This should boot,
# upgrade correctly, but not revert once the upgrade has been done.
@@ -190,13 +208,10 @@
# flash_hello1: hello1 runs
# flash_hello2: hello2 runs
# reset: hello2 runs
-test-overwrite:
+test-overwrite: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_UPGRADE_ONLY=YES" \
- clean
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_UPGRADE_ONLY=YES" \
- all
+ BOOTLOADER_CONFIG="-DCONF_UPGRADE_ONLY=YES" \
+ all
# Test that when configured for RSA, a wrong signature in the upgrade
# image will fail to upgrade.
@@ -204,17 +219,14 @@
# flash_hello1: hello1 runs
# flash_hello2: hello1 runs
# reset: hello1 runs
-test-bad-rsa-upgrade:
+test-bad-rsa-upgrade: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- clean
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=RSA" \
+ boot hello1
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- boot hello1
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- SIGNING_KEY=../../root-ec-p256.pem \
- hello2
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=RSA" \
+ SIGNING_KEY=../../root-ec-p256.pem \
+ hello2
# Test that when configured for ECDSA, a wrong signature in the upgrade
# image will fail to upgrade.
@@ -222,18 +234,15 @@
# flash_hello1: hello1 runs
# flash_hello2: hello1 runs
# reset: hello1 runs
-test-bad-ecdsa-upgrade:
+test-bad-ecdsa-upgrade: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- clean
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=ECDSA_P256" \
+ SIGNING_KEY=../../root-ec-p256.pem \
+ boot hello1
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=../../root-ec-p256.pem \
- boot hello1
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=../../root-rsa-2048.pem \
- hello2
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=ECDSA_P256" \
+ SIGNING_KEY=../../root-rsa-2048.pem \
+ hello2
# Test that when configured to not validate slot0, we still boot, but
# don't upgrade.
@@ -241,49 +250,40 @@
# flash_hello1: hello1 runs
# flash_hello2: hello1 runs
# reset: hello1 runs
-test-no-bootcheck:
+test-no-bootcheck: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_VALIDATE_SLOT0=NO" \
- clean
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_VALIDATE_SLOT0=NO" \
- SIGNING_KEY=../../root-ec-p256.pem \
- all
+ BOOTLOADER_CONFIG="-DCONF_VALIDATE_SLOT0=NO" \
+ SIGNING_KEY=../../root-ec-p256.pem \
+ all
# Test a good image, with a wrong-signature upgrade, using RSA signatures.
# flash_boot: Unable to find bootable image
# flash_hello1: hello1 runs
# flash_hello2: hello1 runs
# reset: hello1 runs
-test-wrong-rsa:
+test-wrong-rsa: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- clean
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=RSA" \
+ boot hello1
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- boot hello1
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=RSA" \
- SIGNING_KEY=bad-keys/bad-rsa-2048.pem \
- hello2
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=RSA" \
+ SIGNING_KEY=bad-keys/bad-rsa-2048.pem \
+ hello2
# Test a good image, with a wrong-signature upgrade, using ECDSA signatures.
# flash_boot: Unable to find bootable image
# flash_hello1: hello1 runs
# flash_hello2: hello1 runs
# reset: hello1 runs
-test-wrong-ecdsa:
+test-wrong-ecdsa: clean
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- clean
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=ECDSA_P256" \
+ SIGNING_KEY=../../root-ec-p256.pem \
+ boot hello1
$(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=../../root-ec-p256.pem \
- boot hello1
- $(MAKE) \
- BOOTLOADER_CONFIG="CONF_SIGNATURE_TYPE=ECDSA_P256" \
- SIGNING_KEY=bad-keys/bad-ec-p256.pem \
- hello2
+ BOOTLOADER_CONFIG="-DCONF_SIGNATURE_TYPE=ECDSA_P256" \
+ SIGNING_KEY=bad-keys/bad-ec-p256.pem \
+ hello2
check:
@if [ -z "$$ZEPHYR_BASE" ]; then echo "Zephyr environment not set up"; false; fi
diff --git a/samples/zephyr/build-boot.sh b/samples/zephyr/build-boot.sh
index 20e61a0..81691e7 100755
--- a/samples/zephyr/build-boot.sh
+++ b/samples/zephyr/build-boot.sh
@@ -19,4 +19,4 @@
die "Please set BOARD to a valid board before running this script."
fi
-make -C ../.. BOARD=${BOARD} -j$(nproc) || die "Build mcuboot"
+make BOARD=${BOARD} -j$(nproc) boot || die "Build mcuboot"
diff --git a/samples/zephyr/build-hello.sh b/samples/zephyr/build-hello.sh
index d8a3af4..6920f32 100755
--- a/samples/zephyr/build-hello.sh
+++ b/samples/zephyr/build-hello.sh
@@ -19,4 +19,4 @@
die "Please set BOARD to a valid board before running this script."
fi
-make -C hello1 BOARD=${BOARD} -j$(nproc) || die "Build hello1"
+make BOARD=${BOARD} -j$(nproc) hello1 || die "Build hello1"
diff --git a/samples/zephyr/hello-world/CMakeLists.txt b/samples/zephyr/hello-world/CMakeLists.txt
new file mode 100644
index 0000000..d4ef940
--- /dev/null
+++ b/samples/zephyr/hello-world/CMakeLists.txt
@@ -0,0 +1,52 @@
+# Top-level CMakeLists.txt for the skeleton application.
+#
+# Copyright (c) 2017 Open Source Foundries Limited
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# This provides a basic application structure suitable for loading by
+# mcuboot, which is easy to customize on a per-board basis. It can be
+# used as a starting point for new applications.
+
+# The board should be set to a supported target. The default is
+# frdm_k64f.
+if (NOT DEFINED BOARD)
+ set(BOARD frdm_k64f)
+endif()
+
+# The default top-level application configuration is prj.conf.
+# You can place additional board-specific files in boards/${BOARD}.conf,
+# and they will be merged into the configuration along with prj.conf.
+macro(set_conf_file)
+ if(EXISTS ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf)
+ set(CONF_FILE "prj.conf ${APPLICATION_SOURCE_DIR}/boards/${BOARD}.conf")
+ else()
+ set(CONF_FILE "prj.conf")
+ endif()
+endmacro()
+
+# Zephyr uses Device Tree (DT) to describe some board hardware
+# configuration.
+#
+# For this simple example, all we need to tell DT is where on the chip
+# flash to link this application image so mcuboot can find it. We do
+# this with a device tree overlay file.
+#
+# See the Zephyr documentation for more information on DT:
+# https://www.zephyrproject.org/doc/dts/device_tree.html
+set(DTC_OVERLAY_FILE "${CMAKE_CURRENT_SOURCE_DIR}/dts.overlay")
+
+# Standard Zephyr application boilerplate.
+include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
+project(NONE)
+
+assert_exists(DTC_OVERLAY_FILE)
+
+# This string ends up getting printed in the device console
+if (NOT DEFINED FROM_WHO)
+ set(FROM_WHO Zephyr)
+endif()
+
+target_compile_definitions(app PRIVATE "-DMCUBOOT_HELLO_WORLD_FROM=\"${FROM_WHO}\"")
+
+target_sources(app PRIVATE src/main.c)
diff --git a/samples/zephyr/hello-world/Makefile b/samples/zephyr/hello-world/Makefile
deleted file mode 100644
index 15176e0..0000000
--- a/samples/zephyr/hello-world/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-# Top-level Makefile for the skeleton application.
-#
-# This provides a basic application structure suitable for loading by
-# mcuboot, which is easy to customize on a per-board basis. It can be
-# used as a starting point for new applications.
-
-# The default board is FRDM-K64F. This can be overridden at
-# the command line for other boards supported by Zephyr.
-BOARD ?= frdm_k64f
-# The top-level application configuration is prj.conf. This can also
-# be overridden at the command line if you add another one.
-CONF_FILE ?= prj.conf
-
-# This will merge any board-specific extras from boards/$(BOARD).conf
-# into the configuration.
-CONF_FILE += $(wildcard boards/$(BOARD).conf)
-# These additional "local" files, if present, will be merged in as
-# well, but they are ignored by Git.
-CONF_FILE += $(wildcard local.conf) $(wildcard boards/$(BOARD)-local.conf)
-
-# Zephyr uses Device Tree (DT) to describe some board hardware
-# configuration.
-#
-# For this simple example, all we need to tell DT is where on the chip
-# flash to link this application image so mcuboot can find it. We do
-# this with a device tree overlay file.
-#
-# See the Zephyr documentation for more information on DT:
-# https://www.zephyrproject.org/doc/dts/device_tree.html
-DTC_OVERLAY_FILE := $(CURDIR)/dts.overlay
-export DTC_OVERLAY_FILE
-# If you want to do your DT overlay on a per-board basis (say, if you
-# need to support multiple different boards, each of which needs
-# slightly different DT overlays), then comment the above lines and
-# uncomment the following ones. You can then add board-specific
-# overlay files named boards/$(BOARD).overlay.
-#
-# DTC_OVERLAY_DIR := $(CURDIR)/boards
-# export DTC_OVERLAY_DIR
-
-# This string ends up getting printed in the device console
-FROM_WHO ?= "Zephyr"
-CFLAGS += -DMCUBOOT_HELLO_WORLD_FROM=\"$(FROM_WHO)\"
-
-# The Zephyr Makefiles do the rest.
-include $(ZEPHYR_BASE)/Makefile.inc
diff --git a/samples/zephyr/hello-world/boards/README.rst b/samples/zephyr/hello-world/boards/README.rst
index 1715f42..efa236d 100644
--- a/samples/zephyr/hello-world/boards/README.rst
+++ b/samples/zephyr/hello-world/boards/README.rst
@@ -1,2 +1,2 @@
You can place per-board configuration and device tree overlays
-here. See the comments in the Makefile for more information.
+here. See the comments in the CMakeLists.txt for more information.
diff --git a/samples/zephyr/hello-world/prj.conf b/samples/zephyr/hello-world/prj.conf
index 193c611..f9137cd 100644
--- a/samples/zephyr/hello-world/prj.conf
+++ b/samples/zephyr/hello-world/prj.conf
@@ -2,6 +2,10 @@
CONFIG_BOOT_BANNER=y
CONFIG_BUILD_TIMESTAMP=y
+# Enable console and printk()
+CONFIG_PRINTK=y
+CONFIG_STDOUT_CONSOLE=y
+
# TEXT_SECTION_OFFSET is used to leave space in the binary for the
# mcuboot header.
#