From: andre Ebersold Date: Sun, 10 Dec 2023 18:40:44 +0000 (+0100) Subject: Added build rules for ARM X-Git-Url: https://git.ebersold.fr/?a=commitdiff_plain;h=8a3ca2c91b2421494a75684e54309dd8ed0b6bfc;p=atmel%2Favr.git Added build rules for ARM --- diff --git a/rules/gcc-arm-common.cmake b/rules/gcc-arm-common.cmake new file mode 100644 index 0000000..d4c617e --- /dev/null +++ b/rules/gcc-arm-common.cmake @@ -0,0 +1,71 @@ +########################################################################## +# needs to be defined for AVR toolchain +########################################################################## +if(NOT MCU_SPEED) + set(MCU_SPEED "73000000UL") +endif() + +########################################################################## +# some cmake cross-compile necessities +########################################################################## + +if(DEFINED ENV{STM32_FIND_ROOT_PATH}) + set(CMAKE_FIND_ROOT_PATH $ENV{STM32_FIND_ROOT_PATH}) +else(DEFINED ENV{STM32_FIND_ROOT_PATH}) + if(EXISTS "/opt/local/stm32") + set(CMAKE_FIND_ROOT_PATH "/opt/local/stm32") + elseif(EXISTS "/usr/avr") + set(CMAKE_FIND_ROOT_PATH "/usr/stm32") + elseif(EXISTS "/usr/lib/stm32") + set(CMAKE_FIND_ROOT_PATH "/usr/lib/avr") + else(EXISTS "/opt/local/stm32") + message(FATAL_ERROR "Please set STM32_FIND_ROOT_PATH in your environment.") + endif(EXISTS "/opt/local/stm32") +endif(DEFINED ENV{STM32_FIND_ROOT_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) +# not added automatically, since CMAKE_SYSTEM_NAME is "generic" +set(CMAKE_SYSTEM_INCLUDE_PATH "${CMAKE_FIND_ROOT_PATH}/include") +set(CMAKE_SYSTEM_LIBRARY_PATH "${CMAKE_FIND_ROOT_PATH}/lib") + +########################################################################## +# status messages for generating +########################################################################## +message(STATUS "Set CMAKE_FIND_ROOT_PATH to ${CMAKE_FIND_ROOT_PATH}") +message(STATUS "Set CMAKE_SYSTEM_INCLUDE_PATH to ${CMAKE_SYSTEM_INCLUDE_PATH}") +message(STATUS "Set CMAKE_SYSTEM_LIBRARY_PATH to ${CMAKE_SYSTEM_LIBRARY_PATH}") + +########################################################################## +# set compiler options for build types +########################################################################## +if(CMAKE_BUILD_TYPE MATCHES Release) + set(CMAKE_C_FLAGS_RELEASE "-Os") + set(CMAKE_CXX_FLAGS_RELEASE "-Os") +endif(CMAKE_BUILD_TYPE MATCHES Release) + +if(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) + set(CMAKE_C_FLAGS_RELWITHDEBINFO "-Os -save-temps -g -gdwarf-3 -gstrict-dwarf") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-Os -save-temps -g -gdwarf-3 -gstrict-dwarf") +endif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) + +if(CMAKE_BUILD_TYPE MATCHES Debug) + set(CMAKE_C_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf") + set(CMAKE_CXX_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf") +endif(CMAKE_BUILD_TYPE MATCHES Debug) + +########################################################################## +# compiler options for all build types +########################################################################## +add_definitions("-DF_CPU=${MCU_SPEED}") +add_definitions("-fpack-struct") +add_definitions("-fshort-enums") +add_definitions("-Wall") +add_definitions("-Werror") +add_definitions("-pedantic") +add_definitions("-pedantic-errors") +add_definitions("-funsigned-char") +add_definitions("-funsigned-bitfields") +add_definitions("-ffunction-sections") +add_definitions("-c") + diff --git a/rules/gcc-arm-generic.cmake b/rules/gcc-arm-generic.cmake new file mode 100644 index 0000000..8af87f4 --- /dev/null +++ b/rules/gcc-arm-generic.cmake @@ -0,0 +1,310 @@ +# +# +# In order to build binaries for STM32 target or AVR +# Some macro will have the same name as avr. +# however, I'm planning to define something more generic +# lile add_embed_executable (replacing avr with embed +# +# +########################################################################## +# options +########################################################################## +option(WITH_MCU "Add the mCU type to the target file name." ON) + +########################################################################## +# executables in use +########################################################################## +SET(TRIPLE arm-none-eabi) +find_program(ARM_CC ${TRIPLE}-gcc) +find_program(ARM_CXX ${TRIPLE}-g++) +find_program(ARM_OBJCOPY ${TRIPLE}-objcopy) +find_program(ARM_SIZE_TOOL ${TRIPLE}-size) +find_program(ARM_OBJDUMP ${TRIPLE}-objdump) + +###### +# Identification +###### +SET(STM32 1) + +###################################################################### +# Upload tool and variables necessary for STM32 +# - STM32_UPLOADTOOL +# - STM32_UPLOAD_PORT +# - STM32_UPLOAD_CONFIG +# - STM32_PROGRAMMER +# - STM32_MCU +# - STM32_SIZE_ARGS +###################################################################### + +# default MCU +if(NOT STM32_MCU) + SET( + STM32_MCU stm32f103 + CACHE STRING "Set default MCU stm32f103" + ) +endif(NOT STM32_MCU) + +# default CORE +if(NOT STM32_CORE) + SET( + STM32_MCU cortex-m3 + CACHE STRING "Set default CPU cortex-m3" + ) +endif(NOT STM32_MCU) + +# default uploadtool +if(NOT STM32_UPLOADTOOL) + SET( + STM32_UPLOADTOOL openocd + CACHE STRING "Set default uploadtool opneocd" + ) +endif(NOT STM32_UPLOADTOOL) + +# default uploadtool config file +if(NOT STM32_UPLOAD_CONFIG) + SET( + STM32_UPLOAD_CONFIG board/stm32 + CACHE STRING "Set default openocd config file for target" + ) +endif(NOT STM32_UPLOADTOOL) + + +#default stm32-size args +if(NOT STM32_SIZE_ARGS) + SET( + STM32_SIZE_ARGS -c;--mcu=${STM32_MCU} + ) +endif(NOT STM32_SIZE_ARGS) + + +########################################################################## +# check build types: +# - Debug +# - Release +# - RelWithDebInfo +# +# Release is chosen, because of some optimized functions in the +# STM32 toolchain, e.g. _delay_ms(). +########################################################################## +if(NOT ((CMAKE_BUILD_TYPE MATCHES Release) OR +(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) OR +(CMAKE_BUILD_TYPE MATCHES Debug) OR +(CMAKE_BUILD_TYPE MATCHES MinSizeRel))) + set( + CMAKE_BUILD_TYPE Release + CACHE STRING "Choose cmake build type: Debug Release RelWithDebInfo MinSizeRel" + FORCE + ) +endif(NOT ((CMAKE_BUILD_TYPE MATCHES Release) OR +(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) OR +(CMAKE_BUILD_TYPE MATCHES Debug) OR +(CMAKE_BUILD_TYPE MATCHES MinSizeRel))) + +########################################################################## +# target file name add-on +########################################################################## +if(WITH_MCU) + set(MCU_TYPE_FOR_FILENAME "-${STM32_MCU}") +else(WITH_MCU) + set(MCU_TYPE_FOR_FILENAME "") +endif(WITH_MCU) + + +########################################################################## +# add_avr_executable +# - IN_VAR: EXECUTABLE_NAME +# +# Creates targets and dependencies for AVR toolchain, building an +# executable. Calls add_executable with ELF file as target name, so +# any link dependencies need to be using that target, e.g. for +# target_link_libraries(-${AVR_MCU}.elf ...). +########################################################################## +function(add_avr_executable EXECUTABLE_NAME) + + if(NOT ARGN) + message(FATAL_ERROR "No source files given for ${EXECUTABLE_NAME}.") + endif(NOT ARGN) + + # set file names + set(elf_file ${EXECUTABLE_NAME}${MCU_TYPE_FOR_FILENAME}.elf) + set(hex_file ${EXECUTABLE_NAME}${MCU_TYPE_FOR_FILENAME}.hex) + set(lst_file ${EXECUTABLE_NAME}${MCU_TYPE_FOR_FILENAME}.lst) + set(map_file ${EXECUTABLE_NAME}${MCU_TYPE_FOR_FILENAME}.map) + set(eeprom_image ${EXECUTABLE_NAME}${MCU_TYPE_FOR_FILENAME}-eeprom.hex) + + # elf file + add_executable(${elf_file} EXCLUDE_FROM_ALL ${ARGN}) + + set_target_properties( + ${elf_file} + PROPERTIES + COMPILE_FLAGS "-mmcu=${STM32_MCU} -mlittle-endian -thumb -mcpu=${STM32_CORE}" + LINK_FLAGS "-mmcu=${STM32_MCU} -Wl,--gc-sections -mrelax -Wl,-Map,${map_file}" + ) + + add_custom_command( + OUTPUT ${hex_file} + COMMAND + ${STM32_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + COMMAND + ${STM32_SIZE_TOOL} ${STM32_SIZE_ARGS} ${elf_file} + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT ${lst_file} + COMMAND + ${STM32_OBJDUMP} -d ${elf_file} > ${lst_file} + DEPENDS ${elf_file} + ) + + # eeprom + add_custom_command( + OUTPUT ${eeprom_image} + COMMAND + ${STM32_OBJCOPY} -j .eeprom --set-section-flags=.eeprom=alloc,load + --change-section-lma .eeprom=0 --no-change-warnings + -O ihex ${elf_file} ${eeprom_image} + DEPENDS ${elf_file} + ) + + add_custom_target( + ${EXECUTABLE_NAME} + ALL + DEPENDS ${hex_file} ${lst_file} ${eeprom_image} + ) + + set_target_properties( + ${EXECUTABLE_NAME} + PROPERTIES + OUTPUT_NAME "${elf_file}" + ) + + # clean + get_directory_property(clean_files ADDITIONAL_MAKE_CLEAN_FILES) + set_directory_properties( + PROPERTIES + ADDITIONAL_MAKE_CLEAN_FILES "${map_file}" + ) + + # upload - with openocd + add_custom_target( + upload_${EXECUTABLE_NAME} + ${STM32_UPLOADTOOL} ${STM32_UPLOADTOOL_BASE_OPTIONS} ${STM32_UPLOADTOOL_OPTIONS} + -f ${STM32_UPLOAD_CONFIG} -c "program ${hex_file} reset exit 0x08000000" + DEPENDS ${hex_file} + COMMENT "Uploading ${hex_file} to ${STM32_MCU} using ${STM32_PROGRAMMER}" + ) + + # disassemble + add_custom_target( + disassemble_${EXECUTABLE_NAME} + ${AVR_OBJDUMP} -h -S ${elf_file} > ${EXECUTABLE_NAME}.lst + DEPENDS ${elf_file} + ) +endfunction(add_avr_executable) + +########################################################################## +# add_avr_library +# - IN_VAR: LIBRARY_NAME +# +# Calls add_library with an optionally concatenated name +# ${MCU_TYPE_FOR_FILENAME}. +# This needs to be used for linking against the library, e.g. calling +# target_link_libraries(...). +########################################################################## +function(add_avr_library LIBRARY_NAME) + if(NOT ARGN) + message(FATAL_ERROR "No source files given for ${LIBRARY_NAME}.") + endif(NOT ARGN) + + set(lib_file ${LIBRARY_NAME}${MCU_TYPE_FOR_FILENAME}) + + add_library(${lib_file} STATIC ${ARGN}) + + set_target_properties( + ${lib_file} + PROPERTIES + COMPILE_FLAGS "-mmcu=${STM32_MCU} -mcpu=${STM32_CORE}" + OUTPUT_NAME "${lib_file}" + ) + + if(NOT TARGET ${LIBRARY_NAME}) + add_custom_target( + ${LIBRARY_NAME} + ALL + DEPENDS ${lib_file} + ) + + set_target_properties( + ${LIBRARY_NAME} + PROPERTIES + OUTPUT_NAME "${lib_file}" + ) + endif(NOT TARGET ${LIBRARY_NAME}) + +endfunction(add_avr_library) + + +########################################################################## +# avr_target_link_libraries +# - IN_VAR: EXECUTABLE_TARGET +# - ARGN : targets and files to link to +# +# Calls target_link_libraries with AVR target names (concatenation, +# extensions and so on. +########################################################################## +function(avr_target_link_libraries EXECUTABLE_TARGET) + if(NOT ARGN) + message(FATAL_ERROR "Nothing to link to ${EXECUTABLE_TARGET}.") + endif(NOT ARGN) + + get_target_property(TARGET_LIST ${EXECUTABLE_TARGET} OUTPUT_NAME) + + foreach(TGT ${ARGN}) + if(TARGET ${TGT}) + get_target_property(ARG_NAME ${TGT} OUTPUT_NAME) + list(APPEND NON_TARGET_LIST ${ARG_NAME}) + else(TARGET ${TGT}) + list(APPEND NON_TARGET_LIST ${TGT}) + endif(TARGET ${TGT}) + endforeach(TGT ${ARGN}) + + target_link_libraries(${TARGET_LIST} ${NON_TARGET_LIST}) +endfunction(avr_target_link_libraries EXECUTABLE_TARGET) + +########################################################################## +# avr_target_include_directories +# +# Calls target_include_directories with AVR target names +########################################################################## + +function(avr_target_include_directories EXECUTABLE_TARGET) + if(NOT ARGN) + message(FATAL_ERROR "No include directories to add to ${EXECUTABLE_TARGET}.") + endif() + + get_target_property(TARGET_LIST ${EXECUTABLE_TARGET} OUTPUT_NAME) + set(extra_args ${ARGN}) + + target_include_directories(${TARGET_LIST} ${extra_args}) +endfunction() + +########################################################################## +# avr_target_compile_definitions +# +# Calls target_compile_definitions with AVR target names +########################################################################## + +function(avr_target_compile_definitions EXECUTABLE_TARGET) + if(NOT ARGN) + message(FATAL_ERROR "No compile definitions to add to ${EXECUTABLE_TARGET}.") + endif() + + get_target_property(TARGET_LIST ${EXECUTABLE_TARGET} OUTPUT_NAME) + set(extra_args ${ARGN}) + + target_compile_definitions(${TARGET_LIST} ${extra_args}) +endfunction() + +