| # Copyright 2024 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. |
| |
| # TODO: might need sail for reference (e.g. for testrig) |
| |
| TOOLCHAIN_CHERIOT_SRC_DIR := $(OUT)/tmp/toolchain/cheriot-llvm-project |
| TOOLCHAIN_CHERIOT_BUILD_DIR := $(OUT)/tmp/toolchain/build_toolchain_cheriot |
| TOOLCHAIN_CHERIOT_OUT_DIR := $(CACHE)/cheriot-tools |
| TOOLCHAIN_CHERIOT_BIN := $(TOOLCHAIN_CHERIOT_OUT_DIR)/bin/llvm-objdump |
| |
| TOOLCHAIN_BUILD_DATE := $(shell date +%Y-%m-%d) |
| |
| toolchain_cheriot_src: |
| if [[ -f "${TOOLCHAIN_CHERIOT_BIN}" ]]; then \ |
| echo "Toolchain exists, run 'm toolchain_cheriot_clean' if you really want to rebuild"; \ |
| else \ |
| "$(ROOTDIR)/scripts/download-toolchain.sh" "$(TOOLCHAIN_CHERIOT_SRC_DIR)" CHERIOT; \ |
| fi |
| |
| $(TOOLCHAIN_CHERIOT_BUILD_DIR): |
| mkdir -p $(TOOLCHAIN_CHERIOT_BUILD_DIR) |
| |
| $(TOOLCHAIN_CHERIOT_BIN): | toolchain_cheriot_src $(TOOLCHAIN_CHERIOT_BUILD_DIR) |
| cmake -B $(TOOLCHAIN_CHERIOT_BUILD_DIR) \ |
| -DCMAKE_INSTALL_PREFIX=$(TOOLCHAIN_CHERIOT_OUT_DIR) \ |
| -DCMAKE_BUILD_TYPE=Release \ |
| -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld" \ |
| -DLLVM_ENABLE_UNWIND_TABLES=NO \ |
| -DLLVM_TARGETS_TO_BUILD=RISCV \ |
| -DLLVM_DISTRIBUTION_COMPONENTS="clang;clangd;lld;llvm-ar;llvm-objdump;llvm-objcopy" \ |
| -G Ninja \ |
| $(TOOLCHAIN_CHERIOT_SRC_DIR)/llvm |
| cmake --build $(TOOLCHAIN_CHERIOT_BUILD_DIR) --target install-distribution |
| cmake --build $(TOOLCHAIN_CHERIOT_BUILD_DIR) --target install-clang-resource-headers |
| cmake --build $(TOOLCHAIN_CHERIOT_BUILD_DIR) --target clean |
| |
| # Copies our baremetal include files into the toolchain. These should be |
| # generated from / by llvm but for now we have hand-crafted files sufficient |
| # to build all the OpenTitan artifacts we need. |
| toolchain_cheriot_includes: |
| cp -p -r ${ROOTDIR}/build/patches/cheriot-llvm/riscv32-unknown-elf ${TOOLCHAIN_CHERIOT_OUT_DIR} |
| |
| $(OUT)/toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz: $(TOOLCHAIN_CHERIOT_BIN) toolchain_cheriot_includes |
| tar -C $(CACHE) -czf \ |
| "$(OUT)/toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz" cheriot-tools |
| cd $(OUT) && sha256sum "toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz" > \ |
| "toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz.sha256sum" |
| @echo "===========================================================" |
| @echo "CHERIoT Toolchain tarball ready at $(OUT)/toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz" |
| @echo "===========================================================" |
| |
| ## Builds CHERIoT LLVM toolchain. |
| # |
| # Note: this actually builds from source, rather than fetching a release |
| # tarball, and is most likely not the target you actually want. |
| # |
| # This target can take hours to build, and results in a tarball and sha256sum |
| # called `out/toolchain_cheriot_<timestamp>.tar.gz` and |
| # `out/toolchain_cheriot_<timestamp>.tar.gz.sha256sum`, ready for |
| # upload. In the process of generating this tarball, this target also builds the |
| # actual tools in `cache/toolchain_cheriot`, so untarring this tarball is |
| # unneccessary. |
| toolchain_cheriot: $(OUT)/toolchain_cheriot_$(TOOLCHAIN_BUILD_DATE).tar.gz |
| |
| ## Removes the CHERIoT toolchain from cache/, forcing a re-fetch if needed. |
| toolchain_cheriot_clean: |
| rm -rf "$(TOOLCHAIN_CHERIOT_OUT_DIR)" "$(TOOLCHAIN_CHERIOT_SRC_DIR)" "$(TOOLCHAIN_CHERIOT_BUILD_DIR)" |
| |
| .PHONY:: toolchain_cheriot |
| .PHONY:: toolchain_cheriot_src |
| .PHONY:: toolchain_cheriot_includes |
| .PHONY:: toolchain_cheriot_clean |