blob: 65e7abea4699dae5a87140ecf67ebe16e247caea [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
32BUILD_DIR := $(PRJDIR)/output/$(BOARD)-$(PRODUCT)
33docs_BUILD_DIR := $(PRJDIR)/output/docs
34bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
35kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
36sign_tool_BUILD_DIR := $(sign_tool_DIR)
37adnl_BUILD_DIR := $(adnl_DIR)
38
39bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
40kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
41fw_BIN := $(fw_DIR)/wcn-modem.bin
42adnl_BIN := $(adnl_BUILD_DIR)/adnl
43
44DIST_DIR := $(BUILD_DIR)/images
45bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
46kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
47fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
48adnl_dist_BIN := $(DIST_DIR)/adnl
49
50bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
51kernel_KEYPATH = $(build_DIR)/key/rsa/2048
52SIGNTOOL = $(sign_tool_DIR)/imgtool.py
53
54SDK_BASE := $(PRJDIR)
55toolchain_DIR := $(build_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
56CROSSTOOL := $(build_DIR)/toolchains/$(COMPILER)*$(TOOLCHAIN_KEYWORD)*.tar.xz
57PATH := $(toolchain_DIR)/bin:$(PATH)
58
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080059#xtensa toolchain option by soc name
60ifeq ($(SOC),a5)
61 XTENSA_CORE = Amlogic_v9
62 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RI-2020.5-linux/XtensaTools
63 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RI-2020.5-linux/${XTENSA_CORE}/config
64else
65 #a1 and default toolchain option
66 XTENSA_CORE = Amlogic_v0
67 XTENSA_HOME = /opt/xtensa/XtDevTools/install/tools/RG-2018.9-linux/XtensaTools
68 XTENSA_SYSTEM = /opt/xtensa/XtDevTools/install/builds/RG-2018.9-linux/${XTENSA_CORE}/config
69endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080070PATH := ${XTENSA_HOME}/bin:${PATH}
71
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080072export PATH ARCH SOC BOARD KERNEL SDK_BASE kernel_BUILD_DIR XTENSA_CORE XTENSA_HOME XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080073
74################################################################
75# Macros
76################################################################
77# MESSAGE Macro -- display a message in bold type
78MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
79TERM_BOLD := $(shell tput smso 2>/dev/null)
80TERM_RESET := ${shell tput rmso 2>/dev/null}
81
Kelvin Zhang845f46b2021-12-29 14:00:14 +080082RELEASE_VERSION := "$(shell date +%g.%V.%u)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +080083
84# Macro of Generating Buildsystem
85# $(1): Target
86define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080087$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080088 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080089# Auto-generate root CMakeLists.txt and Kconfig
Kelvin Zhangab840b22022-01-14 10:37:05 +080090 @ ./scripts/setup.sh $($(1)_BUILD_DIR)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080091 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080092 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 +080093 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +080094endef
95
96# Macro of Building CMake Targets
97# $(1): Target
98define GENERATE_CMAKE_TARGET
99.PHONY: $(1)
100$(1): toolchain $($(1)_BUILD_DIR)
101 @ $(call MESSAGE,"Building $(1)")
102 @ (if [ $(1) == kernel ]; then \
103 cmake --build $($(1)_BUILD_DIR); \
104 else \
105 if [ $(1) == bootloader ]; then \
106 if [ ! -d $(kernel_KEYPATH) ]; then \
107 mkdir -p $(kernel_KEYPATH); \
108 fi; \
109 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
110 $(call MESSAGE,"Generating kernel key pair ..."); \
111 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
112 fi; \
113 $(call MESSAGE,"Attach kernel public key"); \
114 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
115 if [ ! -d $($(1)_KEYPATH) ]; then \
116 $(call MESSAGE,"Generating $(1) key pair ..."); \
117 mkdir -p $($(1)_KEYPATH); \
118 fi; \
119 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
120 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
121 fi; \
122 fi; \
123 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
124 cmake --build ./ -- install; \
125 fi \
126 )
127endef
128
129# Macro of Building Targets
130# $(1): Target
131define GENERATE_MAKE_TARGET
132.PHONY: $(1)
133$(1): toolchain
134 @ $(call MESSAGE,"Building $(1)")
135 @ (cd $($(1)_DIR) && $(MAKE))
136endef
137
138# Macro of Menuconfig Targets
139# $(1): Target
140# $(2): Target suffix
141define GENERATE_MENUCONFIG_TARGET
142.PHONY: $(if $(2),$(1)-$(2),$(1))
143$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
144 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
145endef
146
147# Macro of Building Dist Targets
148# $(1): Target
149# $(2): Target suffix
150define GENERATE_DIST_TARGET
151.PHONY: $(if $(2),$(1)-$(2),$(1))
152$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
153 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
154endef
155
156# Macro of Cleaning Targets
157# $(1): Target
158# $(2): Target suffix
159define GENERATE_CLEAN_TARGET
160.PHONY: $(if $(2),$(1)-$(2),$(1))
161$(if $(2),$(1)-$(2),$(1)):
162 @ $(call MESSAGE,"Cleaning $(1)")
163 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
164endef
165
166# Macro of Signing Image
167# $(1): target binary
168# $(2): header length
169define SIGN_IMAGE
170 if [ $(1) == bootloader ]; then \
171 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
172 else \
173 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
174 fi
175endef
176
177################################################################
178# Targets
179################################################################
180BUILDSYSTEM_TARGETS := kernel
181CMAKE_TARGETS := kernel
182#MAKE_TARGETS := adnl
183MENUCONFIG_TARGETS := kernel
184INSTALL_TARGETS := $(CMAKE_TARGETS)
185ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
186DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
187CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
188
189.PHONY: dist
190dist: all $(DIST_TARGETS)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800191# $(call SIGN_IMAGE,bootloader,512)
192# $(call SIGN_IMAGE,kernel,1024)
193
194$(DIST_DIR):
195 @ install -d $(DIST_DIR)
196
197.PHONY: all
198all: $(ALL_TARGETS)
199
200.PHONY: clean
201clean: $(CLEAN_TARGETS)
202
203.PHONY: distclean
204distclean:
205 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
206
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800207.PHONY: project
208project:
209ifndef ARCH
210 $(error ARCH is not set, Please execute source scripts/env.sh)
211endif
212ifndef SOC
213 $(error SOC is not set, Please execute source scripts/env.sh)
214endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800215ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800216 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800217endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800218ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800219 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800220endif
Kelvin Zhangb3faf312021-12-16 13:56:49 +0800221 @ $(call MESSAGE,"Building $(BOARD) \($(SOC)\) $(PRODUCT)")
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800222
223.PHONY: docs
224docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800225 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
Kelvin Zhang2d0b2512022-01-13 14:45:00 +0800226 @ (cd $($@_BUILD_DIR); \
Kelvin Zhang681f7392022-01-11 14:06:31 +0800227 cmake $($@_DIR); \
228 make)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800229
230################################################################
231# Respective Targets
232################################################################
233# Buildsystem Targets
234$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
235
236# CMake Build Targets
237$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
238
239# Build Targets
240$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
241
242# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800243#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800244
245# Dist Targets
246$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
247
248# Clean Targets
249$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
250
251.PHONY: toolchain
252toolchain:
253ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800254 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800255endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +0800256 @ if [[ "$(TOOLCHAIN_KEYWORD)-$(COMPILER)" != "xt-xcc" ]]; then \
257 if [ ! -d $($@_DIR) ]; then \
258 $(call MESSAGE,"Preparing $@"); \
259 mkdir -p $($@_DIR); \
260 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
261 touch $($@_DIR); \
262 fi; \
263 if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
264 $(call MESSAGE,"Updating $@"); \
265 rm -rf $($@_DIR)/*; \
266 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
267 touch $($@_DIR); \
268 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800269 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800270
kelvin.zhangded42a02021-10-21 14:31:37 +0800271.PHONY: menuconfig
272menuconfig: $(kernel_BUILD_DIR)
273 @ cmake --build $(kernel_BUILD_DIR) --target $@
274
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800275.PHONY: flash
276flash:
277 @ if [ -d $(DIST_DIR) ]; then \
278 (cd $(DIST_DIR) && \
279 ./update_fw.sh;) \
280 fi
281
Xiaohu.Huangbdc7c5f2022-01-13 16:56:27 +0800282ifeq ($(STACKTRACE_ENABLE),1)
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800283.PHONY: stacktrace
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800284stacktrace:
285 @make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800286 make -f $(build_DIR)/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800287 make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800288 make -f $(build_DIR)/symtable.mk clean
Xiaohu.Huangbdc7c5f2022-01-13 16:56:27 +0800289endif
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800290
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