blob: c73c228e186689f95db6638373c4526f60132e56 [file] [log] [blame]
yang.lid6fe6242022-01-13 14:44:24 +08001# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
2
3# SPDX-License-Identifier: MIT
4
kelvin.zhanga4497cf2021-10-13 17:31:59 +08005################################################################
6# Root Makefile of the whole project
7################################################################
8
9################################################################
10# Basic Definitions
11################################################################
12BOOT :=
13KERNEL ?= freertos
14
15################################################################
16# Directories and Files
17################################################################
18SHELL := /bin/bash
19PWD := $(shell pwd)
20PRJDIR := $(PWD)
21
22app_DIR := $(PRJDIR)/apps
23bootloader_DIR := $(PRJDIR)/$(BOOT)
kelvin.zhang65fedc32022-01-14 21:53:28 +080024build_DIR := $(PRJDIR)/build_system
kelvin.zhanga4497cf2021-10-13 17:31:59 +080025docs_DIR := $(PRJDIR)/docs
26kernel_DIR := $(PRJDIR)/kernel/$(KERNEL)
27fw_DIR := $(PRJDIR)/firmware
28product_DIR := $(PRJDIR)/products
Yang Lif1686482022-10-25 22:41:55 -070029sign_tool_DIR := $(PRJDIR)/tools/sign_tool
kelvin.zhanga4497cf2021-10-13 17:31:59 +080030adnl_DIR := $(PRJDIR)/tools/adnl
31
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +080032output_DIR := $(PRJDIR)/output
33BUILD_DIR := $(output_DIR)/$(ARCH)-$(BOARD)-$(PRODUCT)
34docs_BUILD_DIR := $(output_DIR)/docs
kelvin.zhanga4497cf2021-10-13 17:31:59 +080035bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
36kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
37sign_tool_BUILD_DIR := $(sign_tool_DIR)
38adnl_BUILD_DIR := $(adnl_DIR)
39
40bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
41kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
42fw_BIN := $(fw_DIR)/wcn-modem.bin
43adnl_BIN := $(adnl_BUILD_DIR)/adnl
44
45DIST_DIR := $(BUILD_DIR)/images
46bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
47kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
48fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
49adnl_dist_BIN := $(DIST_DIR)/adnl
50
51bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
52kernel_KEYPATH = $(build_DIR)/key/rsa/2048
53SIGNTOOL = $(sign_tool_DIR)/imgtool.py
54
55SDK_BASE := $(PRJDIR)
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +080056toolchain_DIR := $(output_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
57CROSSTOOL := $(PRJDIR)/arch/$(ARCH)/toolchain/$(COMPILER)*$(TOOLCHAIN_KEYWORD)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080058PATH := $(toolchain_DIR)/bin:$(PATH)
59
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080060#xtensa toolchain option by soc name
Cao Wei6c3c1cc2022-05-14 17:48:42 +080061XTENSA_LOWPOWER_PATTERN=_lowpower
Cao Weif1262cb2023-04-28 17:21:20 +080062ifeq ($(SOC),$(filter $(SOC),a5 t3x))
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080063 XTENSA_CORE = Amlogic_v9
Cao Wei6c3c1cc2022-05-14 17:48:42 +080064 XTENSA_TOOLCHAIN_VER = RI-2020.5-linux
65else ifeq ($(SOC),a1)
66ifeq ($(findstring $(XTENSA_LOWPOWER_PATTERN),$(BOARD)),$(XTENSA_LOWPOWER_PATTERN))
67 XTENSA_CORE = Amlogic_v2
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080068else
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080069 XTENSA_CORE = Amlogic_v0
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080070endif
Cao Wei6c3c1cc2022-05-14 17:48:42 +080071 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
72else
73 XTENSA_CORE = Amlogic_v0
74 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
75endif
76XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/${XTENSA_TOOLCHAIN_VER}/XtensaTools
77XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/${XTENSA_TOOLCHAIN_VER}/${XTENSA_CORE}/config
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080078PATH := ${XTENSA_HOME}/bin:${PATH}
79
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080080export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR XTENSA_CORE XTENSA_HOME XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080081
82################################################################
83# Macros
84################################################################
85# MESSAGE Macro -- display a message in bold type
86MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
87TERM_BOLD := $(shell tput smso 2>/dev/null)
88TERM_RESET := ${shell tput rmso 2>/dev/null}
89
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +080090RELEASE_VERSION := "$(shell date +%y.%m.%d)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +080091
92# Macro of Generating Buildsystem
93# $(1): Target
94define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080095$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080096 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080097# Auto-generate root CMakeLists.txt and Kconfig
Kelvin Zhangab840b22022-01-14 10:37:05 +080098 @ ./scripts/setup.sh $($(1)_BUILD_DIR)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080099 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
xiaohu.huanga1268fd2022-06-07 11:10:48 +0800100 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)_compiler.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
Kelvin Zhangab840b22022-01-14 10:37:05 +0800101 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800102endef
103
104# Macro of Building CMake Targets
105# $(1): Target
106define GENERATE_CMAKE_TARGET
107.PHONY: $(1)
108$(1): toolchain $($(1)_BUILD_DIR)
109 @ $(call MESSAGE,"Building $(1)")
110 @ (if [ $(1) == kernel ]; then \
111 cmake --build $($(1)_BUILD_DIR); \
112 else \
113 if [ $(1) == bootloader ]; then \
114 if [ ! -d $(kernel_KEYPATH) ]; then \
115 mkdir -p $(kernel_KEYPATH); \
116 fi; \
117 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
118 $(call MESSAGE,"Generating kernel key pair ..."); \
119 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
120 fi; \
121 $(call MESSAGE,"Attach kernel public key"); \
122 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
123 if [ ! -d $($(1)_KEYPATH) ]; then \
124 $(call MESSAGE,"Generating $(1) key pair ..."); \
125 mkdir -p $($(1)_KEYPATH); \
126 fi; \
127 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
128 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
129 fi; \
130 fi; \
131 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
132 cmake --build ./ -- install; \
133 fi \
134 )
135endef
136
137# Macro of Building Targets
138# $(1): Target
139define GENERATE_MAKE_TARGET
140.PHONY: $(1)
141$(1): toolchain
142 @ $(call MESSAGE,"Building $(1)")
143 @ (cd $($(1)_DIR) && $(MAKE))
144endef
145
146# Macro of Menuconfig Targets
147# $(1): Target
148# $(2): Target suffix
149define GENERATE_MENUCONFIG_TARGET
150.PHONY: $(if $(2),$(1)-$(2),$(1))
151$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
152 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
153endef
154
155# Macro of Building Dist Targets
156# $(1): Target
157# $(2): Target suffix
158define GENERATE_DIST_TARGET
159.PHONY: $(if $(2),$(1)-$(2),$(1))
160$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
161 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
162endef
163
164# Macro of Cleaning Targets
165# $(1): Target
166# $(2): Target suffix
167define GENERATE_CLEAN_TARGET
168.PHONY: $(if $(2),$(1)-$(2),$(1))
169$(if $(2),$(1)-$(2),$(1)):
170 @ $(call MESSAGE,"Cleaning $(1)")
171 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
172endef
173
174# Macro of Signing Image
175# $(1): target binary
176# $(2): header length
177define SIGN_IMAGE
178 if [ $(1) == bootloader ]; then \
179 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
180 else \
181 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
182 fi
183endef
184
185################################################################
186# Targets
187################################################################
188BUILDSYSTEM_TARGETS := kernel
189CMAKE_TARGETS := kernel
190#MAKE_TARGETS := adnl
191MENUCONFIG_TARGETS := kernel
192INSTALL_TARGETS := $(CMAKE_TARGETS)
193ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
194DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
195CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
196
197.PHONY: dist
198dist: all $(DIST_TARGETS)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800199# $(call SIGN_IMAGE,bootloader,512)
Yang Lif1686482022-10-25 22:41:55 -0700200# $(call SIGN_IMAGE,kernel,1024)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800201
202$(DIST_DIR):
203 @ install -d $(DIST_DIR)
204
205.PHONY: all
206all: $(ALL_TARGETS)
207
208.PHONY: clean
209clean: $(CLEAN_TARGETS)
210
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800211ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
212
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800213.PHONY: distclean
214distclean:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800215ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800216 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800217else
218 @ if [ -d $(output_DIR) ]; then rm -rf $(output_DIR); fi
219endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800220
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800221.PHONY: project
222project:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800223ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
Kelvin Zhang21851072022-03-02 11:21:06 +0800224 @ $(call MESSAGE,"Building $(ARCH) $(SOC) $(BOARD) $(PRODUCT)")
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800225else
226 $(error Please execute source scripts/env.sh)
227endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800228
229.PHONY: docs
230docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800231 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
Kelvin Zhang2d0b2512022-01-13 14:45:00 +0800232 @ (cd $($@_BUILD_DIR); \
Kelvin Zhang681f7392022-01-11 14:06:31 +0800233 cmake $($@_DIR); \
234 make)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800235
236################################################################
237# Respective Targets
238################################################################
239# Buildsystem Targets
240$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
241
242# CMake Build Targets
243$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
244
245# Build Targets
246$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
247
248# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800249#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800250
251# Dist Targets
252$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
253
254# Clean Targets
255$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
256
257.PHONY: toolchain
258toolchain:
259ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800260 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800261endif
xiaohu.huang929bf972022-12-19 14:38:39 +0800262 @ if [[ "$(COMPILER)" != "xcc" ]]; then \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800263 if [ ! -d $($@_DIR) ]; then \
shijie.xiong450938b2023-01-05 15:01:06 +0800264 $(call MESSAGE,"Extracting_debug $@"); \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800265 mkdir -p $($@_DIR); \
kelvin.zhang24420712022-03-07 17:40:34 +0800266 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
shijie.xiong450938b2023-01-05 15:01:06 +0800267 sync; \
kelvin.zhang24420712022-03-07 17:40:34 +0800268 touch $($@_DIR); \
shijie.xiong450938b2023-01-05 15:01:06 +0800269 ls -la $($@_DIR)/bin; \
270 $($@_DIR)/bin/aarch64-none-elf-gcc -v; \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800271 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800272 if ( find $(CROSSTOOL).tar.xz -newer $($@_DIR) | grep -q $(CROSSTOOL).tar.xz ); then \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800273 $(call MESSAGE,"Updating $@"); \
274 rm -rf $($@_DIR)/*; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800275 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800276 touch $($@_DIR); \
277 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800278 if [ -f $(CROSSTOOL).patch ]; then \
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +0800279 cd $(output_DIR)/toolchains; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800280 if patch -N -f -s --dry-run -p0 < $(CROSSTOOL).patch >/dev/null; then \
281 $(call MESSAGE,"Preparing $@"); \
282 patch -s -p0 < $(CROSSTOOL).patch; \
283 fi; \
284 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800285 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800286
kelvin.zhangded42a02021-10-21 14:31:37 +0800287.PHONY: menuconfig
Kelvin Zhanga3779812022-01-15 12:17:11 +0800288menuconfig: toolchain $(kernel_BUILD_DIR)
kelvin.zhangded42a02021-10-21 14:31:37 +0800289 @ cmake --build $(kernel_BUILD_DIR) --target $@
290
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800291.PHONY: flash
292flash:
293 @ if [ -d $(DIST_DIR) ]; then \
294 (cd $(DIST_DIR) && \
295 ./update_fw.sh;) \
296 fi
297
shijie.xiong75fde582022-10-25 10:04:12 +0800298.PHONY: scatter
299scatter:
300 @make && \
301 make -f $(build_DIR)/scatter_load.mk scatter
302
shijie.xionga04c8b82022-03-17 14:01:53 +0800303ifeq ($(BACKTRACE_ENABLE),1)
304.PHONY: backtrace
305backtrace:
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800306 @make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800307 make -f $(build_DIR)/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800308 make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800309 make -f $(build_DIR)/symtable.mk clean
Xiaohu.Huangbdc7c5f2022-01-13 16:56:27 +0800310endif
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800311
shijie.xiong696e0462022-03-31 15:27:36 +0800312.PHONY: package
313package:
314 @ if [ -z $(backtrace) ]; then \
315 (./scripts/package.sh) \
316 else \
317 (./scripts/package.sh backtrace) \
318 fi
319
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800320.PHONY: release
321release:
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800322 @ if [ -f $(PRJDIR)/CMakeLists.txt ] && [ -f $(PRJDIR)/Kconfig ] && [ -f $(kernel_BUILD_DIR)/sdk_ver.h ]; then \
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +0800323 sed -i '/#define CONFIG_VERSION_STRING/d' $(kernel_BUILD_DIR)/sdk_ver.h; \
324 echo "#define CONFIG_VERSION_STRING \"$(RELEASE_VERSION)\"" >> $(kernel_BUILD_DIR)/sdk_ver.h; \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800325 [ -d $(docs_DIR) ] && sed -i 's/PROJECT_NUMBER.*=.*/PROJECT_NUMBER = $(RELEASE_VERSION)/' $(docs_DIR)/Doxyfile; \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800326 (cd .. && \
327 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=gcc-aarch64-none-elf --exclude=gcc-riscv-none \
328 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800329 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR); \
330 cd - > /dev/null); \
331 (cd $(docs_DIR) && git reset --hard -q && cd - > /dev/null); \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800332 else \
333 echo "Please execute make in advance!"; \
Kelvin Zhang845f46b2021-12-29 14:00:14 +0800334 fi