blob: 71fd52ba27d95f6698e7a9bbad8fd38427057d35 [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.
TOOLCHAIN_SRC_DIR := $(OUT)/tmp/toolchain/riscv-gnu-toolchain
TOOLCHAIN_BUILD_DIR := $(OUT)/tmp/toolchain/build_toolchain
TOOLCHAIN_OUT_DIR := $(CACHE)/toolchain
TOOLCHAIN_BIN := $(TOOLCHAIN_OUT_DIR)/bin/riscv32-unknown-elf-gdb
TOOLCHAINIREE_SRC_DIR := $(OUT)/tmp/toolchain/riscv-gnu-toolchain_iree
TOOLCHAINIREE_BUILD_DIR := $(OUT)/tmp/toolchain/build_toolchain_iree
TOOLCHAINIREE_OUT_DIR := $(CACHE)/toolchain_iree_rv32imf
TOOLCHAINIREE_BIN := $(TOOLCHAINIREE_OUT_DIR)/bin/riscv32-unknown-elf-gdb
TOOLCHAINLLVM_SRC_DIR := $(OUT)/tmp/toolchain/llvm-project
TOOLCHAINLLVM_BUILD_DIR := $(OUT)/tmp/toolchain/build_toolchain_llvm
TOOLCHAINLLVM_BIN := $(TOOLCHAINIREE_OUT_DIR)/bin/clang
TOOLCHAIN_KELVIN_SRC_DIR := $(OUT)/tmp/toolchain/riscv-gnu-toolchain_kelvin
TOOLCHAIN_KELVIN_BUILD_DIR := $(OUT)/tmp/toolchain/build_toolchain_kelvin
TOOLCHAIN_KELVIN_OUT_DIR := $(CACHE)/toolchain_kelvin
TOOLCHAIN_KELVIN_BIN := $(TOOLCHAIN_KELVIN_OUT_DIR)/bin/riscv32-unknown-elf-gdb
TOOLCHAIN_BUILD_DATE := $(shell date +%Y-%m-%d)
toolchain_src:
if [[ -f "${TOOLCHAIN_BIN}" ]]; then \
echo "Toolchain exists, run 'm toolchain_clean' if you really want to rebuild"; \
else \
$(ROOTDIR)/scripts/download-toolchain.sh $(TOOLCHAIN_SRC_DIR); \
fi
$(TOOLCHAIN_BUILD_DIR):
mkdir -p $(TOOLCHAIN_BUILD_DIR)
# Note the make is purposely launched with high job counts, so we can build it
# faster with a powerful machine (e.g. CI).
$(TOOLCHAIN_BIN): | toolchain_src $(TOOLCHAIN_BUILD_DIR)
cd $(TOOLCHAIN_BUILD_DIR) && $(TOOLCHAIN_SRC_DIR)/configure \
--srcdir=$(TOOLCHAIN_SRC_DIR) \
--prefix=$(TOOLCHAIN_OUT_DIR) \
--with-arch=rv32imac \
--with-abi=ilp32
$(MAKE) -C $(TOOLCHAIN_BUILD_DIR) newlib \
GDB_TARGET_FLAGS="--with-expat=yes --with-python=python3.11"
$(MAKE) -C $(TOOLCHAIN_BUILD_DIR) clean
$(OUT)/toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz: $(TOOLCHAIN_BIN)
tar -C $(CACHE) -czf \
"$(OUT)/toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz" toolchain
cd $(OUT) && sha256sum "toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz" > \
"toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz.sha256sum"
@echo "==========================================================="
@echo "Toolchain tarball ready at $(OUT)/toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz"
@echo "==========================================================="
## Builds the GCC toolchain for the security core and SMC.
#
# 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_<timestamp>.tar.gz` and
# `out/toolchain_<timestamp>.tar.gz.sha256sum`, ready for
# upload. In the process of generating this tarball, this target also builds the
# actual tools in `cache/toolchain`, so untarring this tarball is
# unneccessary.
toolchain: $(OUT)/toolchain_$(TOOLCHAIN_BUILD_DATE).tar.gz
## Cleans up the toolchain from the cache directory
#
# Generally not needed to be run unless something has changed or broken in the
# caching mechanisms built into the build system.
toolchain_clean:
rm -rf "$(TOOLCHAIN_OUT_DIR)" "$(TOOLCHAIN_SRC_DIR)" "$(TOOLCHAIN_BUILD_DIR)"
toolchain_src_llvm:
if [[ -f "${TOOLCHAINLLVM_BIN}" ]]; then \
echo "Toolchain for LLVM exists, run 'm toolchain_llvm_clean' if you really want to rebuild"; \
else \
$(ROOTDIR)/scripts/download-toolchain.sh $(TOOLCHAINIREE_SRC_DIR) "LLVM"; \
fi
# IREE toolchain
$(TOOLCHAINIREE_BUILD_DIR):
mkdir -p $(TOOLCHAINIREE_BUILD_DIR)
# Note the make is purposely launched with high job counts, so we can build it
# faster with a powerful machine (e.g. CI).
$(TOOLCHAINIREE_BIN): | toolchain_src_llvm $(TOOLCHAINIREE_BUILD_DIR)
cd $(TOOLCHAINIREE_BUILD_DIR) && $(TOOLCHAINIREE_SRC_DIR)/configure \
--srcdir=$(TOOLCHAINIREE_SRC_DIR) \
--prefix=$(TOOLCHAINIREE_OUT_DIR) \
--with-arch=rv32i2p0mf2p0 \
--with-abi=ilp32 \
--with-cmodel=medany
$(MAKE) -C $(TOOLCHAINIREE_BUILD_DIR) newlib \
GDB_TARGET_FLAGS="--with-expat=yes --with-python=python3.11"
$(MAKE) -C $(TOOLCHAINIREE_BUILD_DIR) clean
# Build with 32-bit baremetal config.
$(TOOLCHAINLLVM_BIN): $(TOOLCHAINIREE_BIN)
cmake -B $(TOOLCHAINLLVM_BUILD_DIR) \
-DCMAKE_INSTALL_PREFIX=$(TOOLCHAINIREE_OUT_DIR) \
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_TARGETS_TO_BUILD="RISCV" \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_DEFAULT_TARGET_TRIPLE="riscv32-unknown-elf" \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=On \
-DDEFAULT_SYSROOT=../riscv32-unknown-elf \
-G Ninja \
$(TOOLCHAINLLVM_SRC_DIR)/llvm
cmake --build $(TOOLCHAINLLVM_BUILD_DIR) --target install
cmake --build $(TOOLCHAINLLVM_BUILD_DIR) --target clean
# Prepare a newlib-nano directory for the default link of -lc, -lgloss, etc.
mkdir -p "$(TOOLCHAINIREE_OUT_DIR)/riscv32-unknown-elf/lib/newlib-nano"
cd "$(TOOLCHAINIREE_OUT_DIR)/riscv32-unknown-elf/lib/newlib-nano" && ln -sf ../libc_nano.a libc.a
cd "$(TOOLCHAINIREE_OUT_DIR)/riscv32-unknown-elf/lib/newlib-nano" && ln -sf ../libg_nano.a libg.a
cd "$(TOOLCHAINIREE_OUT_DIR)/riscv32-unknown-elf/lib/newlib-nano" && ln -sf ../libm_nano.a libm.a
cd "$(TOOLCHAINIREE_OUT_DIR)/riscv32-unknown-elf/lib/newlib-nano" && ln -sf ../libgloss_nano.a libgloss.a
$(OUT)/toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz: $(TOOLCHAINLLVM_BIN)
tar -C $(CACHE) -czf \
"$(OUT)/toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz" toolchain_iree_rv32imf
cd $(OUT) && sha256sum "toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz" > \
"toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz.sha256sum"
@echo "==========================================================="
@echo "Toolchain tarball ready at $(OUT)/toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz"
@echo "==========================================================="
## Builds the LLVM toolchain for the vector core.
#
# 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_iree_rv32_<timestamp>.tar.gz` and
# `out/toolchain_iree_rv32_<timestamp>.tar.gz.sha256sum`, ready for upload.
# In the process of generating this tarball, this target also builds the actual
# tools in `cache/toolchain_iree_rv32imf`, so untarring this tarball is
# unneccessary.
toolchain_llvm: $(OUT)/toolchain_iree_rv32_$(TOOLCHAIN_BUILD_DATE).tar.gz
## Removes the IREE RV32IMF toolchain from cache/, forcing a re-fetch if needed.
toolchain_llvm_clean:
rm -rf $(TOOLCHAINIREE_OUT_DIR) $(OUT)/tmp/toolchain
toolchain_kelvin_src:
if [[ -f "${TOOLCHAIN_KELVIN_BIN}" ]]; then \
echo "Toolchain exists, run 'm toolchain_kelvin_clean' if you really want to rebuild"; \
else \
"$(ROOTDIR)/scripts/download-toolchain.sh" "$(TOOLCHAIN_KELVIN_SRC_DIR)" KELVIN; \
fi
$(TOOLCHAIN_KELVIN_BUILD_DIR):
mkdir -p $(TOOLCHAIN_KELVIN_BUILD_DIR)
# Note it does not support python GDB, for we can't support CentOS7 (EDACloud)
# properly.
# Also pin the i ISA version to 2.1
$(TOOLCHAIN_KELVIN_BIN): | toolchain_kelvin_src $(TOOLCHAIN_KELVIN_BUILD_DIR)
cd $(TOOLCHAIN_KELVIN_BUILD_DIR) && $(TOOLCHAIN_KELVIN_SRC_DIR)/configure \
--srcdir=$(TOOLCHAIN_KELVIN_SRC_DIR) \
--prefix=$(TOOLCHAIN_KELVIN_OUT_DIR) \
--with-arch=rv32i2p1m_zicsr_zifencei_zbb \
--with-abi=ilp32
# binutil_2.40 has special doc targets for gas/doc/asconfig.texi. Need to patch the
# configured Makefile.
./scripts/update-toolchain-makefile.sh "$(TOOLCHAIN_KELVIN_BUILD_DIR)/Makefile"
$(MAKE) -C $(TOOLCHAIN_KELVIN_BUILD_DIR)
$(MAKE) -C $(TOOLCHAIN_KELVIN_BUILD_DIR) clean
$(OUT)/toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz: $(TOOLCHAIN_KELVIN_BIN)
tar -C $(CACHE) -czf \
"$(OUT)/toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz" toolchain_kelvin
cd $(OUT) && sha256sum "toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz" > \
"toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz.sha256sum"
@echo "==========================================================="
@echo "Kelvin Toolchain tarball ready at $(OUT)/toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz"
@echo "==========================================================="
## Builds Kelvin GCC 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_kelvin_<timestamp>.tar.gz` and
# `out/toolchain_kelvin_<timestamp>.tar.gz.sha256sum`, ready for
# upload. In the process of generating this tarball, this target also builds the
# actual tools in `cache/toolchain_kelvin`, so untarring this tarball is
# unneccessary.
toolchain_kelvin: $(OUT)/toolchain_kelvin_$(TOOLCHAIN_BUILD_DATE).tar.gz
## Removes the Kelvin toolchain from cache/, forcing a re-fetch if needed.
toolchain_kelvin_clean:
rm -rf "$(TOOLCHAIN_KELVIN_OUT_DIR)" "$(TOOLCHAIN_KELVIN_SRC_DIR)" "$(TOOLCHAIN_KELVIN_BUILD_DIR)"
.PHONY:: toolchain toolchain_src toolchain_clean
.PHONY:: toolchain_llvm toolchain_src_llvm toolchain_llvm_clean
.PHONY:: toolchain_kelvin toolchain_kelvin_src toolchain_kelvin_clean