1#
2# Copyright (C) 2016 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16################################################################################
17#
18# NanoApp C/C++ Makefile Utils
19#
20################################################################################
21
22# Configuration ################################################################
23
24# Toolchain Prefix
25ifndef CROSS_COMPILE
26  $(error Please set the environment variable CROSS_COMPILE to the complete \
27          path to the toolchain directory plus the binary prefix, e.g. export \
28          CROSS_COMPILE=~/bin/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-)
29endif
30
31PREFIX = $(CROSS_COMPILE)
32TOOLCHAIN_DIR = $(shell dirname `which $(CROSS_COMPILE)gcc`)/..
33
34# NANOHUB_DIR is relative to CWD (which is always APP Makefile dir)
35
36NANOAPP_POSTPROCESS := $(NANOHUB_DIR)/../util/nanoapp_postprocess/nanoapp_postprocess
37NANOAPP_SIGN := $(NANOHUB_DIR)/../util/nanoapp_sign/nanoapp_sign
38
39# TOP_RELPATH is ANDROID_TOP relative to NANOHUB_DIR
40TOP_RELPATH := ../../../..
41TOP_ABSPATH := $(realpath $(NANOHUB_DIR)/$(TOP_RELPATH))
42
43# for local variants there is always a path; for out-of-tree variants there may be
44# - a $(VARIANT) soft link under firmware/variant subdir, or
45# - VARIANT_PATH is found as vendor/<vendor_name>/<variant_name>/nanohub, or
46# - explicitly provided in VARIANT_CONFIG_PATH (path, where <variant>_conf.mk is located)
47#
48ifeq ($(VARIANT_CONFIG_PATH),)
49  variant_conf := $(wildcard $(TOP_ABSPATH)/vendor/*/*/nanohub/$(VARIANT)_conf.mk)
50  ifeq ($(words $(variant_conf)),1)
51    VARIANT_CONFIG_PATH := $(patsubst $(TOP_ABSPATH)/%/$(VARIANT)_conf.mk,%,$(variant_conf))
52  else
53    VARIANT_CONFIG_PATH := device/google/contexthub/firmware/variant/$(VARIANT)
54  endif
55endif
56
57include $(TOP_ABSPATH)/$(VARIANT_CONFIG_PATH)/$(VARIANT)_conf.mk
58
59# $(VARIANT)_conf.mk defines VARIANT_PATH, PLATFORM, CHIP, CPU, VARIANT
60# VARIANT_PATH from $(VARIANT)_conf.mk is ANDROID_TOP relative
61
62# change VARIANT_PATH to become CWD-relative
63VARIANT_PATH := $(NANOHUB_DIR)/$(TOP_RELPATH)/$(VARIANT_PATH)
64
65# all output goes here
66ifndef OUT
67OUT:=out/nanohub/$(VARIANT)/app/$(BIN)
68else
69ifneq ($(filter $(TOP_ABSPATH)/out/target/product/%,$(OUT)),)
70# this looks like Android OUT env var; update it
71IMAGE_TARGET_OUT:=$(OUT)/vendor/firmware/$(BIN).napp
72OUT:=$(OUT)/nanohub/$(VARIANT)/app/$(BIN)
73endif
74endif
75
76################################################################################
77#
78# Nanoapp Libc/Libm Utils
79#
80################################################################################
81
82include $(NANOHUB_DIR)/lib/lib.mk
83
84# Tools ########################################################################
85
86AS := $(PREFIX)gcc
87CC := $(PREFIX)gcc
88CXX := $(PREFIX)g++
89OBJCOPY := $(PREFIX)objcopy
90OBJDUMP := $(PREFIX)objdump
91
92# Assembly Flags ###############################################################
93
94AS_FLAGS +=
95
96# C++ Flags ####################################################################
97
98CXX_CFLAGS += -std=c++11
99CXX_CFLAGS += -fno-exceptions
100CXX_CFLAGS += -fno-rtti
101
102# C Flags ######################################################################
103
104C_CFLAGS +=
105
106# Common Flags #################################################################
107
108# Defines
109CFLAGS += -DAPP_ID=$(APP_ID)
110CFLAGS += -DAPP_VERSION=$(APP_VERSION)
111CFLAGS += -D__NANOHUB__
112
113# Optimization/debug
114CFLAGS += -Os
115CFLAGS += -g
116
117# Include paths
118CFLAGS += -I$(NANOHUB_DIR)/os/inc
119CFLAGS += -I$(NANOHUB_DIR)/os/platform/$(PLATFORM)/inc
120CFLAGS += -I$(NANOHUB_DIR)/os/cpu/$(CPU)/inc
121CFLAGS += -I$(VARIANT_PATH)/inc
122CFLAGS += -I$(NANOHUB_DIR)/../lib/include
123
124# Warnings/error configuration.
125CFLAGS += -Wall
126CFLAGS += -Werror
127CFLAGS += -Wmissing-declarations
128CFLAGS += -Wlogical-op
129CFLAGS += -Waddress
130CFLAGS += -Wempty-body
131CFLAGS += -Wpointer-arith
132CFLAGS += -Wenum-compare
133CFLAGS += -Wdouble-promotion
134CFLAGS += -Wshadow
135CFLAGS += -Wno-attributes
136
137# Produce position independent code.
138CFLAGS += -fpic
139CFLAGS += -mno-pic-data-is-text-relative
140CFLAGS += -msingle-pic-base
141CFLAGS += -mpic-register=r9
142
143# Code generation options for Cortex-M4F
144CFLAGS += -mthumb
145CFLAGS += -mcpu=cortex-m4
146CFLAGS += -march=armv7e-m
147CFLAGS += -mfloat-abi=softfp
148CFLAGS += -mfpu=fpv4-sp-d16
149CFLAGS += -mno-thumb-interwork
150CFLAGS += -ffast-math
151CFLAGS += -fsingle-precision-constant
152
153# Platform defines
154CFLAGS += -DARM
155CFLAGS += -DUSE_NANOHUB_FLOAT_RUNTIME
156CFLAGS += -DARM_MATH_CM4
157CFLAGS += -D__FPU_PRESENT
158
159# Miscellaneous
160CFLAGS += -fno-strict-aliasing
161CFLAGS += -fvisibility=hidden
162CFLAGS += -fno-unwind-tables
163CFLAGS += -fstack-reuse=all
164CFLAGS += -ffunction-sections
165CFLAGS += -fdata-sections
166
167# Linker Configuration #########################################################
168
169LD := $(PREFIX)g++
170
171LDFLAGS := -T $(NANOHUB_DIR)/os/platform/$(PLATFORM)/lkr/app.lkr
172LDFLAGS += -nostartfiles
173LDFLAGS += -nostdlib
174LDFLAGS += -Wl,--gc-sections
175LDFLAGS += -Wl,-Map,$(OUT)/$(BIN).map
176LDFLAGS += -Wl,--cref
177ifeq ($(BIN_MODE),static)
178LDFLAGS += -Bstatic
179LDFLAGS += -Wl,--emit-relocs
180else
181LDFLAGS += -Bdynamic
182LDFLAGS += -Wl,--no-undefined
183LDFLAGS += -Wl,--no-allow-shlib-undefined
184endif
185
186# Build Rules ##################################################################
187
188AS_SRCS := $(filter %.S, $(SRCS))
189C_SRCS := $(filter %.c, $(SRCS))
190CXX_SRCS := $(filter %.cc, $(SRCS))
191CPP_SRCS := $(filter %.cpp, $(SRCS))
192
193OBJS := $(patsubst %.S, $(OUT)/%.o, $(AS_SRCS))
194OBJS += $(patsubst %.c, $(OUT)/%.o, $(C_SRCS))
195OBJS += $(patsubst %.cc, $(OUT)/%.o, $(CXX_SRCS))
196OBJS += $(patsubst %.cpp, $(OUT)/%.o, $(CPP_SRCS))
197
198UNSIGNED_BIN := $(BIN).unsigned.napp
199
200NANOHUB_KEY_PATH := $(NANOHUB_DIR)/os/platform/$(PLATFORM)/misc
201
202.PHONY: all clean sync
203all: $(OUT)/$(BIN).S $(OUT)/$(BIN).napp $(IMAGE_TARGET_OUT)
204
205$(OUT)/$(BIN).napp : $(OUT)/$(UNSIGNED_BIN) $(NANOAPP_SIGN)
206	@mkdir -p $(dir $@)
207	$(NANOAPP_SIGN) -e $(NANOHUB_KEY_PATH)/debug.privkey \
208		-m $(NANOHUB_KEY_PATH)/debug.pubkey -s $< $@
209ifdef IMAGE_TARGET_OUT
210$(IMAGE_TARGET_OUT): $(OUT)/$(BIN).napp
211	@mkdir -p $(dir $@)
212	cp $< $(IMAGE_TARGET_OUT)
213endif
214
215ifeq ($(APP_VERSION),)
216APP_VERSION := 0
217endif
218
219ifeq ($(BIN_MODE),static)
220$(OUT)/$(UNSIGNED_BIN) : $(OUT)/$(BIN).elf $(NANOAPP_POSTPROCESS)
221	@mkdir -p $(dir $@)
222	$(NANOAPP_POSTPROCESS) -s -a $(APP_ID) -e $(APP_VERSION) -v $(BIN_POSTPROCESS_ARGS) $< $@
223else
224$(OUT)/$(UNSIGNED_BIN) : $(OUT)/$(BIN).bin $(NANOAPP_POSTPROCESS)
225	@mkdir -p $(dir $@)
226	$(NANOAPP_POSTPROCESS) -a $(APP_ID) -e $(APP_VERSION) -v $(BIN_POSTPROCESS_ARGS) $< $@
227
228$(OUT)/$(BIN).bin : $(OUT)/$(BIN).elf
229	@mkdir -p $(dir $@)
230	$(OBJCOPY) -j.relocs -j.flash -j.data -j.dynsym -O binary $< $@
231endif
232
233$(OUT)/$(BIN).S : $(OUT)/$(BIN).elf
234	@mkdir -p $(dir $@)
235	$(OBJDUMP) $< -DS > $@
236
237$(OUT)/$(BIN).elf : $(OBJS)
238	@mkdir -p $(dir $@)
239	$(LD) $(CFLAGS) $(CXX_FLAGS) $(LDFLAGS) $(OBJS) $(STATIC_LIBS) -o $@
240
241$(OUT)/%.o : %.S
242	@mkdir -p $(dir $@)
243	$(AS) $(AS_FLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@
244
245$(OUT)/%.o : %.c
246	@mkdir -p $(dir $@)
247	$(CC) $(C_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@
248
249$(OUT)/%.o : %.cc
250	@mkdir -p $(dir $@)
251	$(CXX) $(CXX_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@
252
253$(OUT)/%.o : %.cpp
254	@mkdir -p $(dir $@)
255	$(CXX) $(CXX_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@
256
257# Automatic dependency resolution ##############################################
258
259DEPS_AS = $(OUT)/deps_as
260DEPS_C = $(OUT)/deps_c
261DEPS_CXX = $(OUT)/deps_cxx
262
263$(DEPS_AS) : $(AS_SRCS)
264	@mkdir -p $(dir $@)
265	$(AS) $(AS_CFLAGS) $(CFLAGS) -MM $^ > $@
266
267$(DEPS_C) : $(C_SRCS)
268	@mkdir -p $(dir $@)
269	$(CC) $(C_CFLAGS) $(CFLAGS) -MM $^ > $@
270
271$(DEPS_CXX) : $(CXX_SRCS) $(CPP_SRCS)
272	@mkdir -p $(dir $@)
273	$(CXX) $(CXX_CFLAGS) $(CFLAGS) -MM $^ > $@
274
275NOAUTODEPTARGETS = clean
276
277ifeq ($(words $(findstring $(MAKECMDGOALS), $(NOAUTODEPTARGETS))), 0)
278
279ifneq ($(AS_SRCS), )
280-include $(DEPS_AS)
281endif
282
283ifneq ($(C_SRCS), )
284-include $(DEPS_C)
285endif
286
287ifneq ($(CXX_SRCS)$(CPP_SRCS),)
288-include $(DEPS_CXX)
289endif
290
291endif
292
293$(NANOAPP_POSTPROCESS): $(wildcard $(dir $(NANOAPP_POSTPROCESS))/*.c* $(dir $(NANOAPP_POSTPROCESS))/*.h)
294	echo DEPS [$@]: $^
295	make -C $(dir $@)
296
297$(NANOAPP_SIGN): $(wildcard $(dir $(NANOAPP_SIGN))/*.c* $(dir $(NANOAPP_SIGN))/*.h)
298	echo DEPS [$@]: $^
299	make -C $(dir $@)
300
301# Clean targets ################################################################
302
303clean :
304	rm -rf $(OUT)
305
306sync:   $(OUT)/$(BIN).napp
307	adb push $< /vendor/firmware/$(BIN).napp
308