--- /dev/null
+##########################################################################
+# 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")
+
--- /dev/null
+#
+#
+# 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()
+
+