arm-none-eabi.cmake 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. set(CMAKE_EXPORT_COMPILE_COMMANDS on)
  2. include(ResolveToolchain)
  3. set(QMK_TOOLCHAIN "arm-none-eabi")
  4. set(QMK_PLATFORM "chibios")
  5. set(QMK_PROTOCOL "chibios")
  6. set(QMK_EXTENSION ".bin")
  7. if(UNIX)
  8. set(OS_SUFFIX "")
  9. elseif(WIN32)
  10. set(OS_SUFFIX ".exe")
  11. endif()
  12. find_toolchain(arm-none-eabi TOOLCHAIN_ROOT)
  13. set(CMAKE_SYSTEM_NAME Generic)
  14. set(CMAKE_SYSTEM_PROCESSOR arm)
  15. set(CMAKE_CROSS_COMPILING 1)
  16. set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE)
  17. set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE)
  18. set(CMAKE_AR "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE)
  19. set(CMAKE_AS "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-as${OS_SUFFIX}" CACHE PATH "as" FORCE)
  20. set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE)
  21. set(CMAKE_NM "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE)
  22. set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE)
  23. set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE)
  24. set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE)
  25. set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE)
  26. set(CMAKE_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE)
  27. find_program(CMAKE_MAKE_PROGRAM NAME make
  28. PATHS
  29. "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/"
  30. "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/"
  31. /usr/bin/
  32. /usr/local/bin
  33. /bin/
  34. )
  35. add_compile_options(
  36. $<$<COMPILE_LANGUAGE:C>:-std=gnu11>
  37. $<$<COMPILE_LANGUAGE:CXX>:-std=gnu++14>
  38. $<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>
  39. # -flto
  40. -Os
  41. -Wall
  42. -Wstrict-prototypes
  43. # -fcommon
  44. # -g
  45. -fomit-frame-pointer
  46. -ffunction-sections
  47. -fdata-sections
  48. -fno-common
  49. -fshort-wchar
  50. -fno-builtin-printf
  51. # -funsigned-char
  52. # -funsigned-bitfields
  53. # -ffunction-sections
  54. # -fdata-sections
  55. # -fpack-struct
  56. # -fshort-enums
  57. # -fno-builtin-printf
  58. # $<$<COMPILE_LANGUAGE:C>:-fno-inline-small-functions>
  59. # $<$<COMPILE_LANGUAGE:C>:-fno-strict-aliasing>
  60. # $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
  61. )
  62. add_link_options(
  63. -Wl,--gc-sections
  64. -nostartfiles
  65. -Wl,--no-wchar-size-warning
  66. --specs=nano.specs
  67. -lm
  68. )
  69. macro(add_qmk_executable target_name)
  70. set(elf_file ${target_name}.elf)
  71. set(map_file ${target_name}.map)
  72. set(bin_file ${target_name}.bin)
  73. set(lst_file ${target_name}.lst)
  74. add_link_options(
  75. -Wl,-Map=${map_file},--cref
  76. )
  77. # create elf file
  78. add_executable(qmk ${ARGN})
  79. # add_executable(${elf_file} ${ARGN})
  80. # target_link_libraries(${elf_file} qmk)
  81. set_target_properties(qmk
  82. PROPERTIES
  83. OUTPUT_NAME ${elf_file}
  84. )
  85. # generate the lst file
  86. add_custom_command(
  87. OUTPUT ${lst_file}
  88. COMMAND ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file}
  89. DEPENDS qmk
  90. )
  91. # add_custom_command(
  92. # OUTPUT "print-size-${elf_file}"
  93. # COMMAND
  94. # ${CMAKE_SIZE} ${elf_file}
  95. # DEPENDS ${elf_file}
  96. # )
  97. # add_custom_command(
  98. # OUTPUT "print-size-${bin_file}"
  99. # COMMAND
  100. # ${CMAKE_SIZE} ${bin_file} sizeafter
  101. # DEPENDS ${bin_file}
  102. # )
  103. add_custom_command(
  104. TARGET qmk
  105. POST_BUILD
  106. COMMAND ${CMAKE_OBJCOPY} -O binary ${elf_file} ${CMAKE_SOURCE_DIR}/build/${bin_file}
  107. # COMMAND ${CMAKE_COMMAND} -E copy ${elf_file} ${CMAKE_SOURCE_DIR}/build/${elf_file}
  108. # COMMAND ${CMAKE_COMMAND} -E copy ${lst_file} ${CMAKE_SOURCE_DIR}/build/${lst_file}
  109. # COMMAND ${CMAKE_COMMAND} -E copy ${map_file} ${CMAKE_SOURCE_DIR}/build/${map_file}
  110. )
  111. # build the intel hex file for the device
  112. add_custom_target(${target_name} ALL
  113. DEPENDS ${elf_file} ${lst_file}
  114. )
  115. set_target_properties(${target_name}
  116. PROPERTIES
  117. OUTPUT_NAME ${bin_file}
  118. )
  119. endmacro(add_qmk_executable)