blob: 20f18fa895d82224d0b29ba4baba7fd151eceeb2 [file] [log] [blame]
kelvin.zhanga4497cf2021-10-13 17:31:59 +08001################################################################
2# Root Makefile of the whole project
3################################################################
4
5################################################################
6# Basic Definitions
7################################################################
8BOOT :=
9KERNEL ?= freertos
10
11################################################################
12# Directories and Files
13################################################################
14SHELL := /bin/bash
15PWD := $(shell pwd)
16PRJDIR := $(PWD)
17
18app_DIR := $(PRJDIR)/apps
19bootloader_DIR := $(PRJDIR)/$(BOOT)
20build_DIR := $(PRJDIR)/build
21docs_DIR := $(PRJDIR)/docs
22kernel_DIR := $(PRJDIR)/kernel/$(KERNEL)
23fw_DIR := $(PRJDIR)/firmware
24product_DIR := $(PRJDIR)/products
25sign_tool_DIR := $(PRJDIR)/tools/sign_tool
26adnl_DIR := $(PRJDIR)/tools/adnl
27
28BUILD_DIR := $(PRJDIR)/output/$(BOARD)-$(PRODUCT)
29docs_BUILD_DIR := $(PRJDIR)/output/docs
30bootloader_BUILD_DIR := $(BUILD_DIR)/$(BOOT)
31kernel_BUILD_DIR := $(BUILD_DIR)/$(KERNEL)
32sign_tool_BUILD_DIR := $(sign_tool_DIR)
33adnl_BUILD_DIR := $(adnl_DIR)
34
35bootloader_BIN := $(bootloader_BUILD_DIR)/$(BOOT)/ext/mcuboot/mcuboot.bin
36kernel_BIN := $(kernel_BUILD_DIR)/$(KERNEL).bin
37fw_BIN := $(fw_DIR)/wcn-modem.bin
38adnl_BIN := $(adnl_BUILD_DIR)/adnl
39
40DIST_DIR := $(BUILD_DIR)/images
41bootloader_dist_BIN := $(DIST_DIR)/mcuboot-signed.bin
42kernel_dist_BIN := $(DIST_DIR)/$(KERNEL)-signed.bin
43fw_dist_BIN := $(DIST_DIR)/wcn-modem.bin
44adnl_dist_BIN := $(DIST_DIR)/adnl
45
46bootloader_KEYPATH = $(build_DIR)/key/rsa/3072
47kernel_KEYPATH = $(build_DIR)/key/rsa/2048
48SIGNTOOL = $(sign_tool_DIR)/imgtool.py
49
50SDK_BASE := $(PRJDIR)
51toolchain_DIR := $(build_DIR)/toolchains/$(COMPILER)-$(TOOLCHAIN_KEYWORD)
52CROSSTOOL := $(build_DIR)/toolchains/$(COMPILER)*$(TOOLCHAIN_KEYWORD)*.tar.xz
53PATH := $(toolchain_DIR)/bin:$(PATH)
54
yang.li94733152021-11-12 17:59:18 +080055export PATH ARCH BOARD KERNEL SDK_BASE kernel_BUILD_DIR
kelvin.zhanga4497cf2021-10-13 17:31:59 +080056
57################################################################
58# Macros
59################################################################
60# MESSAGE Macro -- display a message in bold type
61MESSAGE = echo "$(TERM_BOLD)>>> $(1)$(TERM_RESET)"
62TERM_BOLD := $(shell tput smso 2>/dev/null)
63TERM_RESET := ${shell tput rmso 2>/dev/null}
64
65SDK_VERSION := "$(shell date +%g.%V.%u)"
66RELEASE_VERSION := "$(shell date +%g.%V.%u_%H_%M_%S)"
67
68# Macro of Generating Buildsystem
69# $(1): Target
70define GENERATE_BUILDSYSTEM
71$($(1)_BUILD_DIR): board
72 @ mkdir -p $($(1)_BUILD_DIR)
Kelvin Zhangc3035322021-12-08 14:22:30 +080073# Auto-generate root CMakeLists.txt and Kconfig
74 @ ./scripts/setup.sh $(MANIFEST_FILE)
kelvin.zhanga4497cf2021-10-13 17:31:59 +080075 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
Xiaohu.Huang7d8a71b2021-11-22 11:17:13 +080076 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
kelvin.zhanga4497cf2021-10-13 17:31:59 +080077 fi
78endef
79
80# Macro of Building CMake Targets
81# $(1): Target
82define GENERATE_CMAKE_TARGET
83.PHONY: $(1)
84$(1): toolchain $($(1)_BUILD_DIR)
85 @ $(call MESSAGE,"Building $(1)")
86 @ (if [ $(1) == kernel ]; then \
87 cmake --build $($(1)_BUILD_DIR); \
88 else \
89 if [ $(1) == bootloader ]; then \
90 if [ ! -d $(kernel_KEYPATH) ]; then \
91 mkdir -p $(kernel_KEYPATH); \
92 fi; \
93 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
94 $(call MESSAGE,"Generating kernel key pair ..."); \
95 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
96 fi; \
97 $(call MESSAGE,"Attach kernel public key"); \
98 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
99 if [ ! -d $($(1)_KEYPATH) ]; then \
100 $(call MESSAGE,"Generating $(1) key pair ..."); \
101 mkdir -p $($(1)_KEYPATH); \
102 fi; \
103 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
104 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
105 fi; \
106 fi; \
107 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
108 cmake --build ./ -- install; \
109 fi \
110 )
111endef
112
113# Macro of Building Targets
114# $(1): Target
115define GENERATE_MAKE_TARGET
116.PHONY: $(1)
117$(1): toolchain
118 @ $(call MESSAGE,"Building $(1)")
119 @ (cd $($(1)_DIR) && $(MAKE))
120endef
121
122# Macro of Menuconfig Targets
123# $(1): Target
124# $(2): Target suffix
125define GENERATE_MENUCONFIG_TARGET
126.PHONY: $(if $(2),$(1)-$(2),$(1))
127$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
128 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
129endef
130
131# Macro of Building Dist Targets
132# $(1): Target
133# $(2): Target suffix
134define GENERATE_DIST_TARGET
135.PHONY: $(if $(2),$(1)-$(2),$(1))
136$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
137 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
138endef
139
140# Macro of Cleaning Targets
141# $(1): Target
142# $(2): Target suffix
143define GENERATE_CLEAN_TARGET
144.PHONY: $(if $(2),$(1)-$(2),$(1))
145$(if $(2),$(1)-$(2),$(1)):
146 @ $(call MESSAGE,"Cleaning $(1)")
147 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
148endef
149
150# Macro of Signing Image
151# $(1): target binary
152# $(2): header length
153define SIGN_IMAGE
154 if [ $(1) == bootloader ]; then \
155 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
156 else \
157 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
158 fi
159endef
160
161################################################################
162# Targets
163################################################################
164BUILDSYSTEM_TARGETS := kernel
165CMAKE_TARGETS := kernel
166#MAKE_TARGETS := adnl
167MENUCONFIG_TARGETS := kernel
168INSTALL_TARGETS := $(CMAKE_TARGETS)
169ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
170DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
171CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
172
173.PHONY: dist
174dist: all $(DIST_TARGETS)
Xiaohu.Huang4f2e8992021-10-28 14:50:14 +0800175#arch for riscv not used the rtos-uImage with the follow command now
kelvin.zhang0cd31542021-11-02 10:11:25 +0800176# mkimage -A $(ARCH) -O u-boot -T standalone -C none -a 0x1000 -e 0x1000 -n rtos -d $(kernel_dist_BIN) $(DIST_DIR)/rtos-uImage
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800177# $(call SIGN_IMAGE,bootloader,512)
178# $(call SIGN_IMAGE,kernel,1024)
179
180$(DIST_DIR):
181 @ install -d $(DIST_DIR)
182
183.PHONY: all
184all: $(ALL_TARGETS)
185
186.PHONY: clean
187clean: $(CLEAN_TARGETS)
188
189.PHONY: distclean
190distclean:
191 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
192
193.PHONY: board
194board:
195ifndef BOARD
kelvin.zhangded42a02021-10-21 14:31:37 +0800196 $(error BOARD is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800197endif
198 @ echo "Board: $(BOARD)"
199ifndef PRODUCT
kelvin.zhangded42a02021-10-21 14:31:37 +0800200 $(error PRODUCT is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800201endif
kelvin.zhang56c152a2021-10-26 10:02:15 +0800202 @ echo "Product: $(PRODUCT)"
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800203
204.PHONY: docs
205docs:
206 @ cmake $($(1)_DIR)
207 @ cmake --build ./
208
209################################################################
210# Respective Targets
211################################################################
212# Buildsystem Targets
213$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
214
215# CMake Build Targets
216$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
217
218# Build Targets
219$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
220
221# Menuconfig Targets
kelvin.zhangded42a02021-10-21 14:31:37 +0800222#$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800223
224# Dist Targets
225$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
226
227# Clean Targets
228$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
229
230.PHONY: toolchain
231toolchain:
232ifndef COMPILER
kelvin.zhangded42a02021-10-21 14:31:37 +0800233 $(error COMPILER is not set, Please execute source scripts/env.sh)
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800234endif
235 @ if [ ! -d $($@_DIR) ]; then \
236 $(call MESSAGE,"Preparing $@"); \
237 mkdir -p $($@_DIR); \
238 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
239 touch $($@_DIR); \
240 fi
241 @ if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
242 $(call MESSAGE,"Updating $@"); \
243 rm -rf $($@_DIR)/*; \
244 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
245 touch $($@_DIR); \
246 fi
247
kelvin.zhangded42a02021-10-21 14:31:37 +0800248.PHONY: menuconfig
249menuconfig: $(kernel_BUILD_DIR)
250 @ cmake --build $(kernel_BUILD_DIR) --target $@
251
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800252.PHONY: flash
253flash:
254 @ if [ -d $(DIST_DIR) ]; then \
255 (cd $(DIST_DIR) && \
256 ./update_fw.sh;) \
257 fi
258
259.PHONY: release
260release:
261 @ (cd .. && \
262 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=cmake-Linux-x86_64 --exclude=gcc-arm-none-eabi \
kelvin.zhang90fa47b2021-10-18 18:08:34 +0800263 -cJf rtos_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
kelvin.zhanga4497cf2021-10-13 17:31:59 +0800264 rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
kelvin.zhang90fa47b2021-10-18 18:08:34 +0800265 mv rtos_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR))