blob: ca92de966c51722651a6008109464c9b014f2451 [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
xiaohu.huangd7df85c2023-07-12 18:58:59 +080014ifeq ($(DOCS_ARCH),)
15 ifeq ($(ARCH),)
16 DOCS_ARCH = arm64
17 else
18 DOCS_ARCH = $(ARCH)
19 endif
20endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +080021
22################################################################
23# Directories and Files
24################################################################
25SHELL := /bin/bash
26PWD := $(shell pwd)
27PRJDIR := $(PWD)
28
29app_DIR := $(PRJDIR)/apps
30bootloader_DIR := $(PRJDIR)/$(BOOT)
kelvin.zhang65fedc32022-01-14 21:53:28 +080031build_DIR := $(PRJDIR)/build_system
xiaohu.huangd7df85c2023-07-12 18:58:59 +080032docs_DIR := $(PRJDIR)/arch/$(DOCS_ARCH)/docs
kelvin.zhanga4497cf2021-10-13 17:31:59 +080033kernel_DIR := $(PRJDIR)/kernel/$(KERNEL)
34fw_DIR := $(PRJDIR)/firmware
35product_DIR := $(PRJDIR)/products
Yang Lif1686482022-10-25 22:41:55 -070036sign_tool_DIR := $(PRJDIR)/tools/sign_tool
kelvin.zhanga4497cf2021-10-13 17:31:59 +080037adnl_DIR := $(PRJDIR)/tools/adnl
38
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +080039output_DIR := $(PRJDIR)/output
40BUILD_DIR := $(output_DIR)/$(ARCH)-$(BOARD)-$(PRODUCT)
xiaohu.huangd7df85c2023-07-12 18:58:59 +080041docs_BUILD_DIR := $(output_DIR)/docs/$(DOCS_ARCH)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080042bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
43kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
44sign_tool_BUILD_DIR := $(sign_tool_DIR)
45adnl_BUILD_DIR := $(adnl_DIR)
46
47bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
48kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
49fw_BIN := $(fw_DIR)/wcn-modem.bin
50adnl_BIN := $(adnl_BUILD_DIR)/adnl
51
52DIST_DIR := $(BUILD_DIR)/images
53bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
54kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
55fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
56adnl_dist_BIN := $(DIST_DIR)/adnl
57
58bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
59kernel_KEYPATH = $(build_DIR)/key/rsa/2048
60SIGNTOOL = $(sign_tool_DIR)/imgtool.py
61
62SDK_BASE := $(PRJDIR)
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +080063toolchain_DIR := $(output_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
64CROSSTOOL := $(PRJDIR)/arch/$(ARCH)/toolchain/$(COMPILER)*$(TOOLCHAIN_KEYWORD)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080065PATH := $(toolchain_DIR)/bin:$(PATH)
66
shijie.xiong7760b3e2024-05-08 11:21:23 +080067#This code segment is used to set the path of the compiler for the find_compiler.cmake to search.
68ifeq ($(ARCH),arm)
69 TOOLCHAIN_PATH=$(toolchain_DIR)
70else ifeq ($(ARCH),arm64)
71 TOOLCHAIN_PATH=$(toolchain_DIR)
72else ifeq ($(ARCH),xtensa)
73 XTENSA_LOWPOWER_PATTERN=_lowpower
74 ifeq ($(SOC),$(filter $(SOC),a5 t3x s6))
75 XTENSA_CORE = Amlogic_v9
76 XTENSA_TOOLCHAIN_VER = RI-2020.5-linux
77 else ifeq ($(SOC),a1)
78 ifeq ($(findstring $(XTENSA_LOWPOWER_PATTERN),$(BOARD)),$(XTENSA_LOWPOWER_PATTERN))
79 XTENSA_CORE = Amlogic_v2
80 else
81 XTENSA_CORE = Amlogic_v0
82 endif
83 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
84 else
85 XTENSA_CORE = Amlogic_v0
86 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
87 endif
88 TOOLCHAIN_PATH=/opt/xtensa/XtDevTools/install/tools/$(XTENSA_TOOLCHAIN_VER)/XtensaTools
89 XTENSA_SYSTEM=/opt/xtensa/XtDevTools/install/builds/$(XTENSA_TOOLCHAIN_VER)/$(XTENSA_CORE)/config
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080090endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080091
shijie.xiong7760b3e2024-05-08 11:21:23 +080092export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR TOOLCHAIN_PATH XTENSA_CORE XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080093
94################################################################
95# Macros
96################################################################
97# MESSAGE Macro -- display a message in bold type
98MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
99TERM_BOLD := $(shell tput smso 2>/dev/null)
100TERM_RESET := ${shell tput rmso 2>/dev/null}
101
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +0800102RELEASE_VERSION := "$(shell date +%y.%m.%d)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800103
104# Macro of Generating Buildsystem
105# $(1): Target
106define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800107$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800108 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +0800109# Auto-generate root CMakeLists.txt and Kconfig
Kelvin Zhangab840b22022-01-14 10:37:05 +0800110 @ ./scripts/setup.sh $($(1)_BUILD_DIR)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800111 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
xiaohu.huanga1268fd2022-06-07 11:10:48 +0800112 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 +0800113 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800114endef
115
116# Macro of Building CMake Targets
117# $(1): Target
118define GENERATE_CMAKE_TARGET
119.PHONY: $(1)
120$(1): toolchain $($(1)_BUILD_DIR)
121 @ $(call MESSAGE,"Building $(1)")
122 @ (if [ $(1) == kernel ]; then \
123 cmake --build $($(1)_BUILD_DIR); \
124 else \
125 if [ $(1) == bootloader ]; then \
126 if [ ! -d $(kernel_KEYPATH) ]; then \
127 mkdir -p $(kernel_KEYPATH); \
128 fi; \
129 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
130 $(call MESSAGE,"Generating kernel key pair ..."); \
131 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
132 fi; \
133 $(call MESSAGE,"Attach kernel public key"); \
134 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
135 if [ ! -d $($(1)_KEYPATH) ]; then \
136 $(call MESSAGE,"Generating $(1) key pair ..."); \
137 mkdir -p $($(1)_KEYPATH); \
138 fi; \
139 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
140 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
141 fi; \
142 fi; \
143 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
144 cmake --build ./ -- install; \
145 fi \
146 )
147endef
148
149# Macro of Building Targets
150# $(1): Target
151define GENERATE_MAKE_TARGET
152.PHONY: $(1)
153$(1): toolchain
154 @ $(call MESSAGE,"Building $(1)")
155 @ (cd $($(1)_DIR) && $(MAKE))
156endef
157
158# Macro of Menuconfig Targets
159# $(1): Target
160# $(2): Target suffix
161define GENERATE_MENUCONFIG_TARGET
162.PHONY: $(if $(2),$(1)-$(2),$(1))
163$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
164 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
165endef
166
167# Macro of Building Dist Targets
168# $(1): Target
169# $(2): Target suffix
170define GENERATE_DIST_TARGET
171.PHONY: $(if $(2),$(1)-$(2),$(1))
172$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
173 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
174endef
175
176# Macro of Cleaning Targets
177# $(1): Target
178# $(2): Target suffix
179define GENERATE_CLEAN_TARGET
180.PHONY: $(if $(2),$(1)-$(2),$(1))
181$(if $(2),$(1)-$(2),$(1)):
182 @ $(call MESSAGE,"Cleaning $(1)")
183 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
184endef
185
186# Macro of Signing Image
187# $(1): target binary
188# $(2): header length
189define SIGN_IMAGE
190 if [ $(1) == bootloader ]; then \
191 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
192 else \
193 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
194 fi
195endef
196
shijie.xiong975f4572023-10-11 14:12:34 +0800197# Macro of Segment Image
198# $(1): segment makefile
199define SEGMENT_IMAGE
shijie.xiong16db2842024-01-24 13:52:40 +0800200 @ if [ -f $(1) ]; then \
shijie.xiong975f4572023-10-11 14:12:34 +0800201 make -f $(1) scatter; \
202 fi
203endef
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800204################################################################
205# Targets
206################################################################
207BUILDSYSTEM_TARGETS := kernel
208CMAKE_TARGETS := kernel
209#MAKE_TARGETS := adnl
210MENUCONFIG_TARGETS := kernel
211INSTALL_TARGETS := $(CMAKE_TARGETS)
212ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
213DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
214CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
215
216.PHONY: dist
217dist: all $(DIST_TARGETS)
shijie.xiong975f4572023-10-11 14:12:34 +0800218 $(call SEGMENT_IMAGE,$(build_DIR)/scatter_load.mk)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800219# $(call SIGN_IMAGE,bootloader,512)
Yang Lif1686482022-10-25 22:41:55 -0700220# $(call SIGN_IMAGE,kernel,1024)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800221
222$(DIST_DIR):
223 @ install -d $(DIST_DIR)
224
225.PHONY: all
226all: $(ALL_TARGETS)
227
228.PHONY: clean
229clean: $(CLEAN_TARGETS)
230
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800231ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
232
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800233.PHONY: distclean
234distclean:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800235ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800236 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800237else
238 @ if [ -d $(output_DIR) ]; then rm -rf $(output_DIR); fi
239endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800240
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800241.PHONY: project
242project:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800243ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
Kelvin Zhang21851072022-03-02 11:21:06 +0800244 @ $(call MESSAGE,"Building $(ARCH) $(SOC) $(BOARD) $(PRODUCT)")
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800245else
246 $(error Please execute source scripts/env.sh)
247endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800248
xiaohu.huang4303e262023-07-14 16:04:32 +0800249################################################################
250## Target command:make docs DOCS_ARCH=[arm|arm64|riscv|xtensa]
251################################################################
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800252.PHONY: docs
253docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800254 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
xiaohu.huangd7df85c2023-07-12 18:58:59 +0800255 @ if [ ! -d $($@_DIR) ]; then \
xiaohu.huang4303e262023-07-14 16:04:32 +0800256 echo "$($@_DIR) is not exist,please set project first with: source scripts/env.sh"; \
xiaohu.huangd7df85c2023-07-12 18:58:59 +0800257 else \
258 echo "It is generated docs in $($@_BUILD_DIR) from $($@_DIR)."; \
259 (cd $($@_BUILD_DIR) && cmake $($@_DIR) -D ARCH_NAME=$(DOCS_ARCH) && make); \
260 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800261
262################################################################
263# Respective Targets
264################################################################
265# Buildsystem Targets
266$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
267
268# CMake Build Targets
269$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
270
271# Build Targets
272$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
273
274# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800275#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800276
277# Dist Targets
278$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
279
280# Clean Targets
281$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
282
283.PHONY: toolchain
284toolchain:
285ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800286 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800287endif
shijie.xiong7760b3e2024-05-08 11:21:23 +0800288 @ if [[ "$(ARCH)" == "arm" || "$(ARCH)" == "arm64" ]]; then \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800289 if [ ! -d $($@_DIR) ]; then \
shijie.xiong1584d902023-07-03 16:07:59 +0800290 $(call MESSAGE,"Extracting $@"); \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800291 mkdir -p $($@_DIR); \
kelvin.zhang24420712022-03-07 17:40:34 +0800292 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
293 touch $($@_DIR); \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800294 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800295 if ( find $(CROSSTOOL).tar.xz -newer $($@_DIR) | grep -q $(CROSSTOOL).tar.xz ); then \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800296 $(call MESSAGE,"Updating $@"); \
297 rm -rf $($@_DIR)/*; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800298 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800299 touch $($@_DIR); \
300 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800301 if [ -f $(CROSSTOOL).patch ]; then \
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +0800302 cd $(output_DIR)/toolchains; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800303 if patch -N -f -s --dry-run -p0 < $(CROSSTOOL).patch >/dev/null; then \
304 $(call MESSAGE,"Preparing $@"); \
305 patch -s -p0 < $(CROSSTOOL).patch; \
306 fi; \
307 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800308 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800309
kelvin.zhangded42a02021-10-21 14:31:37 +0800310.PHONY: menuconfig
Kelvin Zhanga3779812022-01-15 12:17:11 +0800311menuconfig: toolchain $(kernel_BUILD_DIR)
kelvin.zhangded42a02021-10-21 14:31:37 +0800312 @ cmake --build $(kernel_BUILD_DIR) --target $@
313
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800314.PHONY: flash
315flash:
316 @ if [ -d $(DIST_DIR) ]; then \
317 (cd $(DIST_DIR) && \
318 ./update_fw.sh;) \
319 fi
320
shijie.xionga04c8b82022-03-17 14:01:53 +0800321.PHONY: backtrace
322backtrace:
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800323 @make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800324 make -f $(build_DIR)/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800325 make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800326 make -f $(build_DIR)/symtable.mk clean
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800327
shijie.xiong696e0462022-03-31 15:27:36 +0800328.PHONY: package
329package:
shijie.xiong1584d902023-07-03 16:07:59 +0800330 ./scripts/package.sh
shijie.xiong696e0462022-03-31 15:27:36 +0800331
Kelvin Zhang57652c42024-04-30 11:25:55 +0800332DOC_PROJECT_NUMBER_LINE = $(shell grep "PROJECT_NUMBER.*=" $(docs_DIR)/Doxyfile)
333
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800334.PHONY: release
335release:
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800336 @ if [ -f $(PRJDIR)/CMakeLists.txt ] && [ -f $(PRJDIR)/Kconfig ] && [ -f $(kernel_BUILD_DIR)/sdk_ver.h ]; then \
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +0800337 sed -i '/#define CONFIG_VERSION_STRING/d' $(kernel_BUILD_DIR)/sdk_ver.h; \
338 echo "#define CONFIG_VERSION_STRING \"$(RELEASE_VERSION)\"" >> $(kernel_BUILD_DIR)/sdk_ver.h; \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800339 [ -d $(docs_DIR) ] && sed -i 's/PROJECT_NUMBER.*=.*/PROJECT_NUMBER = $(RELEASE_VERSION)/' $(docs_DIR)/Doxyfile; \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800340 (cd .. && \
341 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=gcc-aarch64-none-elf --exclude=gcc-riscv-none \
342 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800343 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR); \
344 cd - > /dev/null); \
Kelvin Zhang57652c42024-04-30 11:25:55 +0800345 sed -i 's/PROJECT_NUMBER.*=.*/$(DOC_PROJECT_NUMBER_LINE)/' $(docs_DIR)/Doxyfile; \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800346 else \
347 echo "Please execute make in advance!"; \
Kelvin Zhang845f46b2021-12-29 14:00:14 +0800348 fi