avr.cmake 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #
  2. # AVR GCC Toolchain file
  3. #
  4. # @author Natesh Narain
  5. # @since Feb 06 2016
  6. set(CMAKE_EXPORT_COMPILE_COMMANDS on)
  7. include(ResolveToolchain)
  8. set(QMK_TOOLCHAIN "avr")
  9. set(QMK_PLATFORM "avr")
  10. set(QMK_PROTOCOL "lufa")
  11. set(QMK_EXTENSION ".hex")
  12. if(UNIX)
  13. set(OS_SUFFIX "")
  14. elseif(WIN32)
  15. set(OS_SUFFIX ".exe")
  16. endif()
  17. find_toolchain(avr TOOLCHAIN_ROOT)
  18. # setup the AVR compiler variables
  19. set(CMAKE_SYSTEM_NAME Generic)
  20. set(CMAKE_SYSTEM_PROCESSOR avr)
  21. set(CMAKE_CROSS_COMPILING 1)
  22. set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE)
  23. set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE)
  24. set(CMAKE_AR "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE)
  25. set(CMAKE_AS "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-as${OS_SUFFIX}" CACHE PATH "as" FORCE)
  26. set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE)
  27. set(CMAKE_NM "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE)
  28. set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE)
  29. set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE)
  30. set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE)
  31. set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE)
  32. set(AVR_SIZE "${TOOLCHAIN_ROOT}/${QMK_TOOLCHAIN}-size${OS_SUFFIX}" CACHE PATH "size" FORCE)
  33. # set(CMAKE_EXE_LINKER_FLAGS "-L /usr/lib/gcc/avr/4.8.2")
  34. # avr uploader config
  35. find_program(AVR_UPLOAD
  36. NAME
  37. avrdude
  38. PATHS
  39. /usr/bin/
  40. $ENV{AVR_ROOT}
  41. )
  42. find_program(CMAKE_MAKE_PROGRAM NAME make
  43. PATHS
  44. "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-windows/bin/"
  45. "${CMAKE_SOURCE_DIR}/toolchains/avr-gcc-12.1.0-x64-linux/bin/"
  46. /usr/bin/
  47. /usr/local/bin
  48. /bin/
  49. )
  50. # setup the avr exectable macro
  51. # set(AVR_LINKER_LIBS "-lc -lm -lgcc -Wl,-lprintf_flt -Wl,-u,vfprintf")
  52. add_compile_options(
  53. $<$<COMPILE_LANGUAGE:C>:-std=gnu11>
  54. $<$<COMPILE_LANGUAGE:CXX>:-std=gnu++14>
  55. -flto
  56. # -mrelax
  57. -Os
  58. -Wall
  59. -Wstrict-prototypes
  60. -fcommon
  61. # -g
  62. $<$<BOOL:${WIN32}>:--param=min-pagesize=0>
  63. -funsigned-char
  64. -funsigned-bitfields
  65. -ffunction-sections
  66. -fdata-sections
  67. -fpack-struct
  68. -fshort-enums
  69. -mcall-prologues
  70. -fno-builtin-printf
  71. $<$<COMPILE_LANGUAGE:C>:-fno-inline-small-functions>
  72. $<$<COMPILE_LANGUAGE:C>:-fno-strict-aliasing>
  73. $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
  74. )
  75. add_compile_definitions(
  76. F_CPU=16000000
  77. F_USB=16000000UL
  78. __AVR_ATmega32U4__
  79. LTO_ENABLE
  80. )
  81. add_link_options(
  82. -Wl,--gc-sections
  83. )
  84. macro(add_qmk_executable target_name)
  85. set(elf_file ${target_name}.elf)
  86. set(map_file ${target_name}.map)
  87. set(hex_file ${target_name}.hex)
  88. set(lst_file ${target_name}.lst)
  89. add_compile_options(
  90. -mmcu=${QMK_MCU}
  91. )
  92. add_link_options(
  93. -mmcu=${QMK_MCU}
  94. -Wl,-Map=${map_file}
  95. )
  96. # create elf file
  97. # add_executable(${elf_file} ${ARGN})
  98. # target_link_libraries(${elf_file} qmk)
  99. add_executable(qmk ${ARGN})
  100. set_target_properties(qmk
  101. PROPERTIES
  102. OUTPUT_NAME ${elf_file}
  103. )
  104. # set_target_properties(${elf_file}
  105. # PROPERTIES
  106. # COMPILE_FLAGS "-mmcu=${QMK_MCU} ${COMPILE_OPTIONS}"
  107. # LINK_FLAGS "-mmcu=${QMK_MCU} ${LINK_OPTIONS}"
  108. # )
  109. # add_custom_target(compileOptions
  110. # COMMAND cmake -P ${CMAKE_SOURCE_DIR}/cmake/WriteCompileOptions.cmake
  111. # COMMENT "Writing compile_flags.txt"
  112. # )
  113. # generate the lst file
  114. add_custom_command(
  115. OUTPUT ${lst_file}
  116. COMMAND ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file}
  117. DEPENDS ${elf_file}
  118. )
  119. # create hex file
  120. add_custom_command(
  121. OUTPUT ${hex_file}
  122. # COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file}
  123. COMMAND ${CMAKE_OBJCOPY} -O ihex -R .eeprom -R .fuse -R .lock -R .signature ${elf_file} ${hex_file}
  124. DEPENDS ${elf_file}
  125. )
  126. add_custom_command(
  127. OUTPUT "print-size-${elf_file}"
  128. COMMAND ${AVR_SIZE} ${elf_file}
  129. DEPENDS ${elf_file}
  130. )
  131. add_custom_command(
  132. OUTPUT "print-size-${hex_file}"
  133. COMMAND ${AVR_SIZE} ${hex_file}
  134. DEPENDS ${hex_file}
  135. )
  136. add_custom_target(copy_hex
  137. COMMAND ${CMAKE_COMMAND} -E copy ${hex_file} ${CMAKE_SOURCE_DIR}/build/${hex_file}
  138. DEPENDS ${hex_file}
  139. )
  140. # build the intel hex file for the device
  141. add_custom_target(${target_name} ALL
  142. DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" copy_hex
  143. )
  144. set_target_properties(${target_name}
  145. PROPERTIES
  146. OUTPUT_NAME ${hex_file}
  147. )
  148. endmacro(add_qmk_executable)