Added build rules for ARM
authorandre Ebersold <andre.ebersold@free.fr>
Sun, 10 Dec 2023 18:40:44 +0000 (19:40 +0100)
committerandre Ebersold <andre.ebersold@free.fr>
Sun, 10 Dec 2023 18:40:44 +0000 (19:40 +0100)
rules/gcc-arm-common.cmake [new file with mode: 0644]
rules/gcc-arm-generic.cmake [new file with mode: 0644]

diff --git a/rules/gcc-arm-common.cmake b/rules/gcc-arm-common.cmake
new file mode 100644 (file)
index 0000000..d4c617e
--- /dev/null
@@ -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 (file)
index 0000000..8af87f4
--- /dev/null
@@ -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(<EXECUTABLE_NAME>-${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
+# <LIBRARY_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()
+
+