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