| # 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_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 | |
| # 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=${PLATFORM} \ | |
| ${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=${PLATFORM} \ | |
| ${CHERIOT_RELEASE_CONFIG_OPTIONS} && \ | |
| xmake build | |
| ## Generates CHERIoT build artifacts setup for release | |
| cheriot-bundle-release: $(CHERIOT_FIRMWARE_RELEASE) | |
| ## 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-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) |