blob: c24094a8ec9446d6f3d19be8c095e6f6e7a853db [file] [log] [blame]
kelvin.zhanga4497cf2021-10-13 17:31:59 +08001################################################################
2# Root Makefile of the whole project
3################################################################
4
5################################################################
6# Basic Definitions
7################################################################
8BOOT :=
9KERNEL ?= freertos
10
11################################################################
12# Directories and Files
13################################################################
14SHELL := /bin/bash
15PWD := $(shell pwd)
16PRJDIR := $(PWD)
17
18app_DIR := $(PRJDIR)/apps
19bootloader_DIR := $(PRJDIR)/$(BOOT)
20build_DIR := $(PRJDIR)/build
21docs_DIR := $(PRJDIR)/docs
22kernel_DIR := $(PRJDIR)/kernel/$(KERNEL)
23fw_DIR := $(PRJDIR)/firmware
24product_DIR := $(PRJDIR)/products
25sign_tool_DIR := $(PRJDIR)/tools/sign_tool
26adnl_DIR := $(PRJDIR)/tools/adnl
27
28BUILD_DIR := $(PRJDIR)/output/$(BOARD)-$(PRODUCT)
29docs_BUILD_DIR := $(PRJDIR)/output/docs
30bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
31kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
32sign_tool_BUILD_DIR := $(sign_tool_DIR)
33adnl_BUILD_DIR := $(adnl_DIR)
34
35bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
36kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
37fw_BIN := $(fw_DIR)/wcn-modem.bin
38adnl_BIN := $(adnl_BUILD_DIR)/adnl
39
40DIST_DIR := $(BUILD_DIR)/images
41bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
42kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
43fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
44adnl_dist_BIN := $(DIST_DIR)/adnl
45
46bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
47kernel_KEYPATH = $(build_DIR)/key/rsa/2048
48SIGNTOOL = $(sign_tool_DIR)/imgtool.py
49
50SDK_BASE := $(PRJDIR)
51toolchain_DIR := $(build_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
52CROSSTOOL := $(build_DIR)/toolchains/$(COMPILER)*$(TOOLCHAIN_KEYWORD)*.tar.xz
53PATH := $(toolchain_DIR)/bin:$(PATH)
54
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080055XTENSA_CORE = Amlogic_v9
56XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RI-2020.5-linux/XtensaTools
57XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RI-2020.5-linux/${XTENSA_CORE}/config
58PATH := ${XTENSA_HOME}/bin:${PATH}
59
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080060export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR XTENSA_CORE XTENSA_HOME XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080061
62################################################################
63# Macros
64################################################################
65# MESSAGE Macro -- display a message in bold type
66MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
67TERM_BOLD := $(shell tput smso 2>/dev/null)
68TERM_RESET := ${shell tput rmso 2>/dev/null}
69
70SDK_VERSION := "$(shell date +%g.%V.%u)"
71RELEASE_VERSION := "$(shell date +%g.%V.%u_%H_%M_%S)"
72
73# Macro of Generating Buildsystem
74# $(1): Target
75define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080076$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080077 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080078# Auto-generate root CMakeLists.txt and Kconfig
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080079 @ ./scripts/setup.sh
kelvin.zhanga4497cf2021-10-13 17:31:59 +080080 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080081 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
kelvin.zhanga4497cf2021-10-13 17:31:59 +080082 fi
83endef
84
85# Macro of Building CMake Targets
86# $(1): Target
87define GENERATE_CMAKE_TARGET
88.PHONY: $(1)
89$(1): toolchain $($(1)_BUILD_DIR)
90 @ $(call MESSAGE,"Building $(1)")
91 @ (if [ $(1) == kernel ]; then \
92 cmake --build $($(1)_BUILD_DIR); \
93 else \
94 if [ $(1) == bootloader ]; then \
95 if [ ! -d $(kernel_KEYPATH) ]; then \
96 mkdir -p $(kernel_KEYPATH); \
97 fi; \
98 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
99 $(call MESSAGE,"Generating kernel key pair ..."); \
100 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
101 fi; \
102 $(call MESSAGE,"Attach kernel public key"); \
103 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
104 if [ ! -d $($(1)_KEYPATH) ]; then \
105 $(call MESSAGE,"Generating $(1) key pair ..."); \
106 mkdir -p $($(1)_KEYPATH); \
107 fi; \
108 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
109 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
110 fi; \
111 fi; \
112 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
113 cmake --build ./ -- install; \
114 fi \
115 )
116endef
117
118# Macro of Building Targets
119# $(1): Target
120define GENERATE_MAKE_TARGET
121.PHONY: $(1)
122$(1): toolchain
123 @ $(call MESSAGE,"Building $(1)")
124 @ (cd $($(1)_DIR) && $(MAKE))
125endef
126
127# Macro of Menuconfig Targets
128# $(1): Target
129# $(2): Target suffix
130define GENERATE_MENUCONFIG_TARGET
131.PHONY: $(if $(2),$(1)-$(2),$(1))
132$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
133 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
134endef
135
136# Macro of Building Dist Targets
137# $(1): Target
138# $(2): Target suffix
139define GENERATE_DIST_TARGET
140.PHONY: $(if $(2),$(1)-$(2),$(1))
141$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
142 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
143endef
144
145# Macro of Cleaning Targets
146# $(1): Target
147# $(2): Target suffix
148define GENERATE_CLEAN_TARGET
149.PHONY: $(if $(2),$(1)-$(2),$(1))
150$(if $(2),$(1)-$(2),$(1)):
151 @ $(call MESSAGE,"Cleaning $(1)")
152 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
153endef
154
155# Macro of Signing Image
156# $(1): target binary
157# $(2): header length
158define SIGN_IMAGE
159 if [ $(1) == bootloader ]; then \
160 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
161 else \
162 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
163 fi
164endef
165
166################################################################
167# Targets
168################################################################
169BUILDSYSTEM_TARGETS := kernel
170CMAKE_TARGETS := kernel
171#MAKE_TARGETS := adnl
172MENUCONFIG_TARGETS := kernel
173INSTALL_TARGETS := $(CMAKE_TARGETS)
174ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
175DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
176CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
177
178.PHONY: dist
179dist: all $(DIST_TARGETS)
Xiaohu.Huang4f2e8992021-10-28 14:50:14 +0800180#arch for riscv not used the rtos-uImage with the follow command now
kelvin.zhang0cd31542021-11-02 10:11:25 +0800181# mkimage -A $(ARCH) -O u-boot -T standalone -C none -a 0x1000 -e 0x1000 -n rtos -d $(kernel_dist_BIN) $(DIST_DIR)/rtos-uImage
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800182# $(call SIGN_IMAGE,bootloader,512)
183# $(call SIGN_IMAGE,kernel,1024)
184
185$(DIST_DIR):
186 @ install -d $(DIST_DIR)
187
188.PHONY: all
189all: $(ALL_TARGETS)
190
191.PHONY: clean
192clean: $(CLEAN_TARGETS)
193
194.PHONY: distclean
195distclean:
196 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800197 @ rm -f CMakeLists.txt Kconfig
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800198
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800199.PHONY: project
200project:
201ifndef ARCH
202 $(error ARCH is not set, Please execute source scripts/env.sh)
203endif
204ifndef SOC
205 $(error SOC is not set, Please execute source scripts/env.sh)
206endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800207ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800208 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800209endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800210ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800211 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800212endif
Kelvin Zhangb3faf312021-12-16 13:56:49 +0800213 @ $(call MESSAGE,"Building $(BOARD) \($(SOC)\) $(PRODUCT)")
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800214
215.PHONY: docs
216docs:
217 @ cmake $($(1)_DIR)
218 @ cmake --build ./
219
220################################################################
221# Respective Targets
222################################################################
223# Buildsystem Targets
224$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
225
226# CMake Build Targets
227$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
228
229# Build Targets
230$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
231
232# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800233#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800234
235# Dist Targets
236$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
237
238# Clean Targets
239$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
240
241.PHONY: toolchain
242toolchain:
243ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800244 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800245endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800246 @ if [[ "$(TOOLCHAIN_KEYWORD)-$(COMPILER)" != "xt-xcc" ]]; then \
247 if [ ! -d $($@_DIR) ]; then \
248 $(call MESSAGE,"Preparing $@"); \
249 mkdir -p $($@_DIR); \
250 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
251 touch $($@_DIR); \
252 fi; \
253 if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
254 $(call MESSAGE,"Updating $@"); \
255 rm -rf $($@_DIR)/*; \
256 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
257 touch $($@_DIR); \
258 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800259 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800260
kelvin.zhangded42a02021-10-21 14:31:37 +0800261.PHONY: menuconfig
262menuconfig: $(kernel_BUILD_DIR)
263 @ cmake --build $(kernel_BUILD_DIR) --target $@
264
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800265.PHONY: flash
266flash:
267 @ if [ -d $(DIST_DIR) ]; then \
268 (cd $(DIST_DIR) && \
269 ./update_fw.sh;) \
270 fi
271
272.PHONY: release
273release:
274 @ (cd .. && \
275 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=cmake-Linux-x86_64 --exclude=gcc-arm-none-eabi \
kelvin.zhang90fa47b2021-10-18 18:08:34 +0800276 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800277 rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
kelvin.zhang90fa47b2021-10-18 18:08:34 +0800278 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR))