blob: 83319201d1032f85f834cb379b84412f0657140d [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
29sign_tool_DIR := $(PRJDIR)/tools/sign_tool
30adnl_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
61ifeq ($(SOC),a5)
62 XTENSA_CORE = Amlogic_v9
63 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RI-2020.5-linux/XtensaTools
64 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RI-2020.5-linux/${XTENSA_CORE}/config
65else
66 #a1 and default toolchain option
67 XTENSA_CORE = Amlogic_v0
68 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RG-2018.9-linux/XtensaTools
69 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RG-2018.9-linux/${XTENSA_CORE}/config
70endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080071PATH := ${XTENSA_HOME}/bin:${PATH}
72
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080073export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR XTENSA_CORE XTENSA_HOME XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080074
75################################################################
76# Macros
77################################################################
78# MESSAGE Macro -- display a message in bold type
79MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
80TERM_BOLD := $(shell tput smso 2>/dev/null)
81TERM_RESET := ${shell tput rmso 2>/dev/null}
82
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +080083RELEASE_VERSION := "$(shell date +%y.%m.%d)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +080084
85# Macro of Generating Buildsystem
86# $(1): Target
87define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080088$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080089 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080090# Auto-generate root CMakeLists.txt and Kconfig
Kelvin Zhangab840b22022-01-14 10:37:05 +080091 @ ./scripts/setup.sh $($(1)_BUILD_DIR)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080092 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080093 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
Kelvin Zhangab840b22022-01-14 10:37:05 +080094 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +080095endef
96
97# Macro of Building CMake Targets
98# $(1): Target
99define GENERATE_CMAKE_TARGET
100.PHONY: $(1)
101$(1): toolchain $($(1)_BUILD_DIR)
102 @ $(call MESSAGE,"Building $(1)")
103 @ (if [ $(1) == kernel ]; then \
104 cmake --build $($(1)_BUILD_DIR); \
105 else \
106 if [ $(1) == bootloader ]; then \
107 if [ ! -d $(kernel_KEYPATH) ]; then \
108 mkdir -p $(kernel_KEYPATH); \
109 fi; \
110 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
111 $(call MESSAGE,"Generating kernel key pair ..."); \
112 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
113 fi; \
114 $(call MESSAGE,"Attach kernel public key"); \
115 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
116 if [ ! -d $($(1)_KEYPATH) ]; then \
117 $(call MESSAGE,"Generating $(1) key pair ..."); \
118 mkdir -p $($(1)_KEYPATH); \
119 fi; \
120 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
121 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
122 fi; \
123 fi; \
124 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
125 cmake --build ./ -- install; \
126 fi \
127 )
128endef
129
130# Macro of Building Targets
131# $(1): Target
132define GENERATE_MAKE_TARGET
133.PHONY: $(1)
134$(1): toolchain
135 @ $(call MESSAGE,"Building $(1)")
136 @ (cd $($(1)_DIR) && $(MAKE))
137endef
138
139# Macro of Menuconfig Targets
140# $(1): Target
141# $(2): Target suffix
142define GENERATE_MENUCONFIG_TARGET
143.PHONY: $(if $(2),$(1)-$(2),$(1))
144$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
145 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
146endef
147
148# Macro of Building Dist Targets
149# $(1): Target
150# $(2): Target suffix
151define GENERATE_DIST_TARGET
152.PHONY: $(if $(2),$(1)-$(2),$(1))
153$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
154 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
155endef
156
157# Macro of Cleaning Targets
158# $(1): Target
159# $(2): Target suffix
160define GENERATE_CLEAN_TARGET
161.PHONY: $(if $(2),$(1)-$(2),$(1))
162$(if $(2),$(1)-$(2),$(1)):
163 @ $(call MESSAGE,"Cleaning $(1)")
164 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
165endef
166
167# Macro of Signing Image
168# $(1): target binary
169# $(2): header length
170define SIGN_IMAGE
171 if [ $(1) == bootloader ]; then \
172 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
173 else \
174 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
175 fi
176endef
177
178################################################################
179# Targets
180################################################################
181BUILDSYSTEM_TARGETS := kernel
182CMAKE_TARGETS := kernel
183#MAKE_TARGETS := adnl
184MENUCONFIG_TARGETS := kernel
185INSTALL_TARGETS := $(CMAKE_TARGETS)
186ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
187DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
188CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
189
190.PHONY: dist
191dist: all $(DIST_TARGETS)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800192# $(call SIGN_IMAGE,bootloader,512)
193# $(call SIGN_IMAGE,kernel,1024)
194
195$(DIST_DIR):
196 @ install -d $(DIST_DIR)
197
198.PHONY: all
199all: $(ALL_TARGETS)
200
201.PHONY: clean
202clean: $(CLEAN_TARGETS)
203
204.PHONY: distclean
205distclean:
206 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
207
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800208.PHONY: project
209project:
210ifndef ARCH
211 $(error ARCH is not set, Please execute source scripts/env.sh)
212endif
213ifndef SOC
214 $(error SOC is not set, Please execute source scripts/env.sh)
215endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800216ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800217 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800218endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800219ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800220 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800221endif
Kelvin Zhang21851072022-03-02 11:21:06 +0800222 @ $(call MESSAGE,"Building $(ARCH) $(SOC) $(BOARD) $(PRODUCT)")
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800223
224.PHONY: docs
225docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800226 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
Kelvin Zhang2d0b2512022-01-13 14:45:00 +0800227 @ (cd $($@_BUILD_DIR); \
Kelvin Zhang681f7392022-01-11 14:06:31 +0800228 cmake $($@_DIR); \
229 make)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800230
231################################################################
232# Respective Targets
233################################################################
234# Buildsystem Targets
235$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
236
237# CMake Build Targets
238$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
239
240# Build Targets
241$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
242
243# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800244#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800245
246# Dist Targets
247$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
248
249# Clean Targets
250$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
251
252.PHONY: toolchain
253toolchain:
254ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800255 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800256endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800257 @ if [[ "$(TOOLCHAIN_KEYWORD)-$(COMPILER)" != "xt-xcc" ]]; then \
258 if [ ! -d $($@_DIR) ]; then \
Kelvin Zhang21851072022-03-02 11:21:06 +0800259 $(call MESSAGE,"Extracting $@"); \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800260 mkdir -p $($@_DIR); \
kelvin.zhang24420712022-03-07 17:40:34 +0800261 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
262 touch $($@_DIR); \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800263 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800264 if ( find $(CROSSTOOL).tar.xz -newer $($@_DIR) | grep -q $(CROSSTOOL).tar.xz ); then \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800265 $(call MESSAGE,"Updating $@"); \
266 rm -rf $($@_DIR)/*; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800267 tar -xf $(CROSSTOOL).tar.xz -C $($@_DIR) --strip-components=1; \
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800268 touch $($@_DIR); \
269 fi; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800270 if [ -f $(CROSSTOOL).patch ]; then \
Kelvin Zhangdf6ad2e2022-03-10 16:30:56 +0800271 cd $(output_DIR)/toolchains; \
Kelvin Zhang21851072022-03-02 11:21:06 +0800272 if patch -N -f -s --dry-run -p0 < $(CROSSTOOL).patch >/dev/null; then \
273 $(call MESSAGE,"Preparing $@"); \
274 patch -s -p0 < $(CROSSTOOL).patch; \
275 fi; \
276 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800277 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800278
kelvin.zhangded42a02021-10-21 14:31:37 +0800279.PHONY: menuconfig
Kelvin Zhanga3779812022-01-15 12:17:11 +0800280menuconfig: toolchain $(kernel_BUILD_DIR)
kelvin.zhangded42a02021-10-21 14:31:37 +0800281 @ cmake --build $(kernel_BUILD_DIR) --target $@
282
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800283.PHONY: flash
284flash:
285 @ if [ -d $(DIST_DIR) ]; then \
286 (cd $(DIST_DIR) && \
287 ./update_fw.sh;) \
288 fi
289
shijie.xionga04c8b82022-03-17 14:01:53 +0800290ifeq ($(BACKTRACE_ENABLE),1)
291.PHONY: backtrace
292backtrace:
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800293 @make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800294 make -f $(build_DIR)/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800295 make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800296 make -f $(build_DIR)/symtable.mk clean
Xiaohu.Huangbdc7c5f2022-01-13 16:56:27 +0800297endif
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800298
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800299.PHONY: release
300release:
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800301 @ if [ -f $(PRJDIR)/CMakeLists.txt ] && [ -f $(PRJDIR)/Kconfig ] && [ -f $(kernel_BUILD_DIR)/sdk_ver.h ]; then \
kelvin.zhang4f5ba1e2022-02-10 13:02:49 +0800302 sed -i '/#define CONFIG_VERSION_STRING/d' $(kernel_BUILD_DIR)/sdk_ver.h; \
303 echo "#define CONFIG_VERSION_STRING \"$(RELEASE_VERSION)\"" >> $(kernel_BUILD_DIR)/sdk_ver.h; \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800304 [ -d $(docs_DIR) ] && sed -i 's/PROJECT_NUMBER.*=.*/PROJECT_NUMBER = $(RELEASE_VERSION)/' $(docs_DIR)/Doxyfile; \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800305 (cd .. && \
306 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=gcc-aarch64-none-elf --exclude=gcc-riscv-none \
307 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
Kelvin Zhang3b0d0f42022-02-14 16:53:55 +0800308 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR); \
309 cd - > /dev/null); \
310 (cd $(docs_DIR) && git reset --hard -q && cd - > /dev/null); \
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800311 else \
312 echo "Please execute make in advance!"; \
Kelvin Zhang845f46b2021-12-29 14:00:14 +0800313 fi