blob: ed6d66d6a9c502985cf709effc506ba28f160eac [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)
24build_DIR := $(PRJDIR)/build
25docs_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 Zhanga1ede002021-12-30 16:48:21 +080083#SDK_VERSION := "$(shell date +%g.%V.%u" "%H:%M:%S)"
84SDK_VERSION := "$(shell date +%F" "%T)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +080085
86# Macro of Generating Buildsystem
87# $(1): Target
88define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +080089$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +080090 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080091# Auto-generate root CMakeLists.txt and Kconfig
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080092 @ ./scripts/setup.sh
kelvin.zhanga4497cf2021-10-13 17:31:59 +080093 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080094 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 +080095 echo "#define CONFIG_BOARD_NAME \"$(BOARD)\"" >> $($(1)_BUILD_DIR)/sdk_version.h; \
96 echo "#define CONFIG_PRODUCT_NAME \"$(PRODUCT)\"" >> $($(1)_BUILD_DIR)/sdk_version.h; \
97 fi; \
98 sed -i '/#define CONFIG_VERSION_STRING/d' $($(1)_BUILD_DIR)/sdk_version.h; \
99 echo "#define CONFIG_VERSION_STRING \"$(SDK_VERSION)\"" >> $($(1)_BUILD_DIR)/sdk_version.h
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800100endef
101
102# Macro of Building CMake Targets
103# $(1): Target
104define GENERATE_CMAKE_TARGET
105.PHONY: $(1)
106$(1): toolchain $($(1)_BUILD_DIR)
107 @ $(call MESSAGE,"Building $(1)")
108 @ (if [ $(1) == kernel ]; then \
109 cmake --build $($(1)_BUILD_DIR); \
110 else \
111 if [ $(1) == bootloader ]; then \
112 if [ ! -d $(kernel_KEYPATH) ]; then \
113 mkdir -p $(kernel_KEYPATH); \
114 fi; \
115 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
116 $(call MESSAGE,"Generating kernel key pair ..."); \
117 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
118 fi; \
119 $(call MESSAGE,"Attach kernel public key"); \
120 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
121 if [ ! -d $($(1)_KEYPATH) ]; then \
122 $(call MESSAGE,"Generating $(1) key pair ..."); \
123 mkdir -p $($(1)_KEYPATH); \
124 fi; \
125 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
126 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
127 fi; \
128 fi; \
129 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
130 cmake --build ./ -- install; \
131 fi \
132 )
133endef
134
135# Macro of Building Targets
136# $(1): Target
137define GENERATE_MAKE_TARGET
138.PHONY: $(1)
139$(1): toolchain
140 @ $(call MESSAGE,"Building $(1)")
141 @ (cd $($(1)_DIR) && $(MAKE))
142endef
143
144# Macro of Menuconfig Targets
145# $(1): Target
146# $(2): Target suffix
147define GENERATE_MENUCONFIG_TARGET
148.PHONY: $(if $(2),$(1)-$(2),$(1))
149$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
150 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
151endef
152
153# Macro of Building Dist Targets
154# $(1): Target
155# $(2): Target suffix
156define GENERATE_DIST_TARGET
157.PHONY: $(if $(2),$(1)-$(2),$(1))
158$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
159 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
160endef
161
162# Macro of Cleaning Targets
163# $(1): Target
164# $(2): Target suffix
165define GENERATE_CLEAN_TARGET
166.PHONY: $(if $(2),$(1)-$(2),$(1))
167$(if $(2),$(1)-$(2),$(1)):
168 @ $(call MESSAGE,"Cleaning $(1)")
169 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
170endef
171
172# Macro of Signing Image
173# $(1): target binary
174# $(2): header length
175define SIGN_IMAGE
176 if [ $(1) == bootloader ]; then \
177 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
178 else \
179 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
180 fi
181endef
182
183################################################################
184# Targets
185################################################################
186BUILDSYSTEM_TARGETS := kernel
187CMAKE_TARGETS := kernel
188#MAKE_TARGETS := adnl
189MENUCONFIG_TARGETS := kernel
190INSTALL_TARGETS := $(CMAKE_TARGETS)
191ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
192DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
193CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
194
195.PHONY: dist
196dist: all $(DIST_TARGETS)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800197# $(call SIGN_IMAGE,bootloader,512)
198# $(call SIGN_IMAGE,kernel,1024)
199
200$(DIST_DIR):
201 @ install -d $(DIST_DIR)
202
203.PHONY: all
204all: $(ALL_TARGETS)
205
206.PHONY: clean
207clean: $(CLEAN_TARGETS)
208
209.PHONY: distclean
210distclean:
211 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
212
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800213.PHONY: project
214project:
215ifndef ARCH
216 $(error ARCH is not set, Please execute source scripts/env.sh)
217endif
218ifndef SOC
219 $(error SOC is not set, Please execute source scripts/env.sh)
220endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800221ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800222 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800223endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800224ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800225 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800226endif
Kelvin Zhangb3faf312021-12-16 13:56:49 +0800227 @ $(call MESSAGE,"Building $(BOARD) \($(SOC)\) $(PRODUCT)")
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.Huangc2e6cfd2021-12-13 17:08:20 +0800262 @ if [[ "$(TOOLCHAIN_KEYWORD)-$(COMPILER)" != "xt-xcc" ]]; then \
263 if [ ! -d $($@_DIR) ]; then \
264 $(call MESSAGE,"Preparing $@"); \
265 mkdir -p $($@_DIR); \
266 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
267 touch $($@_DIR); \
268 fi; \
269 if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
270 $(call MESSAGE,"Updating $@"); \
271 rm -rf $($@_DIR)/*; \
272 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
273 touch $($@_DIR); \
274 fi; \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800275 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800276
kelvin.zhangded42a02021-10-21 14:31:37 +0800277.PHONY: menuconfig
278menuconfig: $(kernel_BUILD_DIR)
279 @ cmake --build $(kernel_BUILD_DIR) --target $@
280
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800281.PHONY: flash
282flash:
283 @ if [ -d $(DIST_DIR) ]; then \
284 (cd $(DIST_DIR) && \
285 ./update_fw.sh;) \
286 fi
287
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800288.PHONY: stacktrace
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800289stacktrace:
290 @make && \
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800291 make -f $(PRJDIR)/build/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800292 make && \
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800293 make -f $(PRJDIR)/build/symtable.mk clean
294
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800295.PHONY: release
296release:
Kelvin Zhanga1ede002021-12-30 16:48:21 +0800297 @ if [ -f $(PRJDIR)/CMakeLists.txt ] && [ -f $(PRJDIR)/Kconfig ]; then \
298 (cd .. && \
299 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=gcc-aarch64-none-elf --exclude=gcc-riscv-none \
300 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
301 rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
302 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR)); \
303 else \
304 echo "Please execute make in advance!"; \
Kelvin Zhang845f46b2021-12-29 14:00:14 +0800305 fi