| # 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 Cantrip, the seL4-based operating system with a Rust-based userland. |
| # The source is in $(CANTRIP_SRC_DIR), while the outputs are placed in |
| # $(CANTRIP_KERNEL_DEBUG) & $(CANTRIP_ROOTSERVER_DEBUG) or |
| # $(CANTRIP_KERNEL_RELEASE) & $(CANTRIP_ROOTSERVER_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. |
| |
| # NB: see $(CANTRIP_SRC_DIR)/easy-settings.cmake for config knobs; |
| # but beware you may need to "clean" before building with changes |
| |
| CANTRIP_SRC_DIR := $(ROOTDIR)/cantrip/projects/cantrip |
| CANTRIP_COMPONENTS := $(CANTRIP_SRC_DIR)/apps/system/components |
| CARGO_CMD := cargo +$(CANTRIP_RUST_VERSION) |
| |
| # Location of seL4 kernel source (for sel4-sys) |
| SEL4_KERNEL_DIR := $(ROOTDIR)/cantrip/kernel |
| |
| # CANTRIP_OUT_DIR is defined in build/setup.sh |
| CANTRIP_OUT_DEBUG := $(CANTRIP_OUT_DIR)/debug |
| CANTRIP_OUT_RELEASE := $(CANTRIP_OUT_DIR)/release |
| |
| # seL4 kernel included in the ext flash tarball |
| CANTRIP_KERNEL_DEBUG := $(CANTRIP_OUT_DEBUG)/kernel/kernel.elf |
| CANTRIP_KERNEL_RELEASE := $(CANTRIP_OUT_RELEASE)/kernel/kernel.elf |
| |
| # Rootserver image that has the CAmkES components embedded in |
| # the ELF image in a ._archive_cpio section. |
| CANTRIP_ROOTSERVER_DEBUG := $(CANTRIP_OUT_DEBUG)/capdl-loader |
| CANTRIP_ROOTSERVER_RELEASE := $(CANTRIP_OUT_RELEASE)/capdl-loader |
| |
| CANTRIP_SOURCES := $(shell find $(ROOTDIR)/cantrip \(\ |
| -name \*.rs -or \ |
| -name \*.c -or \ |
| -name \*.h -or \ |
| -name \*.cpp \ |
| \) -type f) |
| |
| # Platform-specific aggregate targets |
| |
| ## Builds auto-generated include files for the Cantrip operating 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 |
| cantrip-gen-headers:: |
| |
| ## Cleans the auto-generated Cantrip include files |
| # |
| # Note: this is a platform-specific aggregate phony target, and additional rules |
| # for each platform are defined in build/$PLATFORM/platform.mk |
| cantrip-clean-headers:: |
| rm -rf $(OUT)/cantrip/components |
| |
| ## Cantrip 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 |
| cantrip-build-debug-prepare:: | $(CANTRIP_OUT_DEBUG) |
| |
| ## Cantrip 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 |
| cantrip-build-release-prepare:: | $(CANTRIP_OUT_RELEASE) |
| |
| # Cantrip-generic targets |
| |
| ## Cleans all Cantrip operating system build artifacts for the current platform |
| # TODO(sleffler): cantrip-clean-headers once they are per-platform |
| cantrip-clean: |
| rm -rf $(CANTRIP_OUT_DIR) |
| |
| $(OUT)/cantrip/components: |
| mkdir -p $(OUT)/cantrip/components |
| |
| $(CANTRIP_OUT_DEBUG): |
| mkdir -p $(CANTRIP_OUT_DEBUG) |
| |
| $(CANTRIP_OUT_RELEASE): |
| mkdir -p $(CANTRIP_OUT_RELEASE) |
| |
| # Build Cantrip bundles. A bundle is an seL4 kernel elf plus the user space |
| # bits: rootserver + CAmkES components (embedded in the rootserver elf). |
| # Crates that depend on the kernel check the SEL4_OUT_DIR environment |
| # variable for the location of the files generated for the kernel. |
| # We also pass SEL4_DIR in the environment; though the default logic |
| # in crates that use sel4-config can calculate this if SEL4_DIR is |
| # not defined. |
| # |
| # NB: files generated by cantrip-gen-headers are shared so we craft |
| # a symlink in the target-specific build directories |
| |
| $(CANTRIP_KERNEL_DEBUG): $(CANTRIP_SOURCES) cantrip-gen-headers cantrip-build-debug-prepare | $(CANTRIP_OUT_DEBUG) rust_presence_check |
| cmake -B $(CANTRIP_OUT_DEBUG) -G Ninja \ |
| -DCROSS_COMPILER_PREFIX=$(C_PREFIX) \ |
| -DRUST_TARGET=${RUST_TARGET} \ |
| -DPLATFORM=${PLATFORM} \ |
| -DSIMULATION=0 \ |
| -DSEL4_CACHE_DIR=$(CACHE)/sel4-debug \ |
| -DRELEASE=OFF \ |
| -DRUST_GLOBAL_FEATURES="${CANTRIP_GLOBAL_FEATURES_DEBUG}" \ |
| -DCMAKE_C_FLAGS_DEBUG=-g \ |
| ${CANTRIP_EXTRA_CMAKE_OPTS_DEBUG} \ |
| $(CANTRIP_SRC_DIR) |
| # NB: ninja builds may require env vars set elsewhere, typically in |
| # platforms/${PLATFORM}/setup.sh. |
| SEL4_DIR=$(SEL4_KERNEL_DIR) \ |
| SEL4_OUT_DIR=$(CANTRIP_OUT_DEBUG)/kernel \ |
| ninja -C $(CANTRIP_OUT_DEBUG) |
| |
| ## Generates Cantrip operating build artifacts with debugging suport |
| cantrip-bundle-debug: $(CANTRIP_KERNEL_DEBUG) |
| |
| $(CANTRIP_KERNEL_RELEASE): $(CANTRIP_SOURCES) cantrip-gen-headers cantrip-build-release-prepare | $(CANTRIP_OUT_RELEASE) rust_presence_check |
| cmake -B $(CANTRIP_OUT_RELEASE) -G Ninja \ |
| -DCROSS_COMPILER_PREFIX=$(C_PREFIX) \ |
| -DRUST_TARGET=${RUST_TARGET} \ |
| -DPLATFORM=${PLATFORM} \ |
| -DSIMULATION=0 \ |
| -DSEL4_CACHE_DIR=$(CACHE)/sel4-release \ |
| -DRELEASE=ON \ |
| -DRUST_GLOBAL_FEATURES="${CANTRIP_GLOBAL_FEATURES_RELEASE}" \ |
| ${CANTRIP_EXTRA_CMAKE_OPTS_RELEASE} \ |
| $(CANTRIP_SRC_DIR) |
| # NB: ninja builds may require env vars set elsewhere, typically in |
| # platforms/${PLATFORM}/setup.sh. |
| SEL4_DIR=$(SEL4_KERNEL_DIR) \ |
| SEL4_OUT_DIR=$(CANTRIP_OUT_RELEASE)/kernel \ |
| ninja -C $(CANTRIP_OUT_RELEASE) |
| |
| ## Generates Cantrip operating build artifacts setup for release |
| cantrip-bundle-release: $(CANTRIP_KERNEL_RELEASE) |
| |
| ## Generates both debug & release Cantrip operating system build artifacts |
| # |
| # NB: shorthand for testing (sim targets depend on explicit pathnames) |
| cantrip: cantrip-bundle-debug cantrip-bundle-release |
| |
| ## Builds the flatbuffers tooling and libraries |
| cantrip-flatbuffers: $(OUT)/host/flatbuffers/bin/flatc $(ROOTDIR)/sw/cantrip/flatbuffers |
| $(MAKE) -C $(ROOTDIR)/sw/cantrip/flatbuffers \ |
| FLATC=$(OUT)/host/flatbuffers/bin/flatc \ |
| SRC_DIR=$(ROOTDIR)/sw/cantrip/flatbuffers \ |
| TARGET_BASEDIR=$(ROOTDIR) \ |
| all |
| |
| .PHONY:: cantrip cantrip-clean |
| .PHONY:: cantrip-bundle-debug cantrip-bundle-release |
| .PHONY:: cantrip-builtins-debug cantrip-builtins-release |
| .PHONY:: cantrip-gen-headers cantrip-clean-headers |
| .PHONY:: cantrip-flatbuffers |
| .PHONY:: cantrip-build-debug-prepare cantrip-build-release-prepare |
| .PHONY:: $(CANTRIP_OUT_DEBUG) $(CANTRIP_OUT_RELEASE) |