92 lines
3.7 KiB
CMake
Executable File
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()
|
|
|