diff --git a/binutils-arm-none-eabi.cmake b/binutils-arm-none-eabi.cmake new file mode 100644 index 0000000..9211bb2 --- /dev/null +++ b/binutils-arm-none-eabi.cmake @@ -0,0 +1,36 @@ +## +## Author: Johannes Bruder +## License: See LICENSE.TXT file included in the project +## +## CMake arm-none-eabi binutils integration and helper functions +## + + +#--------------------------------------------------------------------------------------- +# Set tools +#--------------------------------------------------------------------------------------- +set(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-objcopy${TOOLCHAIN_EXT}) +set(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-objdump${TOOLCHAIN_EXT}) +set(CMAKE_SIZE ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-size${TOOLCHAIN_EXT}) + + +#--------------------------------------------------------------------------------------- +# Prints the section sizes +#--------------------------------------------------------------------------------------- +function(print_section_sizes TARGET) + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_SIZE} ${TARGET}) +endfunction() + +#--------------------------------------------------------------------------------------- +# Creates output in hex format +#--------------------------------------------------------------------------------------- +function(create_hex_output TARGET) + add_custom_target(${TARGET}.hex ALL DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET} ${TARGET}.hex) +endfunction() + +#--------------------------------------------------------------------------------------- +# Creates output in binary format +#--------------------------------------------------------------------------------------- +function(create_bin_output TARGET) + add_custom_target(${TARGET}.bin ALL DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET} ${TARGET}.bin) +endfunction() diff --git a/efr32mg.cmake b/efr32mg.cmake new file mode 100644 index 0000000..b37ae67 --- /dev/null +++ b/efr32mg.cmake @@ -0,0 +1,30 @@ +## +## Authors: Johannes Bruder +## License: See LICENSE.TXT file included in the project +## +## +## EFR32MG target specific CMake file +## + +if(NOT DEFINED LINKER_SCRIPT) + message(FATAL_ERROR "No linker script defined") + endif(NOT DEFINED LINKER_SCRIPT) +message("Linker script: ${LINKER_SCRIPT}") + +#--------------------------------------------------------------------------------------- +# Set target compiler/linker flags +#--------------------------------------------------------------------------------------- + +# Object build options +# -mcpu=cortex-m4 SepcifiesTarget ARM processor. +# -mfpu=fpv4-sp-d16 Specifies floating-point hardware. +# -mfloat-abi=softfp Allows the generation of code using hardware floating-point instructions, but still uses the soft-float calling conventions. + +set(OBJECT_GEN_FLAGS "-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OBJECT_GEN_FLAGS} -std=gnu99 " CACHE INTERNAL "C Compiler options") +set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${OBJECT_GEN_FLAGS} -std=c++11 " CACHE INTERNAL "C++ Compiler options") +set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} ${OBJECT_GEN_FLAGS} -x assembler-with-cpp " CACHE INTERNAL "ASM Compiler options") + +# Linker flags +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -T${LINKER_SCRIPT}" CACHE INTERNAL "Linker options") diff --git a/gdb-helper.cmake b/gdb-helper.cmake new file mode 100644 index 0000000..e894387 --- /dev/null +++ b/gdb-helper.cmake @@ -0,0 +1,40 @@ +## +## Author: Johannes Bruder +## License: See LICENSE.TXT file included in the project +## +## Collection of functions to generate different GDB debugging configurations +## + +# Get the path of this module +set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR}) + +#--------------------------------------------------------------------------------------- +# Set tools +#--------------------------------------------------------------------------------------- +set(GDB_BIN ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gdb${TOOLCHAIN_EXT}) +if(NOT OPENOCD_BIN) + if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) + set(OPENOCD_BIN "/usr/bin/openocd" CACHE STRING "OpenOCD executable") + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) + set(OPENOCD_BIN "/usr/local/bin/openocd" CACHE STRING "OpenOCD executable") + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) + set(OPENOCD_BIN "C:/openocd/bin/openocd.exe" CACHE STRING "OpenOCD executable") + endif() +endif() + +#--------------------------------------------------------------------------------------- +# Generates a GDB run script for debugging with STLINKv1/v2/v2-1 programmer and texane stlink tool. +# More infos check: https://github.com/texane/stlink +#--------------------------------------------------------------------------------------- +function(generate_run_gdb_stlink TARGET) + get_target_property( TARGET_NAME ${TARGET} NAME ) + configure_file(${CURRENT_MODULE_DIR}/stlink-run.gdb.in ${PROJECT_BINARY_DIR}/stlink-run.gdb @ONLY) +endfunction() + +#--------------------------------------------------------------------------------------- +# Generates a GDB run script for debugging with any supported programmer and openOCD. +#--------------------------------------------------------------------------------------- +function(generate_run_gdb_openocd TARGET) + get_target_property( TARGET_NAME ${TARGET} NAME ) + configure_file(${CURRENT_MODULE_DIR}/openocd-run.gdb.in ${PROJECT_BINARY_DIR}/openocd-run.gdb @ONLY) +endfunction() diff --git a/openocd-run.gdb.in b/openocd-run.gdb.in new file mode 100644 index 0000000..a8fd8b6 --- /dev/null +++ b/openocd-run.gdb.in @@ -0,0 +1,5 @@ +file @TARGET_NAME@ +target extended-remote localhost:3333 +monitor reset halt +load +thbreak main diff --git a/stlink-run.gdb.in b/stlink-run.gdb.in new file mode 100644 index 0000000..a58992a --- /dev/null +++ b/stlink-run.gdb.in @@ -0,0 +1,6 @@ +file @TARGET_NAME@ +target extended localhost:4242 +monitor reset halt +shell sleep 1 +load +thbreak main diff --git a/toolchain-arm-none-eabi.cmake b/toolchain-arm-none-eabi.cmake new file mode 100644 index 0000000..783d06f --- /dev/null +++ b/toolchain-arm-none-eabi.cmake @@ -0,0 +1,104 @@ +## +## Author: Johannes Bruder +## License: See LICENSE.TXT file included in the project +## +## +## CMake arm-none-eabi toolchain file +## + +# Append current directory to CMAKE_MODULE_PATH for making device specific cmake modules visible +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) + +# Target definition +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR ARM) + +#--------------------------------------------------------------------------------------- +# Set toolchain paths +#--------------------------------------------------------------------------------------- +set(TOOLCHAIN arm-none-eabi) +if(NOT DEFINED TOOLCHAIN_PREFIX) + if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) + set(TOOLCHAIN_PREFIX "/usr") + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) + set(TOOLCHAIN_PREFIX "/usr/local") + elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) + message(STATUS "Please specify the TOOLCHAIN_PREFIX !\n For example: -DTOOLCHAIN_PREFIX=\"C:/Program Files/GNU Tools ARM Embedded\" ") + else() + set(TOOLCHAIN_PREFIX "/usr") + message(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX}) + endif() +endif() +set(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin) +set(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/include) +set(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/lib) + +# Set system depended extensions +if(WIN32) + set(TOOLCHAIN_EXT ".exe" ) +else() + set(TOOLCHAIN_EXT "" ) +endif() + +# Perform compiler test with static library +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +#--------------------------------------------------------------------------------------- +# Set compiler/linker flags +#--------------------------------------------------------------------------------------- + +# Object build options +# -O0 No optimizations, reduce compilation time and make debugging produce the expected results. +# -mthumb Generat thumb instructions. +# -fno-builtin Do not use built-in functions provided by GCC. +# -Wall Print only standard warnings, for all use Wextra +# -ffunction-sections Place each function item into its own section in the output file. +# -fdata-sections Place each data item into its own section in the output file. +# -fomit-frame-pointer Omit the frame pointer in functions that don’t need one. +# -mabi=aapcs Defines enums to be a variable sized type. +set(OBJECT_GEN_FLAGS "-O0 -mthumb -fno-builtin -Wall -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs") + +set(CMAKE_C_FLAGS "${OBJECT_GEN_FLAGS} -std=gnu99 " CACHE INTERNAL "C Compiler options") +set(CMAKE_CXX_FLAGS "${OBJECT_GEN_FLAGS} -std=c++11 " CACHE INTERNAL "C++ Compiler options") +set(CMAKE_ASM_FLAGS "${OBJECT_GEN_FLAGS} -x assembler-with-cpp " CACHE INTERNAL "ASM Compiler options") + + +# -Wl,--gc-sections Perform the dead code elimination. +# --specs=nano.specs Link with newlib-nano. +# --specs=nosys.specs No syscalls, provide empty implementations for the POSIX system calls. +set(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections --specs=nano.specs --specs=nosys.specs -mthumb -mabi=aapcs -Wl,-Map=${CMAKE_PROJECT_NAME}.map" CACHE INTERNAL "Linker options") + +#--------------------------------------------------------------------------------------- +# Set debug/release build configuration Options +#--------------------------------------------------------------------------------------- + +# Options for DEBUG build +# -Og Enables optimizations that do not interfere with debugging. +# -g Produce debugging information in the operating system’s native format. +set(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "C Compiler options for debug build type") +set(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "C++ Compiler options for debug build type") +set(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "ASM Compiler options for debug build type") +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "" CACHE INTERNAL "Linker options for debug build type") + +# Options for RELEASE build +# -Os Optimize for size. -Os enables all -O2 optimizations. +# -flto Runs the standard link-time optimizer. +set(CMAKE_C_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "C Compiler options for release build type") +set(CMAKE_CXX_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "C++ Compiler options for release build type") +set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "ASM Compiler options for release build type") +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto" CACHE INTERNAL "Linker options for release build type") + + +#--------------------------------------------------------------------------------------- +# Set compilers +#--------------------------------------------------------------------------------------- +set(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "C Compiler") +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-g++${TOOLCHAIN_EXT} CACHE INTERNAL "C++ Compiler") +set(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "ASM Compiler") + +set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${${TOOLCHAIN}} ${CMAKE_PREFIX_PATH}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +