blob: ebbb5dc0e8b1ea16cc6d9a28a2e267ece119bb0b [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
55export PATH ARCH BOARD KERNEL SDK_BASE
56
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)
73 @ if [ ! -f $($(1)_BUILD_DIR)/build.ninja ]; then \
74 cmake -G Ninja -DBOARD=$(BOARD) -DCMAKE_TOOLCHAIN_FILE=$(build_DIR)/cmake/toolchains/$(ARCH)-gcc.cmake -S $(product_DIR)/$(PRODUCT) -B $($(1)_BUILD_DIR); \
75 fi
76endef
77
78# Macro of Building CMake Targets
79# $(1): Target
80define GENERATE_CMAKE_TARGET
81.PHONY: $(1)
82$(1): toolchain $($(1)_BUILD_DIR)
83 @ $(call MESSAGE,"Building $(1)")
84 @ (if [ $(1) == kernel ]; then \
85 cmake --build $($(1)_BUILD_DIR); \
86 else \
87 if [ $(1) == bootloader ]; then \
88 if [ ! -d $(kernel_KEYPATH) ]; then \
89 mkdir -p $(kernel_KEYPATH); \
90 fi; \
91 if [ ! -f $(kernel_KEYPATH)/*private.pem -o ! -f $(kernel_KEYPATH)/*public.pem ]; then \
92 $(call MESSAGE,"Generating kernel key pair ..."); \
93 python3 $(SIGNTOOL) keygen -k $(kernel_KEYPATH) -t rsa-2048; \
94 fi; \
95 $(call MESSAGE,"Attach kernel public key"); \
96 python3 $(SIGNTOOL) getpub -k $(kernel_KEYPATH)/rsa2048-private.pem > $($(1)_DIR)/bl2/ext/mcuboot/rsa_pub_key.h; \
97 if [ ! -d $($(1)_KEYPATH) ]; then \
98 $(call MESSAGE,"Generating $(1) key pair ..."); \
99 mkdir -p $($(1)_KEYPATH); \
100 fi; \
101 if [ ! -f $($(1)_KEYPATH)/*private.pem -o ! -f $($(1)_KEYPATH)/*public.pem ]; then \
102 python3 $(SIGNTOOL) keygen -k $($(1)_KEYPATH) -t rsa-3072; \
103 fi; \
104 fi; \
105 cmake $($(1)_DIR)/ -G"Unix Makefiles" -DBOARD=$(BOARD) -DPRODUCT=$(PRODUCT) -DCOMPILER=$(ARCH)-gcc; \
106 cmake --build ./ -- install; \
107 fi \
108 )
109endef
110
111# Macro of Building Targets
112# $(1): Target
113define GENERATE_MAKE_TARGET
114.PHONY: $(1)
115$(1): toolchain
116 @ $(call MESSAGE,"Building $(1)")
117 @ (cd $($(1)_DIR) && $(MAKE))
118endef
119
120# Macro of Menuconfig Targets
121# $(1): Target
122# $(2): Target suffix
123define GENERATE_MENUCONFIG_TARGET
124.PHONY: $(if $(2),$(1)-$(2),$(1))
125$(if $(2),$(1)-$(2),$(1)): $($(1)_BUILD_DIR)
126 @ cmake --build $($(1)_BUILD_DIR) --target $(2)
127endef
128
129# Macro of Building Dist Targets
130# $(1): Target
131# $(2): Target suffix
132define GENERATE_DIST_TARGET
133.PHONY: $(if $(2),$(1)-$(2),$(1))
134$(if $(2),$(1)-$(2),$(1)): $(1) $(DIST_DIR)
135 @ if [ -f $($(1)_BIN) ]; then install -p $($(1)_BIN) $($(1)_$(2)_BIN); fi
136endef
137
138# Macro of Cleaning Targets
139# $(1): Target
140# $(2): Target suffix
141define GENERATE_CLEAN_TARGET
142.PHONY: $(if $(2),$(1)-$(2),$(1))
143$(if $(2),$(1)-$(2),$(1)):
144 @ $(call MESSAGE,"Cleaning $(1)")
145 @ if [ -d $($(1)_BUILD_DIR) ]; then cmake --build $($(1)_BUILD_DIR) --target $(2); fi
146endef
147
148# Macro of Signing Image
149# $(1): target binary
150# $(2): header length
151define SIGN_IMAGE
152 if [ $(1) == bootloader ]; then \
153 python3 $(SIGNTOOL) sign_bl2 -P $($(1)_KEYPATH) -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
154 else \
155 python3 $(SIGNTOOL) sign -k $($(1)_KEYPATH)/rsa2048-private.pem -H $(2) $($(1)_BIN) $($(1)_dist_BIN); \
156 fi
157endef
158
159################################################################
160# Targets
161################################################################
162BUILDSYSTEM_TARGETS := kernel
163CMAKE_TARGETS := kernel
164#MAKE_TARGETS := adnl
165MENUCONFIG_TARGETS := kernel
166INSTALL_TARGETS := $(CMAKE_TARGETS)
167ALL_TARGETS := $(CMAKE_TARGETS) $(MAKE_TARGETS)
168DIST_TARGETS := $(addsuffix -dist,$(INSTALL_TARGETS))
169CLEAN_TARGETS := $(addsuffix -clean,$(ALL_TARGETS))
170
171.PHONY: dist
172dist: all $(DIST_TARGETS)
173 mkimage -A arm64 -O u-boot -T standalone -C none -a 0x1000 -e0x1000 -n rtos -d $(kernel_dist_BIN) $(DIST_DIR)/rtos-uImage
174# $(call SIGN_IMAGE,bootloader,512)
175# $(call SIGN_IMAGE,kernel,1024)
176
177$(DIST_DIR):
178 @ install -d $(DIST_DIR)
179
180.PHONY: all
181all: $(ALL_TARGETS)
182
183.PHONY: clean
184clean: $(CLEAN_TARGETS)
185
186.PHONY: distclean
187distclean:
188 @ if [ -d $(BUILD_DIR) ]; then rm -rf $(BUILD_DIR); fi
189
190.PHONY: board
191board:
192ifndef BOARD
193 $(error BOARD is not set, Please execute source scripts/choose.sh)
194endif
195 @ echo "Board: $(BOARD)"
196ifndef PRODUCT
197 $(error PRODUCT is not set, Please execute source scripts/choose.sh)
198endif
199 @ echo "PRODUCT: $(PRODUCT)"
200
201.PHONY: docs
202docs:
203 @ cmake $($(1)_DIR)
204 @ cmake --build ./
205
206################################################################
207# Respective Targets
208################################################################
209# Buildsystem Targets
210$(foreach target,$(BUILDSYSTEM_TARGETS),$(eval $(call GENERATE_BUILDSYSTEM,$(target))))
211
212# CMake Build Targets
213$(foreach target,$(CMAKE_TARGETS),$(eval $(call GENERATE_CMAKE_TARGET,$(target))))
214
215# Build Targets
216$(foreach target,$(MAKE_TARGETS),$(eval $(call GENERATE_MAKE_TARGET,$(target))))
217
218# Menuconfig Targets
219$(foreach target,$(MENUCONFIG_TARGETS),$(eval $(call GENERATE_MENUCONFIG_TARGET,$(target),menuconfig)))
220
221# Dist Targets
222$(foreach target,$(ALL_TARGETS) fw,$(eval $(call GENERATE_DIST_TARGET,$(target),dist)))
223
224# Clean Targets
225$(foreach target,$(ALL_TARGETS),$(eval $(call GENERATE_CLEAN_TARGET,$(target),clean)))
226
227.PHONY: toolchain
228toolchain:
229ifndef COMPILER
230 $(error COMPILER is not set, Please execute source scripts/choose.sh)
231endif
232 @ if [ ! -d $($@_DIR) ]; then \
233 $(call MESSAGE,"Preparing $@"); \
234 mkdir -p $($@_DIR); \
235 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
236 touch $($@_DIR); \
237 fi
238 @ if ( find $(CROSSTOOL) -newer $($@_DIR) | grep -q $(CROSSTOOL) ); then \
239 $(call MESSAGE,"Updating $@"); \
240 rm -rf $($@_DIR)/*; \
241 tar -xf $(CROSSTOOL) -C $($@_DIR) --strip-components=1; \
242 touch $($@_DIR); \
243 fi
244
245.PHONY: flash
246flash:
247 @ if [ -d $(DIST_DIR) ]; then \
248 (cd $(DIST_DIR) && \
249 ./update_fw.sh;) \
250 fi
251
252.PHONY: release
253release:
254 @ (cd .. && \
255 tar --exclude-vcs --exclude=cscope.* --exclude=.repo --exclude=output --exclude=cmake-Linux-x86_64 --exclude=gcc-arm-none-eabi \
256 -cJf unisoc_mcu_sdk_$(RELEASE_VERSION).tar.xz $(notdir $(PRJDIR)); \
257 rm -f $(product_DIR)/$(PRODUCT)/include/version.h; \
258 mv unisoc_mcu_sdk_$(RELEASE_VERSION).tar.xz $(PRJDIR))