blob: 26b9e8fc123c9fc65b32a55ae9083c410cfed94d [file] [log] [blame]
#
# Build targets for a Cortex-M-based processor
#
# Cortex-M Environment Checks ##################################################
# If building for the Cortex-M target, ensure that the user has specified a path
# to the Cortex-M toolchain that they wish to use.
ifeq ($(CORTEXM_TOOLS_PREFIX),)
# Try to default to Android's Clang prebuilts if the tools prefix isn't
# specified.
include $(CHRE_PREFIX)/build/clang.mk
endif # CORTEXM_TOOLS_PREFIX
# Cortex-M Tools ###############################################################
ifeq ($(IS_CLANG_TOOLCHAIN),)
TARGET_AR = $(CORTEXM_TOOLS_PREFIX)/bin/arm-none-eabi-ar
TARGET_CC = $(CORTEXM_TOOLS_PREFIX)/bin/arm-none-eabi-g++
TARGET_LD = $(CORTEXM_TOOLS_PREFIX)/bin/arm-none-eabi-ld
else
TARGET_AR = $(CLANG_TOOLCHAIN_PATH)/bin/llvm-ar
TARGET_CC = $(CLANG_TOOLCHAIN_PATH)/bin/clang
TARGET_LD = $(CLANG_TOOLCHAIN_PATH)/bin/ld.lld
endif
# Cortex-M Compiler Flags ######################################################
# Add Cortex-M compiler flags.
TARGET_CFLAGS += $(CORTEXM_CFLAGS)
# Code generation flags.
GCC_CFLAGS += -mthumb
GCC_CFLAGS += -mno-thumb-interwork
GCC_CFLAGS += -ffast-math
GCC_CFLAGS += -fsingle-precision-constant
TARGET_CFLAGS += -ffunction-sections
TARGET_CFLAGS += -fdata-sections
TARGET_CFLAGS += -fshort-enums
TARGET_CFLAGS += -fno-unwind-tables
TARGET_CFLAGS += -mabi=aapcs
ifneq ($(IS_NANOAPP_BUILD),)
TARGET_CFLAGS += -fpic
endif
ifeq ($(IS_ARCHIVE_ONLY_BUILD), true)
COMMON_CXX_CFLAGS += -fno-use-cxa-atexit
endif
# Sadly we must disable double promotion warnings due to logging macros. There
# is a bug for this here: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431
TARGET_CFLAGS += -Wno-double-promotion
# Cortex-M Shared Object Linker Flags ##########################################
TARGET_SO_LDFLAGS += -shared
TARGET_SO_LDFLAGS += -z max-page-size=0x8
# Supported Cortex-M Architectures #############################################
CORTEXM_SUPPORTED_ARCHS = m4 m4_hardfp
# Environment Checks ###########################################################
# Ensure that an architecture is chosen.
ifeq ($(filter $(CORTEXM_ARCH), $(CORTEXM_SUPPORTED_ARCHS)),)
$(error "The CORTEXM_ARCH argument must be set to a supported architecture (\
$(CORTEXM_SUPPORTED_ARCHS))")
endif
# Target Architecture ##########################################################
# Set the Cortex-M architecture.
ifeq ($(CORTEXM_ARCH), m4)
GCC_CFLAGS += -mcpu=cortex-m4
CLANG_CFLAGS += --target=arm-none-eabi
TARGET_CFLAGS += -mfloat-abi=softfp
TARGET_CFLAGS += -mfpu=fpv4-sp-d16
endif
ifeq ($(CORTEXM_ARCH), m4_hardfp)
GCC_CFLAGS += -mcpu=cortex-m4
CLANG_CFLAGS += --target=arm-none-eabi
TARGET_CFLAGS += -mfloat-abi=hard
TARGET_CFLAGS += -mfpu=fpv4-sp-d16
endif
ifeq ($(IS_CLANG_TOOLCHAIN),)
TARGET_CFLAGS += $(GCC_CFLAGS)
else
TARGET_CFLAGS += $(CLANG_CFLAGS)
endif
# Optimization Level ###########################################################
TARGET_CFLAGS += -O$(OPT_LEVEL)
# Variant Specific Sources #####################################################
TARGET_VARIANT_SRCS += $(CORTEXM_SRCS)