CMakeLists.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. cmake_minimum_required(VERSION 3.15)
  2. include(cmake/Utilities.cmake)
  3. include(cmake/GetGitRevisionDescription.cmake)
  4. SET(PROJECT_VERSION_SUFFIX
  5. "<auto>"
  6. CACHE
  7. STRING
  8. "Full version suffix to be shown on the info screen in settings (e.g. full_version=4.0.3-BETA+1035.PR111.B4, suffix=-BETA+1035.PR111.B4). Defaults to '+<commit sha>.<dirty?>.<debug?>' if set to '<auto>'."
  9. )
  10. SET(PROJECT_VERSION_SUFFIX_SHORT
  11. "<auto>"
  12. CACHE
  13. STRING
  14. "Short version suffix to be shown on splash screen. Defaults to '+<BUILD_NUMBER>' if set to '<auto>'."
  15. )
  16. SET(BUILD_NUMBER
  17. ""
  18. CACHE STRING "Build number of the firmware. Resolved automatically if not specified."
  19. )
  20. INCLUDE(cmake/ProjectVersion.cmake)
  21. resolve_version_variables()
  22. SET(PROJECT_VERSION_FLAVOUR "" CACHE STRING "Firmware flavour to build - DEBUG, DEVEL, APLHA, BETA or RC")
  23. SET(PROJECT_VERSION_FLAVOUR_REVISION "" CACHE STRING "Firmware flavour version, e.g. 1 for RC1, etc")
  24. IF( NOT PROJECT_VERSION_FLAVOUR STREQUAL "")
  25. SET(PROJECT_VERSION "${PROJECT_VERSION}-${PROJECT_VERSION_FLAVOUR}")
  26. add_compile_definitions(FW_FLAVOR=${PROJECT_VERSION_FLAVOUR})
  27. IF( NOT PROJECT_VERSION_FLAVOUR_REVISION STREQUAL "")
  28. SET(PROJECT_VERSION "${PROJECT_VERSION}${PROJECT_VERSION_FLAVOUR_REVISION}")
  29. add_compile_definitions(FW_FLAVERSION=${PROJECT_VERSION_FLAVOUR_REVISION})
  30. ENDIF()
  31. ENDIF()
  32. # Inform user about the resolved settings
  33. MESSAGE(STATUS "Project version: ${PROJECT_VERSION}")
  34. MESSAGE(
  35. STATUS "Project version with short suffix: ${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}"
  36. )
  37. SET(FN_PREFIX "FW${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}")
  38. MESSAGE(WARNING "
  39. ***************** YOUR ATTENTION PLEASE *****************
  40. CMake support is experimental. There is no guarantee at this time. If you have problems you are encouraged to fall back to the tried-and-true methods.
  41. *********************** THANK YOU **********************
  42. We now return to your regularly scheduled Firmware Build."
  43. )
  44. OPTION(SECONDARY_LANGUAGES "Secondary language support in the firmware" ON)
  45. SET(MAIN_LANGUAGES cs de es fr it pl CACHE STRING "The list of 'main' languages to be included, in the correct order")
  46. SET(COMMUNITY_LANGUAGES nl ro hu hr sk sv no CACHE STRING "The list of community languages to be included, in the correct order")
  47. SET(SELECTED_LANGUAGES ${MAIN_LANGUAGES} ${COMMUNITY_LANGUAGES})
  48. get_dependency_directory(prusa3dboards PRUSA_BOARDS_DIR)
  49. project(Prusa-Firmware)
  50. add_subdirectory(lib)
  51. FILE(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/config.h MAX_SIZE_LINE REGEX "^#define \+LANG_SIZE_RESERVED \+")
  52. STRING(REGEX MATCH "0x[0-9]+" MAX_SIZE_HEX "${MAX_SIZE_LINE}")
  53. math(EXPR LANG_MAX_SIZE "${MAX_SIZE_HEX}" OUTPUT_FORMAT DECIMAL)
  54. message("Language maximum size (from config.h): ${LANG_MAX_SIZE} bytes")
  55. set (LANG_BIN_MAX 249856) # Ditto, this in xflash_layout.h but needs invocation of the preprocessor... :-/
  56. get_recommended_gcc_version(RECOMMENDED_TOOLCHAIN_VERSION)
  57. if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL
  58. ${RECOMMENDED_TOOLCHAIN_VERSION}
  59. )
  60. message(WARNING "Recommended AVR toolchain is ${RECOMMENDED_TOOLCHAIN_VERSION}"
  61. ", but you have ${CMAKE_CXX_COMPILER_VERSION}"
  62. )
  63. elseif(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  64. message(
  65. WARNING
  66. "Recommended compiler for host tools and unittests is GCC, you have ${CMAKE_CXX_COMPILER_ID}."
  67. )
  68. endif()
  69. # append custom C/C++ flags
  70. if(CUSTOM_COMPILE_OPTIONS)
  71. string(REPLACE " " ";" CUSTOM_COMPILE_OPTIONS "${CUSTOM_COMPILE_OPTIONS}")
  72. add_compile_options(${CUSTOM_COMPILE_OPTIONS})
  73. endif()
  74. #
  75. # Global Compiler & Linker Configuration
  76. #
  77. # include symbols
  78. add_compile_options(-g)
  79. #
  80. # Firmware - get file lists.
  81. #
  82. SET(FW_SOURCES
  83. adc.cpp
  84. backlight.cpp
  85. BlinkM.cpp
  86. bootapp.c
  87. cardreader.cpp
  88. cmdqueue.cpp
  89. Configuration.cpp
  90. ConfigurationStore.cpp
  91. conv2str.cpp
  92. Dcodes.cpp
  93. eeprom.cpp
  94. fancheck.cpp
  95. Filament_sensor.cpp
  96. first_lay_cal.cpp
  97. heatbed_pwm.cpp
  98. la10compat.cpp
  99. language.c
  100. lcd.cpp
  101. Marlin_main.cpp
  102. MarlinSerial.cpp
  103. menu.cpp
  104. mesh_bed_calibration.cpp
  105. mesh_bed_leveling.cpp
  106. messages.cpp
  107. mmu2.cpp
  108. mmu2_crc.cpp
  109. mmu2_error_converter.cpp
  110. mmu2_fsensor.cpp
  111. mmu2_log.cpp
  112. mmu2_power.cpp
  113. mmu2_progress_converter.cpp
  114. mmu2_protocol.cpp
  115. mmu2_protocol_logic.cpp
  116. mmu2_reporting.cpp
  117. mmu2_serial.cpp
  118. motion_control.cpp
  119. optiboot_xflash.cpp
  120. pat9125.cpp
  121. planner.cpp
  122. Prusa_farm.cpp
  123. qr_solve.cpp
  124. rbuf.c
  125. Sd2Card.cpp
  126. SdBaseFile.cpp
  127. SdFatUtil.cpp
  128. SdFile.cpp
  129. SdVolume.cpp
  130. Servo.cpp
  131. sm4.c
  132. sound.cpp
  133. speed_lookuptable.cpp
  134. spi.c
  135. SpoolJoin.cpp
  136. stepper.cpp
  137. swi2c.c
  138. swspi.cpp
  139. Tcodes.cpp
  140. temperature.cpp
  141. timer02.c
  142. Timer.cpp
  143. tmc2130.cpp
  144. tone04.c
  145. twi.cpp
  146. uart2.c
  147. ultralcd.cpp
  148. util.cpp
  149. vector_3.cpp
  150. xflash.c
  151. xflash_dump.cpp
  152. xyzcal.cpp
  153. )
  154. list(TRANSFORM FW_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/Firmware/)
  155. foreach(_FILE ${FW_SOURCES})
  156. get_filename_component(_BASE ${_FILE} NAME)
  157. set_property(SOURCE ${_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-frandom-seed=${_BASE}.o")
  158. endforeach()
  159. set(AVR_SOURCES
  160. wiring_digital.c
  161. WInterrupts.c
  162. wiring_pulse.c
  163. hooks.c
  164. wiring.c
  165. wiring_analog.c
  166. wiring_shift.c
  167. CDC.cpp
  168. PluggableUSB.cpp
  169. HardwareSerial.cpp
  170. HardwareSerial0.cpp
  171. HardwareSerial1.cpp
  172. HardwareSerial3.cpp
  173. IPAddress.cpp
  174. HardwareSerial2.cpp
  175. Print.cpp
  176. Stream.cpp
  177. Tone.cpp
  178. USBCore.cpp
  179. WMath.cpp
  180. WString.cpp
  181. abi.cpp
  182. main.cpp
  183. # new.cpp # What happened to this? it was removed in 1.0.5-1 to 1.0.5.2?
  184. )
  185. list(TRANSFORM AVR_SOURCES PREPEND ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/)
  186. foreach(_FILE ${AVR_SOURCES})
  187. get_filename_component(_BASE ${_FILE} NAME)
  188. set_property(SOURCE ${_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-frandom-seed=core/${_BASE}.o")
  189. endforeach()
  190. # optimizations
  191. if(CMAKE_CROSSCOMPILING)
  192. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  193. add_compile_options(-Og)
  194. else()
  195. add_compile_options(-Os)
  196. endif()
  197. # mcu related settings
  198. set(MCU_FLAGS -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10819 -DARDUINO_AVR_PRUSA_EINSY_RAMBO -DARDUINO_ARCH_AVR)
  199. add_compile_options(${MCU_FLAGS})
  200. add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>)
  201. add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>)
  202. add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-fno-rtti>)
  203. add_compile_options(-Wall -Wextra -Wno-expansion-to-defined -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects)
  204. # split and gc sections
  205. add_link_options(-Os -g -flto -Wl,--gc-sections -mmcu=atmega2560 -Wl,-u,vfprintf -lprintf_flt -lm )
  206. # Create this target before we apply the GC options
  207. add_library(avr_core STATIC ${AVR_SOURCES})
  208. target_include_directories(avr_core PRIVATE
  209. ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/
  210. ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/
  211. )
  212. # disable exceptions and related metadata
  213. add_compile_options(-fno-unwind-tables)
  214. add_link_options(-Wl,--defsym,__exidx_start=0,--defsym,__exidx_end=0)
  215. else()
  216. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  217. add_compile_options(-O0)
  218. else()
  219. add_compile_options(-O2)
  220. endif()
  221. endif()
  222. # enable all warnings (well, not all, but some)
  223. add_compile_options(-Wsign-compare)
  224. add_compile_options($<$<COMPILE_LANGUAGE:C>:-std=gnu11>)
  225. # support _DEBUG macro (some code uses to recognize debug builds)
  226. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  227. add_compile_definitions(_DEBUG)
  228. endif()
  229. # Setup language resources:
  230. # file(GLOB LANG_VARIANTS RELATIVE ${PROJECT_SOURCE_DIR}/lang/po ${PROJECT_SOURCE_DIR}/lang/po/Firmware_??.po)
  231. # string(REPLACE "Firmware_" "" LANG_VARIANTS "${LANG_VARIANTS}")
  232. # string(REPLACE ".po" "" LANG_VARIANTS "${LANG_VARIANTS}")
  233. # list(SORT LANG_VARIANTS)
  234. # message("Languages found: ${LANG_VARIANTS}")
  235. # Meta target to build absolutely everything
  236. add_custom_target(ALL_FIRMWARE)
  237. add_custom_target(ALL_ENGLISH)
  238. add_custom_target(ALL_MULTILANG)
  239. add_dependencies(ALL_FIRMWARE ALL_ENGLISH ALL_MULTILANG)
  240. function(add_base_binary variant_name)
  241. add_executable(${variant_name} ${FW_SOURCES} ${FW_HEADERS} ${VARIANT_CFG_FILE})
  242. set_target_properties(${variant_name} PROPERTIES CXX_STANDARD 17)
  243. target_include_directories(${variant_name} PRIVATE
  244. ${PRUSA_BOARDS_DIR}/cores/prusa_einsy_rambo/
  245. ${PRUSA_BOARDS_DIR}/variants/prusa_einsy_rambo/
  246. ${VARIANT_CFG_DIR} # Include the header for this variant.
  247. ${CMAKE_SOURCE_DIR}/Firmware
  248. )
  249. target_link_libraries(${variant_name} avr_core)
  250. # # configure linker script
  251. set(LINKER_SCRIPT ${PRUSA_BOARDS_DIR}/ldscripts/avr6.xn)
  252. target_link_options(${variant_name} PUBLIC -Wl,-T,${LINKER_SCRIPT})
  253. # limit the text section to 248K (256K - 8k reserved for the bootloader)
  254. target_link_options(${variant_name} PUBLIC -Wl,--defsym=__TEXT_REGION_LENGTH__=248K)
  255. # generate firmware.bin file
  256. objcopy(${variant_name} "ihex" ".hex")
  257. # produce ASM listing. Note we also specify the .map as a byproduct so it gets cleaned
  258. # because link_options doesn't have a "generated outputs" feature.
  259. add_custom_command(
  260. TARGET ${variant_name} POST_BUILD COMMAND ${CMAKE_OBJDUMP} -CSd ${variant_name} > ${variant_name}.asm
  261. BYPRODUCTS ${variant_name}.asm ${variant_name}.map
  262. )
  263. # inform about the firmware's size in terminal
  264. add_custom_command(
  265. TARGET ${variant_name} POST_BUILD COMMAND ${CMAKE_SIZE_UTIL} -C --mcu=atmega2560 ${variant_name}
  266. )
  267. report_size(${variant_name})
  268. # generate linker map file
  269. target_link_options(${variant_name} PUBLIC -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${variant_name}.map)
  270. target_compile_definitions(${variant_name} PRIVATE
  271. CMAKE_LANG_CONTROL
  272. )
  273. endfunction()
  274. function(fw_add_variant variant_name)
  275. # Create the Configuration_Prusa.h for this variant so it can be #included.
  276. set(VARIANT_CFG_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
  277. set(VARIANT_CFG_FILE "${VARIANT_CFG_DIR}/Configuration_prusa.h")
  278. add_custom_command(OUTPUT ${VARIANT_CFG_FILE}
  279. COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/Firmware/variants/${variant_name}.h ${VARIANT_CFG_FILE}
  280. COMMENT "Generating Configuration_prusa.h for ${variant_name}"
  281. BYPRODUCTS ${VARIANT_CFG_DIR}
  282. )
  283. STRING(REPLACE "1_75mm_" "" variant_name "${variant_name}")
  284. STRING(REPLACE "-E3Dv6full" "" variant_name "${variant_name}")
  285. SET(FW_EN "${variant_name}_EN-only")
  286. SET(FW_MULTI "${variant_name}_Multilang")
  287. add_base_binary(${FW_EN})
  288. # target_compile_options(${variant_name} PRIVATE) # turn this on for lolz -Wdouble-promotion)
  289. target_compile_definitions(${FW_EN} PUBLIC LANG_MODE=0)
  290. add_custom_command(
  291. TARGET ${FW_EN}
  292. POST_BUILD
  293. COMMAND ${CMAKE_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/${FW_EN} ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${FW_EN}.hex
  294. BYPRODUCTS ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${FW_EN}.hex
  295. COMMENT "Generating ${variant_name} hex"
  296. )
  297. add_dependencies(ALL_ENGLISH "${FW_EN}")
  298. if (NOT SECONDARY_LANGUAGES)
  299. return() #Done, if no languages there's nothing else to do.
  300. else()
  301. add_base_binary(${FW_MULTI})
  302. target_compile_definitions(${FW_MULTI} PUBLIC LANG_MODE=1)
  303. endif()
  304. #Construct language map
  305. set(LANG_TMP_DIR ${CMAKE_BINARY_DIR}/${variant_name}/lang)
  306. set(LANG_MAP ${LANG_TMP_DIR}/${variant_name}_lang.map)
  307. set(LANG_FWBIN ${CMAKE_CURRENT_BINARY_DIR}/${variant_name}.bin)
  308. set(LANG_FINAL_BIN ${LANG_TMP_DIR}/${variant_name}_lang.bin)
  309. set(LANG_FINAL_HEX ${LANG_TMP_DIR}/${variant_name}_lang.hex)
  310. add_custom_command(OUTPUT ${LANG_FWBIN}
  311. COMMAND "${CMAKE_OBJCOPY}" -I ihex -O binary ${CMAKE_CURRENT_BINARY_DIR}/${variant_name}_Multilang.hex ${LANG_FWBIN}
  312. DEPENDS ${FW_MULTI}
  313. )
  314. add_custom_command(OUTPUT ${LANG_MAP}
  315. COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-map.py "${FW_MULTI}" "${LANG_FWBIN}" > "${LANG_MAP}"
  316. DEPENDS ${LANG_FWBIN}
  317. )
  318. set(LANG_BINS "")
  319. foreach (LANG IN LISTS SELECTED_LANGUAGES)
  320. set(LANG_BIN ${LANG_TMP_DIR}/${variant_name}_${LANG}.bin)
  321. set(PO_FILE "${CMAKE_SOURCE_DIR}/lang/po/Firmware_${LANG}.po")
  322. add_custom_command(OUTPUT ${LANG_BIN}
  323. # COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lang/lang-check.py --no-warning --map "${LANG_MAP}" "${PO_FILE}"
  324. # COMMAND ${CMAKE_COMMAND} -E echo "Building lang_${LANG}.bin"
  325. COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-build.py ${LANG_MAP} ${PO_FILE} ${LANG_BIN}
  326. # Check bin size:
  327. COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_MAX_SIZE}
  328. -DLANG_FILE=${LANG_BIN}
  329. -P ${PROJECT_CMAKE_DIR}/Check_lang_size.cmake
  330. DEPENDS ${LANG_MAP}
  331. COMMENT "Generating ${variant_name}_${LANG}.bin from .po"
  332. )
  333. LIST(APPEND LANG_BINS ${LANG_BIN})
  334. endforeach()
  335. string(FIND ${variant_name} "MK3" HAS_XFLASH)
  336. if (${HAS_XFLASH} GREATER_EQUAL 0)
  337. add_custom_command( OUTPUT ${LANG_FINAL_BIN}
  338. COMMAND ${CMAKE_COMMAND} -E cat ${LANG_BINS} > ${LANG_FINAL_BIN}
  339. DEPENDS ${LANG_BINS}
  340. COMMENT "Merging language binaries"
  341. )
  342. add_custom_command( OUTPUT ${LANG_FINAL_BIN}
  343. COMMAND ${CMAKE_COMMAND} -DLANG_MAX_SIZE=${LANG_BIN_MAX}
  344. -DLANG_FILE=${LANG_FINAL_BIN}
  345. -P ${PROJECT_CMAKE_DIR}/Check_final_lang_bin_size.cmake
  346. APPEND
  347. )
  348. add_custom_command( OUTPUT ${LANG_FINAL_HEX}
  349. COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex ${LANG_FINAL_BIN} ${LANG_FINAL_HEX}
  350. DEPENDS ${LANG_FINAL_BIN}
  351. COMMENT "Generating Hex for language data"
  352. )
  353. set(LANG_HEX ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${variant_name}-Languages.hex)
  354. add_custom_target(${variant_name}-language-hex
  355. COMMAND ${CMAKE_COMMAND} -E copy ${FW_MULTI}.hex ${LANG_HEX}
  356. COMMAND ${CMAKE_COMMAND} -E cat ${LANG_FINAL_HEX} >> ${LANG_HEX}
  357. COMMENT "Generating final ${variant_name}-Languages.hex"
  358. BYPRODUCTS ${LANG_HEX}
  359. DEPENDS ${LANG_FINAL_HEX}
  360. )
  361. add_dependencies(ALL_MULTILANG ${variant_name}-language-hex)
  362. else()
  363. set (ALL_VARIANT_HEXES "")
  364. # Non-xflash, e.g. MK2.5
  365. foreach(LANG IN LISTS SELECTED_LANGUAGES)
  366. SET(LANG_HEX_FN ${variant_name}-en_${LANG})
  367. SET(LANG_HEX ${CMAKE_BINARY_DIR}/${FN_PREFIX}-${LANG_HEX_FN}.hex)
  368. SET(LANG_BIN ${LANG_TMP_DIR}/${variant_name}_${LANG}.bin)
  369. SET(LANG_FWBIN_TMP ${LANG_TMP_DIR}/${variant_name}-en_${LANG}.bin)
  370. #Intermediate 2-lang bin
  371. add_custom_command(OUTPUT ${LANG_FWBIN_TMP}
  372. COMMAND ${CMAKE_COMMAND} -E copy ${LANG_FWBIN} ${LANG_FWBIN_TMP}
  373. COMMAND ${CMAKE_SOURCE_DIR}/lang/lang-patchsec.py ${FW_MULTI} ${LANG_BIN} ${LANG_FWBIN_TMP}
  374. DEPENDS ${LANG_FWBIN} ${LANG_BIN}
  375. COMMENT "Generating ${variant_name}-en_${LANG}.bin"
  376. )
  377. #Final hex:
  378. add_custom_target(${LANG_HEX_FN}
  379. COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex ${LANG_FWBIN_TMP} ${LANG_HEX}
  380. BYPRODUCTS ${LANG_HEX}
  381. DEPENDS ${LANG_FWBIN_TMP}
  382. COMMENT "Creating ${LANG_HEX_FN}.hex"
  383. )
  384. LIST(APPEND ALL_VARIANT_HEXES ${LANG_HEX_FN})
  385. endforeach()
  386. add_custom_target("${variant_name}-All-Languages"
  387. DEPENDS ${ALL_VARIANT_HEXES}
  388. )
  389. add_dependencies(ALL_MULTILANG "${variant_name}-All-Languages")
  390. endif()
  391. endfunction()
  392. if(CMAKE_CROSSCOMPILING)
  393. file(GLOB FW_VARIANTS RELATIVE ${PROJECT_SOURCE_DIR}/Firmware/variants ${PROJECT_SOURCE_DIR}/Firmware/variants/*.h)
  394. foreach(THIS_VAR IN LISTS FW_VARIANTS)
  395. string(REPLACE ".h" "" TRIMMED_NAME "${THIS_VAR}")
  396. message("Variant added: ${TRIMMED_NAME}")
  397. string(REPLACE "-E3Dv6full" "" DIR_NAME "${TRIMMED_NAME}")
  398. string(REPLACE "1_75mm_" "" DIR_NAME "${DIR_NAME}")
  399. # Generate a file in a subfolder so that we can organize things a little more neatly in VS code
  400. FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
  401. FILE(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME}/CMakeLists.txt "project(${DIR_NAME})\nfw_add_variant(${TRIMMED_NAME})")
  402. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/build_gen/${DIR_NAME})
  403. #fw_add_variant(${TRIMMED_NAME})
  404. endforeach(THIS_VAR IN LISTS FW_VARIANTS)
  405. endif()
  406. if(NOT CMAKE_CROSSCOMPILING)
  407. enable_testing()
  408. add_subdirectory(tests)
  409. endif()