You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
8.7 KiB
308 lines
8.7 KiB
#
|
|
# 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/<vendor_name>/<variant_name>/nanohub, or
|
|
# - explicitly provided in VARIANT_CONFIG_PATH (path, where <variant>_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 += -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 += -nostdlib
|
|
LDFLAGS += -Wl,--gc-sections
|
|
LDFLAGS += -Wl,-Map,$(OUT)/$(BIN).map
|
|
LDFLAGS += -Wl,--cref
|
|
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
|