target-mbed-gcc/CMake/toolchain.cmake

92 lines
3.7 KiB
CMake
Executable File

# Copyright (C) 2014-2015 ARM Limited. All rights reserved.
if(TARGET_MBED_GCC_TOOLCHAIN_INCLUDED)
return()
endif()
set(TARGET_MBED_GCC_TOOLCHAIN_INCLUDED 1)
# search path for included .cmake files (set this as early as possible, so that
# indirect includes still use it)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
set(CMAKE_SYSTEM_NAME mbedOS)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR "armv7-m")
# required for -include yotta_config.h
set(YOTTA_FORCE_INCLUDE_FLAG "-include")
# legacy definitions for building mbed 2.0 modules with a retrofitted build
# system:
set(MBED_LEGACY_TOOLCHAIN "GCC_ARM")
# provide compatibility definitions for compiling with this target: these are
# definitions that legacy code assumes will be defined.
add_definitions("-DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -DMBED_OPERATORS")
# find the compiler and associated tools that we need:
find_program(ARM_NONE_EABI_GCC arm-none-eabi-gcc)
find_program(ARM_NONE_EABI_GPP arm-none-eabi-g++)
find_program(ARM_NONE_EABI_OBJCOPY arm-none-eabi-objcopy)
macro(gcc_program_notfound progname)
message("**************************************************************************\n")
message(" ERROR: the arm gcc program ${progname} could not be found\n")
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" OR CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
message(" you can install the ARM GCC embedded compiler tools from:")
message(" https://launchpad.net/gcc-arm-embedded/+download ")
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
message(" it is included in the arm-none-eabi-gcc package that you can install")
message(" with homebrew:\n")
message(" brew tap ARMmbed/homebrew-formulae")
message(" brew install arm-none-eabi-gcc")
endif()
message("\n**************************************************************************")
message(FATAL_ERROR "missing program prevents build")
return()
endmacro(gcc_program_notfound)
if(NOT ARM_NONE_EABI_GCC)
gcc_program_notfound("arm-none-eabi-gcc")
endif()
if(NOT ARM_NONE_EABI_GPP)
gcc_program_notfound("arm-none-eabi-g++")
endif()
if(NOT ARM_NONE_EABI_OBJCOPY)
gcc_program_notfound("arm-none-eabi-objcopy")
endif()
# post-process elf files into .bin files (legacy backwards-compatible command):
set(YOTTA_POSTPROCESS_COMMAND "\"${ARM_NONE_EABI_OBJCOPY}\" -O binary YOTTA_CURRENT_EXE_NAME YOTTA_CURRENT_EXE_NAME.bin")
# set default compilation flags
set(_C_FAMILY_FLAGS_INIT "-fno-exceptions -fno-unwind-tables -ffunction-sections -fdata-sections -Wall -Wextra -gstrict-dwarf")
set(CMAKE_C_FLAGS_INIT "-std=c99 ${_C_FAMILY_FLAGS_INIT}")
set(CMAKE_ASM_FLAGS_INIT "-fno-exceptions -fno-unwind-tables -x assembler-with-cpp")
set(CMAKE_CXX_FLAGS_INIT "--std=gnu++11 ${_C_FAMILY_FLAGS_INIT} -fno-rtti -fno-threadsafe-statics")
set(CMAKE_MODULE_LINKER_FLAGS_INIT
"-fno-exceptions -fno-unwind-tables -Wl,--gc-sections -Wl,--sort-common -Wl,--sort-section=alignment"
)
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_MODULE_LINKER_FLAGS_INIT} -Wl,-wrap,main")
if((NOT DEFINED YOTTA_CFG_GCC_PRINTF_FLOAT) OR (YOTTA_CFG_GCC_PRINTF_FLOAT))
set(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT} -Wl,-u,_printf_float")
endif()
# Set the compiler to ARM-GCC
set(CMAKE_C_COMPILER "${ARM_NONE_EABI_GCC}")
set(CMAKE_CXX_COMPILER "${ARM_NONE_EABI_GPP}")
# post-process elf files into .bin files:
function(yotta_apply_target_rules target_type target_name)
if(${target_type} STREQUAL "EXECUTABLE")
add_custom_command(TARGET ${target_name}
POST_BUILD
COMMAND "${ARM_NONE_EABI_OBJCOPY}" -O binary ${target_name} ${target_name}.bin
COMMENT "converting to .bin"
VERBATIM
)
endif()
endfunction()