# # 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)