# 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
