# # Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ################################################################################ # # NanoApp C/C++ Makefile Utils # ################################################################################ # Configuration ################################################################ # Toolchain Prefix ifndef CROSS_COMPILE $(error Please set the environment variable CROSS_COMPILE to the complete \ path to the toolchain directory plus the binary prefix, e.g. export \ CROSS_COMPILE=~/bin/gcc-arm-none-eabi-4_8-2014q3/bin/arm-none-eabi-) endif PREFIX = $(CROSS_COMPILE) TOOLCHAIN_DIR = $(shell dirname `which $(CROSS_COMPILE)gcc`)/.. # NANOHUB_DIR is relative to CWD (which is always APP Makefile dir) NANOAPP_POSTPROCESS := $(NANOHUB_DIR)/../util/nanoapp_postprocess/nanoapp_postprocess NANOAPP_SIGN := $(NANOHUB_DIR)/../util/nanoapp_sign/nanoapp_sign # TOP_RELPATH is ANDROID_TOP relative to NANOHUB_DIR TOP_RELPATH := ../../../.. TOP_ABSPATH := $(realpath $(NANOHUB_DIR)/$(TOP_RELPATH)) # for local variants there is always a path; for out-of-tree variants there may be # - a $(VARIANT) soft link under firmware/variant subdir, or # - VARIANT_PATH is found as vendor///nanohub, or # - explicitly provided in VARIANT_CONFIG_PATH (path, where _conf.mk is located) # ifeq ($(VARIANT_CONFIG_PATH),) variant_conf := $(wildcard $(TOP_ABSPATH)/vendor/*/*/nanohub/$(VARIANT)_conf.mk) ifeq ($(words $(variant_conf)),1) VARIANT_CONFIG_PATH := $(patsubst $(TOP_ABSPATH)/%/$(VARIANT)_conf.mk,%,$(variant_conf)) else VARIANT_CONFIG_PATH := device/google/contexthub/firmware/variant/$(VARIANT) endif endif include $(TOP_ABSPATH)/$(VARIANT_CONFIG_PATH)/$(VARIANT)_conf.mk # $(VARIANT)_conf.mk defines VARIANT_PATH, PLATFORM, CHIP, CPU, VARIANT # VARIANT_PATH from $(VARIANT)_conf.mk is ANDROID_TOP relative # change VARIANT_PATH to become CWD-relative VARIANT_PATH := $(NANOHUB_DIR)/$(TOP_RELPATH)/$(VARIANT_PATH) # all output goes here ifndef OUT OUT:=out/nanohub/$(VARIANT)/app/$(BIN) else ifneq ($(filter $(TOP_ABSPATH)/out/target/product/%,$(OUT)),) # this looks like Android OUT env var; update it IMAGE_TARGET_OUT:=$(OUT)/vendor/firmware/$(BIN).napp OUT:=$(OUT)/nanohub/$(VARIANT)/app/$(BIN) endif endif ################################################################################ # # Nanoapp Libc/Libm Utils # ################################################################################ include $(NANOHUB_DIR)/lib/lib.mk # Tools ######################################################################## AS := $(PREFIX)gcc CC := $(PREFIX)gcc CXX := $(PREFIX)g++ OBJCOPY := $(PREFIX)objcopy OBJDUMP := $(PREFIX)objdump # Assembly Flags ############################################################### AS_FLAGS += # C++ Flags #################################################################### CXX_CFLAGS += -std=c++11 CXX_CFLAGS += -fno-exceptions CXX_CFLAGS += -fno-rtti # C Flags ###################################################################### C_CFLAGS += # Common Flags ################################################################# # Defines CFLAGS += -DAPP_ID=$(APP_ID) CFLAGS += -DAPP_VERSION=$(APP_VERSION) CFLAGS += -D__NANOHUB__ # Optimization/debug CFLAGS += -Os CFLAGS += -g # Include paths CFLAGS += -I$(NANOHUB_DIR)/os/inc CFLAGS += -I$(NANOHUB_DIR)/os/platform/$(PLATFORM)/inc CFLAGS += -I$(NANOHUB_DIR)/os/cpu/$(CPU)/inc CFLAGS += -I$(VARIANT_PATH)/inc CFLAGS += -I$(NANOHUB_DIR)/../lib/include # Warnings/error configuration. CFLAGS += -Wall CFLAGS += -Werror CFLAGS += -Wmissing-declarations CFLAGS += -Wlogical-op CFLAGS += -Waddress CFLAGS += -Wempty-body CFLAGS += -Wpointer-arith CFLAGS += -Wenum-compare CFLAGS += -Wdouble-promotion CFLAGS += -Wshadow CFLAGS += -Wno-attributes # Produce position independent code. CFLAGS += -fpic CFLAGS += -mno-pic-data-is-text-relative CFLAGS += -msingle-pic-base CFLAGS += -mpic-register=r9 # Code generation options for Cortex-M4F CFLAGS += -mthumb CFLAGS += -mcpu=cortex-m4 CFLAGS += -march=armv7e-m CFLAGS += -mfloat-abi=softfp CFLAGS += -mfpu=fpv4-sp-d16 CFLAGS += -mno-thumb-interwork CFLAGS += -ffast-math CFLAGS += -fsingle-precision-constant # Platform defines CFLAGS += -DARM CFLAGS += -DUSE_NANOHUB_FLOAT_RUNTIME CFLAGS += -DARM_MATH_CM4 CFLAGS += -D__FPU_PRESENT # Miscellaneous CFLAGS += -fno-strict-aliasing CFLAGS += -fshort-double CFLAGS += -fvisibility=hidden CFLAGS += -fno-unwind-tables CFLAGS += -fstack-reuse=all CFLAGS += -ffunction-sections CFLAGS += -fdata-sections # Linker Configuration ######################################################### LD := $(PREFIX)g++ LDFLAGS := -T $(NANOHUB_DIR)/os/platform/$(PLATFORM)/lkr/app.lkr LDFLAGS += -nostartfiles LDFLAGS += -Wl,--gc-sections LDFLAGS += -Wl,-Map,$(OUT)/$(BIN).map LDFLAGS += -Wl,--cref STATIC_LIBS += -lgcc ifeq ($(BIN_MODE),static) LDFLAGS += -Bstatic LDFLAGS += -Wl,--emit-relocs else LDFLAGS += -Bdynamic LDFLAGS += -Wl,--no-undefined LDFLAGS += -Wl,--no-allow-shlib-undefined endif # Build Rules ################################################################## AS_SRCS := $(filter %.S, $(SRCS)) C_SRCS := $(filter %.c, $(SRCS)) CXX_SRCS := $(filter %.cc, $(SRCS)) CPP_SRCS := $(filter %.cpp, $(SRCS)) OBJS := $(patsubst %.S, $(OUT)/%.o, $(AS_SRCS)) OBJS += $(patsubst %.c, $(OUT)/%.o, $(C_SRCS)) OBJS += $(patsubst %.cc, $(OUT)/%.o, $(CXX_SRCS)) OBJS += $(patsubst %.cpp, $(OUT)/%.o, $(CPP_SRCS)) UNSIGNED_BIN := $(BIN).unsigned.napp NANOHUB_KEY_PATH := $(NANOHUB_DIR)/os/platform/$(PLATFORM)/misc .PHONY: all clean sync all: $(OUT)/$(BIN).S $(OUT)/$(BIN).napp $(IMAGE_TARGET_OUT) $(OUT)/$(BIN).napp : $(OUT)/$(UNSIGNED_BIN) $(NANOAPP_SIGN) @mkdir -p $(dir $@) $(NANOAPP_SIGN) -e $(NANOHUB_KEY_PATH)/debug.privkey \ -m $(NANOHUB_KEY_PATH)/debug.pubkey -s $< $@ ifdef IMAGE_TARGET_OUT $(IMAGE_TARGET_OUT): $(OUT)/$(BIN).napp @mkdir -p $(dir $@) cp $< $(IMAGE_TARGET_OUT) endif ifeq ($(APP_VERSION),) APP_VERSION := 0 endif ifeq ($(BIN_MODE),static) $(OUT)/$(UNSIGNED_BIN) : $(OUT)/$(BIN).elf $(NANOAPP_POSTPROCESS) @mkdir -p $(dir $@) $(NANOAPP_POSTPROCESS) -s -a $(APP_ID) -e $(APP_VERSION) -v $(BIN_POSTPROCESS_ARGS) $< $@ else $(OUT)/$(UNSIGNED_BIN) : $(OUT)/$(BIN).bin $(NANOAPP_POSTPROCESS) @mkdir -p $(dir $@) $(NANOAPP_POSTPROCESS) -a $(APP_ID) -e $(APP_VERSION) -v $(BIN_POSTPROCESS_ARGS) $< $@ $(OUT)/$(BIN).bin : $(OUT)/$(BIN).elf @mkdir -p $(dir $@) $(OBJCOPY) -j.relocs -j.flash -j.data -j.dynsym -O binary $< $@ endif $(OUT)/$(BIN).S : $(OUT)/$(BIN).elf @mkdir -p $(dir $@) $(OBJDUMP) $< -DS > $@ $(OUT)/$(BIN).elf : $(OBJS) @mkdir -p $(dir $@) $(LD) $(CFLAGS) $(CXX_FLAGS) $(LDFLAGS) $(OBJS) $(STATIC_LIBS) -o $@ $(OUT)/%.o : %.S @mkdir -p $(dir $@) $(AS) $(AS_FLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@ $(OUT)/%.o : %.c @mkdir -p $(dir $@) $(CC) $(C_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@ $(OUT)/%.o : %.cc @mkdir -p $(dir $@) $(CXX) $(CXX_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@ $(OUT)/%.o : %.cpp @mkdir -p $(dir $@) $(CXX) $(CXX_CFLAGS) $(CFLAGS) -DSRC_FILENAME=\"$(notdir $<)\" -c $< -o $@ # Automatic dependency resolution ############################################## DEPS_AS = $(OUT)/deps_as DEPS_C = $(OUT)/deps_c DEPS_CXX = $(OUT)/deps_cxx $(DEPS_AS) : $(AS_SRCS) @mkdir -p $(dir $@) $(AS) $(AS_CFLAGS) $(CFLAGS) -MM $^ > $@ $(DEPS_C) : $(C_SRCS) @mkdir -p $(dir $@) $(CC) $(C_CFLAGS) $(CFLAGS) -MM $^ > $@ $(DEPS_CXX) : $(CXX_SRCS) $(CPP_SRCS) @mkdir -p $(dir $@) $(CXX) $(CXX_CFLAGS) $(CFLAGS) -MM $^ > $@ NOAUTODEPTARGETS = clean ifeq ($(words $(findstring $(MAKECMDGOALS), $(NOAUTODEPTARGETS))), 0) ifneq ($(AS_SRCS), ) -include $(DEPS_AS) endif ifneq ($(C_SRCS), ) -include $(DEPS_C) endif ifneq ($(CXX_SRCS)$(CPP_SRCS),) -include $(DEPS_CXX) endif endif $(NANOAPP_POSTPROCESS): $(wildcard $(dir $(NANOAPP_POSTPROCESS))/*.c* $(dir $(NANOAPP_POSTPROCESS))/*.h) echo DEPS [$@]: $^ make -C $(dir $@) $(NANOAPP_SIGN): $(wildcard $(dir $(NANOAPP_SIGN))/*.c* $(dir $(NANOAPP_SIGN))/*.h) echo DEPS [$@]: $^ make -C $(dir $@) # Clean targets ################################################################ clean : rm -rf $(OUT) sync: $(OUT)/$(BIN).napp adb push $< /vendor/firmware/$(BIN).napp