blob: 150fd32826b78761fdb032f9854c8593e3ffed9c [file] [log] [blame]
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Builds CHERIoT firmware.
# The source for cheriot-rtos is in $(CHERIOT_SRC_DIR)
# The source for the application is in $(CHERIOT_FIRMWARE_SRC_DIR), defined
# according to ${CHERIOT_FIRMWARE} in ${PLATFORM}/platform.mk
# The outputs are placed in $(CHERIOT_FIRMWARE_DEBUG) or $(CHERIOT_FIRMWARE_RELEASE)
# Drivers for each platform and platform-specific make targets are stored in
# platform/$PLATFORM/platform.mk make files. Everything in this file must be
# made platform-agnostic. As such, we use phony targets that can be extended in
# the platform.mk files as double-colon (::) aggregate targets. These phony
# targets are explicitly grouped and have notes in their doccomments.
CHERIOT_SRC_DIR := $(ROOTDIR)/sw/cheriot-rtos
# CHERIOT_OUT_DIR is defined in build/setup.sh
CHERIOT_OUT_DEBUG := $(CHERIOT_OUT_DIR)/debug
CHERIOT_OUT_RELEASE := $(CHERIOT_OUT_DIR)/release
CHERIOT_BOARD := ${PLATFORM}
CHERIOT_FIRMWARE_DEBUG := $(CHERIOT_OUT_DEBUG)/cheriot/cheriot/release/${CHERIOT_FIRMWARE}-firmware
# XXX debug builds don't work atm
#CHERIOT_FIRMWARE_DEBUG := $(CHERIOT_OUT_DEBUG)/cheriot/cheriot/debug/${CHERIOT_FIRMWARE}-firmware
CHERIOT_FIRMWARE_RELEASE := $(CHERIOT_OUT_RELEASE)/cheriot/cheriot/release/${CHERIOT_FIRMWARE}-firmware
CHERIOT_TEST := $(CHERIOT_OUT_RELEASE)/cheriot/cheriot/release/test-suite
# TODO: add CHERIOT_FIRMWARE_SRC_DIR (not currently defined in time to use here)
CHERIOT_SOURCES := $(shell find $(CHERIOT_SRC_DIR) \(\
-name \*.rs -or \
-name \*.c -or \
-name \*.h -or \
-name \*.cpp \
\) -type f)
# Platform-specific aggregate targets
## Builds auto-generated include files for the CHERIoT system
#
# In the generic case, this is a noop. But it's an aggregate target,
# so that platform-specific headers may also be generated from other
# parts of the project.
#
# Note: this is a platform-specific aggregate phony target, and additional rules
# for each platform are defined in build/$PLATFORM/platform.mk
cheriot-gen-headers::
## Cleans the auto-generated CHERIoT include files
#
# Note: this is a platform-specific aggregate phony target, and additional rules
# for each platform are defined in build/$PLATFORM/platform.mk
cheriot-clean-headers::
## CHERIoT debug build-tree preparation target
#
# Prepares the output directory tree for building. In the generic case, this
# just makes our target directory tree, but each specific platform may also need
# to link in source files or modify the target tree somewhat. This aggregate
# target provides that functionality for a debug build.
#
# Note: this is a platform-specific aggregate phony target, and additional rules
# for each platform are defined in build/$PLATFORM/platform.mk
cheriot-build-debug-prepare:: | $(CHERIOT_OUT_DEBUG)
## CHERIoT release build-tree preparation target
#
# Prepares the output directory tree for building. In the generic case, this
# just makes our target directory tree, but each specific platform may also need
# to link in source files or modify the target tree somewhat. This aggregate
# target provides that functionality for a release build.
#
# Note: this is a platform-specific aggregate phony target, and additional rules
# for each platform are defined in build/$PLATFORM/platform.mk
cheriot-build-release-prepare:: | $(CHERIOT_OUT_RELEASE)
# CHERIoT-generic targets
## Cleans all CHERIoT build artifacts for the current platform
# TODO(sleffler): cheriot-clean-headers once they are per-platform
cheriot-clean:
rm -rf $(CHERIOT_OUT_DIR)
$(CHERIOT_OUT_DEBUG):
mkdir -p $(CHERIOT_OUT_DEBUG)
$(CHERIOT_OUT_RELEASE):
mkdir -p $(CHERIOT_OUT_RELEASE)
# Update submodules to track any changes in the .gitmodules. Alternatively
# the submodules could be mirrored and spliced by the manifest but any
# pinned sha's would then need to be tracked.
cheriot_check:
echo Updating $(CHERIOT_SRC_DIR) submodules...; \
git -C $(CHERIOT_SRC_DIR) submodule sync && \
git -C $(CHERIOT_SRC_DIR) submodule update --init --jobs=8 --depth=10; \
# Build CHERIoT firmware image.
$(CHERIOT_FIRMWARE_DEBUG): $(CHERIOT_SOURCES) cheriot-gen-headers cheriot-build-debug-prepare | cheriot_check $(CHERIOT_OUT_DEBUG)
export XMAKE_CONFIGDIR=${CHERIOT_OUT_DEBUG}; \
cd ${CHERIOT_FIRMWARE_SRC_DIR} && \
xmake config \
-o ${CHERIOT_OUT_DEBUG} \
--sdk=${ROOTDIR}/cache/cheriot-tools \
--board=${CHERIOT_BOARD} \
${CHERIOT_DEBUG_CONFIG_OPTIONS} && \
xmake build
## Generates CHERIoT build artifacts with debugging suport
cheriot-bundle-debug: $(CHERIOT_FIRMWARE_DEBUG)
$(CHERIOT_FIRMWARE_RELEASE): $(CHERIOT_SOURCES) cheriot-gen-headers cheriot-build-release-prepare | cheriot_check $(CHERIOT_OUT_RELEASE)
export XMAKE_CONFIGDIR=${CHERIOT_OUT_RELEASE}; \
cd ${CHERIOT_FIRMWARE_SRC_DIR} && \
xmake config \
-o ${CHERIOT_OUT_RELEASE} \
--sdk=${ROOTDIR}/cache/cheriot-tools \
--board=${CHERIOT_BOARD} \
${CHERIOT_RELEASE_CONFIG_OPTIONS} && \
xmake build
## Generates CHERIoT build artifacts setup for release
cheriot-bundle-release: $(CHERIOT_FIRMWARE_RELEASE)
## Generates CHERIoT provided test-suite binary
cheriot-test:
${MAKE} \
CHERIOT_BOARD=sail \
CHERIOT_FIRMWARE_SRC_DIR=${CHERIOT_SRC_DIR}/tests \
CHERIOT_FIRMWARE_RELEASE=$(CHERIOT_TEST) \
${CHERIOT_TEST}
## Generates both debug & release CHERIoT build artifacts
cheriot: cheriot-bundle-debug cheriot-bundle-release
.PHONY:: cheriot cheriot_check cheriot-clean
.PHONY:: cheriot-bundle-debug cheriot-bundle-release
.PHONY:: cheriot-test
.PHONY:: cheriot-builtins-debug cheriot-builtins-release
.PHONY:: cheriot-gen-headers cheriot-clean-headers
.PHONY:: cheriot-build-debug-prepare cheriot-build-release-prepare
.PHONY:: $(CHERIOT_OUT_DEBUG) $(CHERIOT_OUT_RELEASE)