blob: a2f051bff2d35b4e6c03117c3b2a863acfe1fdc1 [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
Keguang Zhangdcae2472024-05-11 15:48:41 +080039OUTPUT_DIR := $(PRJDIR)/output
40BUILD_DIR := $(OUTPUT_DIR)/$(ARCH)-$(BOARD)-$(PRODUCT)
41docs_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)
Keguang Zhangdcae2472024-05-11 15:48:41 +080063TOOLCHAIN_DIR := $(OUTPUT_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
64PATH := $(TOOLCHAIN_DIR)/bin:$(PATH)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080065
shijie.xiong7760b3e2024-05-08 11:21:23 +080066#This code segment is used to set the path of the compiler for the find_compiler.cmake to search.
Keguang Zhangdcae2472024-05-11 15:48:41 +080067ifeq ($(ARCH),xtensa)
shijie.xiong7760b3e2024-05-08 11:21:23 +080068 XTENSA_LOWPOWER_PATTERN=_lowpower
69 ifeq ($(SOC),$(filter $(SOC),a5 t3x s6))
70 XTENSA_CORE = Amlogic_v9
71 XTENSA_TOOLCHAIN_VER = RI-2020.5-linux
72 else ifeq ($(SOC),a1)
73 ifeq ($(findstring $(XTENSA_LOWPOWER_PATTERN),$(BOARD)),$(XTENSA_LOWPOWER_PATTERN))
74 XTENSA_CORE = Amlogic_v2
75 else
76 XTENSA_CORE = Amlogic_v0
77 endif
78 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
79 else
80 XTENSA_CORE = Amlogic_v0
81 XTENSA_TOOLCHAIN_VER = RG-2018.9-linux
82 endif
83 TOOLCHAIN_PATH=/opt/xtensa/XtDevTools/install/tools/$(XTENSA_TOOLCHAIN_VER)/XtensaTools
84 XTENSA_SYSTEM=/opt/xtensa/XtDevTools/install/builds/$(XTENSA_TOOLCHAIN_VER)/$(XTENSA_CORE)/config
Xiaohu.Huangb7f78e92021-12-22 10:56:29 +080085endif
Xiaohu.Huangc2e6cfd2021-12-13 17:08:20 +080086
Kelvin Zhang3aff9c32024-05-13 14:01:16 +080087export PATH ARCH SOC BOARD KERNEL SDK_BASE OUTPUT_DIR kernel_BUILD_DIR TOOLCHAIN_PATH XTENSA_CORE XTENSA_SYSTEM
kelvin.zhanga4497cf2021-10-13 17:31:59 +080088
89################################################################
90# Macros
91################################################################
92# MESSAGE Macro -- display a message in bold type
93MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
94TERM_BOLD := $(shell tput smso 2>/dev/null)
95TERM_RESET := ${shell tput rmso 2>/dev/null}
96
kelvin.zhanga4497cf2021-10-13 17:31:59 +080097# Macro of Generating Buildsystem
98# $(1): Target
99define GENERATE_BUILDSYSTEM
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800100$($(1)_BUILD_DIR): project
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800101 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +0800102# Auto-generate root CMakeLists.txt and Kconfig
Kelvin Zhang3aff9c32024-05-13 14:01:16 +0800103 @ ./scripts/setup.sh
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800104 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
xiaohu.huanga1268fd2022-06-07 11:10:48 +0800105 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 +0800106 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800107endef
108
109# Macro of Building CMake Targets
110# $(1): Target
111define GENERATE_CMAKE_TARGET
112.PHONY: $(1)
113$(1): toolchain $($(1)_BUILD_DIR)
114 @ $(call MESSAGE,"Building $(1)")
115 @ (if [ $(1) == kernel ]; then \
116 cmake --build $($(1)_BUILD_DIR); \
117 else \
118 if [ $(1) == bootloader ]; then \
119 if [ ! -d $(kernel_KEYPATH) ]; then \
120 mkdir -p $(kernel_KEYPATH); \
121 fi; \
122 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
123 $(call MESSAGE,"Generating kernel key pair ..."); \
124 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
125 fi; \
126 $(call MESSAGE,"Attach kernel public key"); \
127 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
128 if [ ! -d $($(1)_KEYPATH) ]; then \
129 $(call MESSAGE,"Generating $(1) key pair ..."); \
130 mkdir -p $($(1)_KEYPATH); \
131 fi; \
132 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
133 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
134 fi; \
135 fi; \
136 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
137 cmake --build ./ -- install; \
138 fi \
139 )
140endef
141
142# Macro of Building Targets
143# $(1): Target
144define GENERATE_MAKE_TARGET
145.PHONY: $(1)
146$(1): toolchain
147 @ $(call MESSAGE,"Building $(1)")
148 @ (cd $($(1)_DIR) && $(MAKE))
149endef
150
151# Macro of Menuconfig Targets
152# $(1): Target
153# $(2): Target suffix
154define GENERATE_MENUCONFIG_TARGET
155.PHONY: $(if $(2),$(1)-$(2),$(1))
156$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
157 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
158endef
159
160# Macro of Building Dist Targets
161# $(1): Target
162# $(2): Target suffix
163define GENERATE_DIST_TARGET
164.PHONY: $(if $(2),$(1)-$(2),$(1))
165$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
166 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
167endef
168
169# Macro of Cleaning Targets
170# $(1): Target
171# $(2): Target suffix
172define GENERATE_CLEAN_TARGET
173.PHONY: $(if $(2),$(1)-$(2),$(1))
174$(if $(2),$(1)-$(2),$(1)):
175 @ $(call MESSAGE,"Cleaning $(1)")
176 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
177endef
178
179# Macro of Signing Image
180# $(1): target binary
181# $(2): header length
182define SIGN_IMAGE
183 if [ $(1) == bootloader ]; then \
184 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
185 else \
186 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
187 fi
188endef
189
shijie.xiong975f4572023-10-11 14:12:34 +0800190# Macro of Segment Image
191# $(1): segment makefile
192define SEGMENT_IMAGE
shijie.xiong16db2842024-01-24 13:52:40 +0800193 @ if [ -f $(1) ]; then \
shijie.xiong975f4572023-10-11 14:12:34 +0800194 make -f $(1) scatter; \
195 fi
196endef
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800197################################################################
198# Targets
199################################################################
200BUILDSYSTEM_TARGETS := kernel
201CMAKE_TARGETS := kernel
xiaohu.huang91395a52024-11-06 15:45:15 +0800202MAKE_TARGETS :=
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800203MENUCONFIG_TARGETS := kernel
204INSTALL_TARGETS := $(CMAKE_TARGETS)
205ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
206DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
207CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
208
shijie.xiong7ab71f12024-10-16 14:44:30 +0800209###############################################################################################################################
210# $(build_DIR)/scatter_load.mk is not present by default. when segmentation functionality is required,
211# the CMakeLists within the module needing segmentation will invoke gen_scatter_lib.sh to generate $(build_DIR)/scatter_load.mk,
212# which includes segmentation rules, thereby triggering this functionality.
213###############################################################################################################################
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800214.PHONY: dist
215dist: all $(DIST_TARGETS)
shijie.xiong975f4572023-10-11 14:12:34 +0800216 $(call SEGMENT_IMAGE,$(build_DIR)/scatter_load.mk)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800217# $(call SIGN_IMAGE,bootloader,512)
Yang Lif1686482022-10-25 22:41:55 -0700218# $(call SIGN_IMAGE,kernel,1024)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800219
220$(DIST_DIR):
221 @ install -d $(DIST_DIR)
222
223.PHONY: all
224all: $(ALL_TARGETS)
225
226.PHONY: clean
227clean: $(CLEAN_TARGETS)
228
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800229ifndef_any_of = $(filter undefined,$(foreach v,$(1),$(origin $(v))))
230
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800231.PHONY: distclean
232distclean:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800233ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800234 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800235else
Keguang Zhangdcae2472024-05-11 15:48:41 +0800236 @ if [ -d $(OUTPUT_DIR) ]; then rm -rf $(OUTPUT_DIR); fi
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800237endif
shijie.xiong7ab71f12024-10-16 14:44:30 +0800238 @ if [ -f $(build_DIR)/scatter_load.mk ]; then rm -f $(build_DIR)/scatter_load.mk; fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800239
Kelvin Zhang0d2787f2021-12-16 09:59:42 +0800240.PHONY: project
241project:
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800242ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
Kelvin Zhang21851072022-03-02 11:21:06 +0800243 @ $(call MESSAGE,"Building $(ARCH) $(SOC) $(BOARD) $(PRODUCT)")
Kelvin Zhangd10b38e2022-06-09 18:12:29 +0800244else
245 $(error Please execute source scripts/env.sh)
246endif
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800247
xiaohu.huang4303e262023-07-14 16:04:32 +0800248################################################################
xiaohu.huang8e311612024-11-12 14:56:26 +0800249## Target command:make [docs|docs-clean] DOCS_ARCH=[arm|arm64|riscv|xtensa]
xiaohu.huang4303e262023-07-14 16:04:32 +0800250################################################################
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800251.PHONY: docs
252docs:
Kelvin Zhang681f7392022-01-11 14:06:31 +0800253 @ if [ ! -d $($@_BUILD_DIR) ]; then mkdir -p $($@_BUILD_DIR); fi
xiaohu.huangd7df85c2023-07-12 18:58:59 +0800254 @ if [ ! -d $($@_DIR) ]; then \
xiaohu.huang4303e262023-07-14 16:04:32 +0800255 echo "$($@_DIR) is not exist,please set project first with: source scripts/env.sh"; \
xiaohu.huangd7df85c2023-07-12 18:58:59 +0800256 else \
xiaohu.huang8e311612024-11-12 14:56:26 +0800257 echo "Generated docs in $($@_BUILD_DIR) from $($@_DIR)."; \
258 (rm -rf $($@_BUILD_DIR)/CMakeCache.txt \
259 && cd $($@_BUILD_DIR) \
260 && cmake $($@_DIR) -DARCH_NAME=$(DOCS_ARCH) \
261 -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(DOCS_ARCH)_compiler.cmake \
262 && make); \
xiaohu.huangd7df85c2023-07-12 18:58:59 +0800263 fi
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800264
xiaohu.huang8e311612024-11-12 14:56:26 +0800265.PHONY: docs-clean
266docs-clean:
267ifeq ($(call ifndef_any_of,ARCH SOC BOARD PRODUCT),)
268 @ if [ -d $(docs_BUILD_DIR) ]; then rm -rf $(docs_BUILD_DIR); fi
269else
270 @ if [ -d $(OUTPUT_DIR)/docs ]; then rm -rf $(OUTPUT_DIR)/docs; fi
271endif
272
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800273################################################################
274# Respective Targets
275################################################################
276# Buildsystem Targets
277$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
278
279# CMake Build Targets
280$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
281
282# Build Targets
283$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
284
285# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800286#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800287
288# Dist Targets
289$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
290
291# Clean Targets
292$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
293
294.PHONY: toolchain
295toolchain:
Keguang Zhangdcae2472024-05-11 15:48:41 +0800296 @ ./scripts/prepare_toolchain.sh
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800297
kelvin.zhangded42a02021-10-21 14:31:37 +0800298.PHONY: menuconfig
Kelvin Zhanga3779812022-01-15 12:17:11 +0800299menuconfig: toolchain $(kernel_BUILD_DIR)
kelvin.zhangded42a02021-10-21 14:31:37 +0800300 @ cmake --build $(kernel_BUILD_DIR) --target $@
301
xiaohu.huang8e311612024-11-12 14:56:26 +0800302%defconfig:config-clean toolchain
xiaohu.huang9f576102024-10-30 15:00:08 +0800303 @ make $(kernel_BUILD_DIR) BOARD_SPEC_CONFIG=$@
304 @ echo "configuration $@ written to $(kernel_BUILD_DIR)/.config"
xiaohu.huang330893f2024-10-18 11:28:10 +0800305
xiaohu.huang0e824732024-07-16 17:24:42 +0800306.PHONY: config
xiaohu.huang8e311612024-11-12 14:56:26 +0800307config: config-clean toolchain
xiaohu.huang9f576102024-10-30 15:00:08 +0800308 @ make $(kernel_BUILD_DIR) BOARD_SPEC_CONFIG=defconfig
309 @ echo "configuration defconfig written to $(kernel_BUILD_DIR)/.config"
xiaohu.huang330893f2024-10-18 11:28:10 +0800310
xiaohu.huang8e311612024-11-12 14:56:26 +0800311.PHONY: config-clean
312config-clean:
xiaohu.huang9f576102024-10-30 15:00:08 +0800313 @ if [ -f $(kernel_BUILD_DIR)/build.ninja ]; then \
314 rm -f $(kernel_BUILD_DIR)/build.ninja; \
315 fi
xiaohu.huang0e824732024-07-16 17:24:42 +0800316
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800317.PHONY: flash
318flash:
319 @ if [ -d $(DIST_DIR) ]; then \
320 (cd $(DIST_DIR) && \
321 ./update_fw.sh;) \
322 fi
323
shijie.xionga04c8b82022-03-17 14:01:53 +0800324.PHONY: backtrace
325backtrace:
Kelvin Zhange0ae61b2024-05-13 18:21:46 +0800326 @ make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800327 make -f $(build_DIR)/symtable.mk backtrace && \
Xiaohu.Huangaed65992022-01-13 11:21:51 +0800328 make && \
kelvin.zhang65fedc32022-01-14 21:53:28 +0800329 make -f $(build_DIR)/symtable.mk clean
Xiaohu.Huang3ebdbc92022-01-12 14:55:59 +0800330
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800331.PHONY: release
332release:
Kelvin Zhange0ae61b2024-05-13 18:21:46 +0800333 @ ./scripts/gen_release.sh