# 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_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

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

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

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