blob: e4d2ddcd0937c146844389b8768c39bb5a85f2d9 [file] [log] [blame]
################################################################
# Root Makefile of the whole project
################################################################
################################################################
# Basic Definitions
################################################################
BOOT :=
KERNEL ?= freertos
################################################################
# Directories and Files
################################################################
SHELL := /bin/bash
PWD := $(shell pwd)
PRJDIR := $(PWD)
app_DIR := $(PRJDIR)/apps
bootloader_DIR := $(PRJDIR)/$(BOOT)
build_DIR := $(PRJDIR)/build
docs_DIR := $(PRJDIR)/docs
kernel_DIR := $(PRJDIR)/kernel/$(KERNEL)
fw_DIR := $(PRJDIR)/firmware
product_DIR := $(PRJDIR)/products
sign_tool_DIR := $(PRJDIR)/tools/sign_tool
adnl_DIR := $(PRJDIR)/tools/adnl
BUILD_DIR := $(PRJDIR)/output/$(BOARD)-$(PRODUCT)
docs_BUILD_DIR := $(PRJDIR)/output/docs
bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
sign_tool_BUILD_DIR := $(sign_tool_DIR)
adnl_BUILD_DIR := $(adnl_DIR)
bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
fw_BIN := $(fw_DIR)/wcn-modem.bin
adnl_BIN := $(adnl_BUILD_DIR)/adnl
DIST_DIR := $(BUILD_DIR)/images
bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
adnl_dist_BIN := $(DIST_DIR)/adnl
bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
kernel_KEYPATH = $(build_DIR)/key/rsa/2048
SIGNTOOL = $(sign_tool_DIR)/imgtool.py
SDK_BASE := $(PRJDIR)
toolchain_DIR := $(build_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
CROSSTOOL := $(build_DIR)/toolchains/$(COMPILER)*$(TOOLCHAIN_KEYWORD)*.tar.xz
PATH := $(toolchain_DIR)/bin:$(PATH)
export PATH ARCH BOARD KERNEL SDK_BASE kernel_BUILD_DIR
################################################################
# Macros
################################################################
# MESSAGE Macro -- display a message in bold type
MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
TERM_BOLD := $(shell tput smso 2>/dev/null)
TERM_RESET := ${shell tput rmso 2>/dev/null}
SDK_VERSION := "$(shell date +%g.%V.%u)"
RELEASE_VERSION := "$(shell date +%g.%V.%u_%H_%M_%S)"
# Macro of Generating Buildsystem
# $(1): Target
define GENERATE_BUILDSYSTEM
$($(1)_BUILD_DIR): board
@ mkdir -p $($(1)_BUILD_DIR)
@ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
fi
endef
# Macro of Building CMake Targets
# $(1): Target
define GENERATE_CMAKE_TARGET
.PHONY: $(1)
$(1): toolchain $($(1)_BUILD_DIR)
@ $(call MESSAGE,"Building $(1)")
@ (if [ $(1) == kernel ]; then \
cmake --build $($(1)_BUILD_DIR); \
else \
if [ $(1) == bootloader ]; then \
if [ ! -d $(kernel_KEYPATH) ]; then \
mkdir -p $(kernel_KEYPATH); \
fi; \
if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
$(call MESSAGE,"Generating kernel key pair ..."); \
python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
fi; \
$(call MESSAGE,"Attach kernel public key"); \
python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
if [ ! -d $($(1)_KEYPATH) ]; then \
$(call MESSAGE,"Generating $(1) key pair ..."); \
mkdir -p $($(1)_KEYPATH); \
fi; \
if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
fi; \
fi; \
cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
cmake --build ./ -- install; \
fi \
)
endef
# Macro of Building Targets
# $(1): Target
define GENERATE_MAKE_TARGET
.PHONY: $(1)
$(1): toolchain
@ $(call MESSAGE,"Building $(1)")
@ (cd $($(1)_DIR) && $(MAKE))
endef
# Macro of Menuconfig Targets
# $(1): Target
# $(2): Target suffix
define GENERATE_MENUCONFIG_TARGET
.PHONY: $(if $(2),$(1)-$(2),$(1))
$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
@ cmake --build $($(1)_BUILD_DIR) --target $(2)
endef
# Macro of Building Dist Targets
# $(1): Target
# $(2): Target suffix
define GENERATE_DIST_TARGET
.PHONY: $(if $(2),$(1)-$(2),$(1))
$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
@ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
endef
# Macro of Cleaning Targets
# $(1): Target
# $(2): Target suffix
define GENERATE_CLEAN_TARGET
.PHONY: $(if $(2),$(1)-$(2),$(1))
$(if $(2),$(1)-$(2),$(1)):
@ $(call MESSAGE,"Cleaning $(1)")
@ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
endef
# Macro of Signing Image
# $(1): target binary
# $(2): header length
define SIGN_IMAGE
if [ $(1) == bootloader ]; then \
python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
else \
python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
fi
endef
################################################################
# Targets
################################################################
BUILDSYSTEM_TARGETS := kernel
CMAKE_TARGETS := kernel
#MAKE_TARGETS := adnl
MENUCONFIG_TARGETS := kernel
INSTALL_TARGETS := $(CMAKE_TARGETS)
ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
.PHONY: dist
dist: all $(DIST_TARGETS)
#arch for riscv not used the rtos-uImage with the follow command now
# mkimage -A $(ARCH) -O u-boot -T standalone -C none -a 0x1000 -e 0x1000 -n rtos -d $(kernel_dist_BIN) $(DIST_DIR)/rtos-uImage
# $(call SIGN_IMAGE,bootloader,512)
# $(call SIGN_IMAGE,kernel,1024)
$(DIST_DIR):
@ install -d $(DIST_DIR)
.PHONY: all
all: $(ALL_TARGETS)
.PHONY: clean
clean: $(CLEAN_TARGETS)
.PHONY: distclean
distclean:
@ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
.PHONY: board
board:
ifndef BOARD
$(error BOARD is not set, Please execute source scripts/env.sh)
endif
@ echo "Board: $(BOARD)"
ifndef PRODUCT
$(error PRODUCT is not set, Please execute source scripts/env.sh)
endif
@ echo "Product: $(PRODUCT)"
.PHONY: docs
docs:
@ cmake $($(1)_DIR)
@ cmake --build ./
################################################################
# Respective Targets
################################################################
# Buildsystem Targets
$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
# CMake Build Targets
$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
# Build Targets
$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
# Menuconfig Targets
#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
# Dist Targets
$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
# Clean Targets
$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
.PHONY: toolchain
toolchain:
ifndef COMPILER
$(error COMPILER is not set, Please execute source scripts/env.sh)
endif
@ if [ ! -d $($@_DIR) ]; then \
$(call MESSAGE,"Preparing $@"); \
mkdir -p $($@_DIR); \
tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
touch $($@_DIR); \
fi
@ if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
$(call MESSAGE,"Updating $@"); \
rm -rf $($@_DIR)/*; \
tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
touch $($@_DIR); \
fi
# Auto-generate root CMakeLists.txt and Kconfig
@ ./scripts/setup.sh $(MANIFEST_FILE); \
.PHONY: menuconfig
menuconfig: $(kernel_BUILD_DIR)
@ cmake --build $(kernel_BUILD_DIR) --target $@
.PHONY: flash
flash:
@ if [ -d $(DIST_DIR) ]; then \
(cd $(DIST_DIR) && \
./update_fw.sh;) \
fi
.PHONY: release
release:
@ (cd .. && \
tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=cmake-Linux-x86_64 --exclude=gcc-arm-none-eabi \
-cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR))