blob: be7e9c2858cd9bcdb1569a0bc39751599f154746 [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.Huangb7f78e92021-12-22 10:56:29 +080055#xtensa toolchain option by soc name
56ifeq ($(SOC),a5)
57 XTENSA_CORE = Amlogic_v9
58 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RI-2020.5-linux/XtensaTools
59 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RI-2020.5-linux/${XTENSA_CORE}/config
60else
61 #a1 and default toolchain option
62 XTENSA_CORE = Amlogic_v0
63 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RG-2018.9-linux/XtensaTools
64 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RG-2018.9-linux/${XTENSA_CORE}/config
65endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080066PATH := ${XTENSA_HOME}/bin:${PATH}
67
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080068export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR XTENSA_CORE XTENSA_HOME XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080069
70################################################################
71# Macros
72################################################################
73# MESSAGE Macro -- display a message in bold type
74MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
75TERM_BOLD := $(shell tput smso 2>/dev/null)
76TERM_RESET := ${shell tput rmso 2>/dev/null}
77
Kelvin Zhang845f46b2021-12-29 14:00:14 +080078RELEASE_VERSION := "$(shell date +%g.%V.%u)"
Kelvin Zhanga1ede002021-12-30 16:48:21 +080079#SDK_VERSION := "$(shell date +%g.%V.%u" "%H:%M:%S)"
80SDK_VERSION := "$(shell date +%F" "%T)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +080081
82# Macro of Generating Buildsystem
83# $(1): Target
84define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080085$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080086 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080087# Auto-generate root CMakeLists.txt and Kconfig
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080088 @ ./scripts/setup.sh
kelvin.zhanga4497cf2021-10-13 17:31:59 +080089 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080090 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
Kelvin Zhanga1ede002021-12-30 16:48:21 +080091 echo "#define CONFIG_BOARD_NAME \"$(BOARD)\"" >> $($(1)_BUILD_DIR)/sdk_version.h; \
92 echo "#define CONFIG_PRODUCT_NAME \"$(PRODUCT)\"" >> $($(1)_BUILD_DIR)/sdk_version.h; \
93 fi; \
94 sed -i '/#define CONFIG_VERSION_STRING/d' $($(1)_BUILD_DIR)/sdk_version.h; \
95 echo "#define CONFIG_VERSION_STRING \"$(SDK_VERSION)\"" >> $($(1)_BUILD_DIR)/sdk_version.h
kelvin.zhanga4497cf2021-10-13 17:31:59 +080096endef
97
98# Macro of Building CMake Targets
99# $(1): Target
100define GENERATE_CMAKE_TARGET
101.PHONY: $(1)
102$(1): toolchain $($(1)_BUILD_DIR)
103 @ $(call MESSAGE,"Building $(1)")
104 @ (if [ $(1) == kernel ]; then \
105 cmake --build $($(1)_BUILD_DIR); \
106 else \
107 if [ $(1) == bootloader ]; then \
108 if [ ! -d $(kernel_KEYPATH) ]; then \
109 mkdir -p $(kernel_KEYPATH); \
110 fi; \
111 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
112 $(call MESSAGE,"Generating kernel key pair ..."); \
113 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
114 fi; \
115 $(call MESSAGE,"Attach kernel public key"); \
116 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
117 if [ ! -d $($(1)_KEYPATH) ]; then \
118 $(call MESSAGE,"Generating $(1) key pair ..."); \
119 mkdir -p $($(1)_KEYPATH); \
120 fi; \
121 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
122 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
123 fi; \
124 fi; \
125 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
126 cmake --build ./ -- install; \
127 fi \
128 )
129endef
130
131# Macro of Building Targets
132# $(1): Target
133define GENERATE_MAKE_TARGET
134.PHONY: $(1)
135$(1): toolchain
136 @ $(call MESSAGE,"Building $(1)")
137 @ (cd $($(1)_DIR) && $(MAKE))
138endef
139
140# Macro of Menuconfig Targets
141# $(1): Target
142# $(2): Target suffix
143define GENERATE_MENUCONFIG_TARGET
144.PHONY: $(if $(2),$(1)-$(2),$(1))
145$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
146 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
147endef
148
149# Macro of Building Dist Targets
150# $(1): Target
151# $(2): Target suffix
152define GENERATE_DIST_TARGET
153.PHONY: $(if $(2),$(1)-$(2),$(1))
154$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
155 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
156endef
157
158# Macro of Cleaning Targets
159# $(1): Target
160# $(2): Target suffix
161define GENERATE_CLEAN_TARGET
162.PHONY: $(if $(2),$(1)-$(2),$(1))
163$(if $(2),$(1)-$(2),$(1)):
164 @ $(call MESSAGE,"Cleaning $(1)")
165 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
166endef
167
168# Macro of Signing Image
169# $(1): target binary
170# $(2): header length
171define SIGN_IMAGE
172 if [ $(1) == bootloader ]; then \
173 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
174 else \
175 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
176 fi
177endef
178
179################################################################
180# Targets
181################################################################
182BUILDSYSTEM_TARGETS := kernel
183CMAKE_TARGETS := kernel
184#MAKE_TARGETS := adnl
185MENUCONFIG_TARGETS := kernel
186INSTALL_TARGETS := $(CMAKE_TARGETS)
187ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
188DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
189CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
190
191.PHONY: dist
192dist: all $(DIST_TARGETS)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800193# $(call SIGN_IMAGE,bootloader,512)
194# $(call SIGN_IMAGE,kernel,1024)
195
196$(DIST_DIR):
197 @ install -d $(DIST_DIR)
198
199.PHONY: all
200all: $(ALL_TARGETS)
201
202.PHONY: clean
203clean: $(CLEAN_TARGETS)
204
205.PHONY: distclean
206distclean:
207 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
208
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800209.PHONY: project
210project:
211ifndef ARCH
212 $(error ARCH is not set, Please execute source scripts/env.sh)
213endif
214ifndef SOC
215 $(error SOC is not set, Please execute source scripts/env.sh)
216endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800217ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800218 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800219endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800220ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800221 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800222endif
Kelvin Zhangb3faf312021-12-16 13:56:49 +0800223 @ $(call MESSAGE,"Building $(BOARD) \($(SOC)\) $(PRODUCT)")
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800224
225.PHONY: docs
226docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800227 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
228 (cd $($@_BUILD_DIR); \
229 cmake $($@_DIR); \
230 make)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800231
232################################################################
233# Respective Targets
234################################################################
235# Buildsystem Targets
236$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
237
238# CMake Build Targets
239$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
240
241# Build Targets
242$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
243
244# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800245#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800246
247# Dist Targets
248$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
249
250# Clean Targets
251$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
252
253.PHONY: toolchain
254toolchain:
255ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800256 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800257endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800258 @ if [[ "$(TOOLCHAIN_KEYWORD)-$(COMPILER)" != "xt-xcc" ]]; then \
259 if [ ! -d $($@_DIR) ]; then \
260 $(call MESSAGE,"Preparing $@"); \
261 mkdir -p $($@_DIR); \
262 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
263 touch $($@_DIR); \
264 fi; \
265 if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
266 $(call MESSAGE,"Updating $@"); \
267 rm -rf $($@_DIR)/*; \
268 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
269 touch $($@_DIR); \
270 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800271 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800272
kelvin.zhangded42a02021-10-21 14:31:37 +0800273.PHONY: menuconfig
274menuconfig: $(kernel_BUILD_DIR)
275 @ cmake --build $(kernel_BUILD_DIR) --target $@
276
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800277.PHONY: flash
278flash:
279 @ if [ -d $(DIST_DIR) ]; then \
280 (cd $(DIST_DIR) && \
281 ./update_fw.sh;) \
282 fi
283
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800284.PHONY: stacktrace
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800285stacktrace:
286 @make && \
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800287 make -f $(PRJDIR)/build/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800288 make && \
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800289 make -f $(PRJDIR)/build/symtable.mk clean
290
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800291.PHONY: release
292release:
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800293 @ if [ -f $(PRJDIR)/CMakeLists.txt ] && [ -f $(PRJDIR)/Kconfig ]; then \
294 (cd .. && \
295 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=gcc-aarch64-none-elf --exclude=gcc-riscv-none \
296 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
297 rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
298 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR)); \
299 else \
300 echo "Please execute make in advance!"; \
Kelvin Zhang845f46b2021-12-29 14:00:14 +0800301 fi