# 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_BOARD := ${PLATFORM}

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

CHERIOT_TEST := $(CHERIOT_OUT_RELEASE)/cheriot/cheriot/release/test-suite

# 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=${CHERIOT_BOARD} \
			${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=${CHERIOT_BOARD} \
			${CHERIOT_RELEASE_CONFIG_OPTIONS} && \
	xmake build

## Generates CHERIoT build artifacts setup for release
cheriot-bundle-release: $(CHERIOT_FIRMWARE_RELEASE)

## Generates CHERIoT provided test-suite binary
cheriot-test:
	${MAKE} \
		CHERIOT_BOARD=sail \
		CHERIOT_FIRMWARE_SRC_DIR=${CHERIOT_SRC_DIR}/tests \
		CHERIOT_FIRMWARE_RELEASE=$(CHERIOT_TEST) \
		${CHERIOT_TEST}

## 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-test
.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)
