Use target compiler for generating lua exported definitions (#7186)
[opentx.git] / radio / src / CMakeLists.txt
blob39da9431190310f5a330bd0c66113fa941f228e5
1 include(CMakeForceCompiler)
2 include(Bitmaps)
4 set(PCB_TYPES X9LITE X9LITES X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X)
5 set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL)
6 set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU)
8 set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}")
9 set_property(CACHE PCB PROPERTY STRINGS ${PCB_TYPES})
10 set(TRANSLATIONS "EN" CACHE STRING "Radio language, one of: ${GUI_LANGUAGES}")
11 set_property(CACHE TRANSLATIONS PROPERTY STRINGS ${GUI_LANGUAGES})
12 set(SPLASH "DEFAULT" CACHE STRING "Splash (DEFAULT/OFF/FRSKY)")
13 set_property(CACHE SPLASH PROPERTY STRINGS DEFAULT OFF FRSKY)
14 set(PPM_UNIT "PERCENT_PREC1" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)")
15 set_property(CACHE PPM_UNIT PROPERTY STRINGS US PERCENT_PREC1 PERCENT_PREC0)
16 set(DEFAULT_MODE "" CACHE STRING "Default sticks mode")
17 set(FONT "STD" CACHE STRING "Choose font : STD or SQT5")
18 set_property(CACHE FONT PROPERTY STRINGS SQT5)
19 set(POPUP_LEVEL 2 CACHE STRING "Popup level")
21 option(HELI "Heli menu" ON)
22 option(FLIGHT_MODES "Flight Modes" ON)
23 option(CURVES "Curves" ON)
24 option(GVARS "Global variables" ON)
25 option(GUI "GUI enabled" ON)
26 option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" ON)
27 option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF)
28 option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" ON)
29 option(DANGEROUS_MODULE_FUNCTIONS "Dangerous module functions (RangeCheck / Bind / Module OFF, etc.) available" OFF)
30 option(FAI "Competition mode (no telemetry)" OFF)
31 option(AUTOSOURCE "Automatic source detection in menus" ON)
32 option(AUTOSWITCH "Automatic switch detection in menus" ON)
33 option(SEMIHOSTING "Enable debugger semihosting" OFF)
34 option(JITTER_MEASURE "Enable ADC jitter measurement" OFF)
35 option(WATCHDOG "Enable hardware Watchdog" ON)
36 option(ASTERISK "Enable asterisk icon (test only firmware)" OFF)
37 if(SDL_FOUND)
38   option(SIMU_AUDIO "Enable simulator audio." ON)
39 endif()
40 option(LUA "Enable LUA support" ON)
41 option(SIMU_DISKIO "Enable disk IO simulation in simulator. Simulator will use FatFs module and simulated IO layer that  uses \"./sdcard.image\" file as image of SD card. This file must contain whole SD card from first to last sector" OFF)
42 option(SIMU_LUA_COMPILER "Pre-compile and save Lua scripts in simulator." ON)
43 option(FAS_PROTOTYPE "Support of old FAS prototypes (different resistors)" OFF)
44 option(RAS "RAS (SWR) enabled" ON)
45 option(TEMPLATES "Model templates menu" OFF)
46 option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON)
47 option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF)
48 option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF)
49 option(NANO "Use nano newlib and binalloc")
50 option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF)
51 option(MODULE_PROTOCOL_FCC "Add support for FCC modules" ON)
52 option(MODULE_PROTOCOL_LBT "Add support for EU/LBT modules" ON)
53 option(MODULE_PROTOCOL_FLEX "Add support for non certified FLEX modules" OFF)
54 option(MODULE_PROTOCOL_D8 "Add support for D8 modules" ON)
55 option(FRSKY_RELEASE "Used to build FrSky released firmware" OFF)
57 # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags.
58 set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).")
59 set(FIRMWARE_C_FLAGS_DEBUG "-g" CACHE STRING "Additional flags for firmware target (Debug config) c compiler (note: CMAKE_C_FLAGS_DEBUG is ignored for firmware/bootloader).")
60 set(FIRMWARE_CXX_FLAGS "" CACHE STRING "Additional flags for firmware target c++ compiler (note: all CMAKE_CXX_FLAGS[_*] are ignored for firmware/bootloader).")
61 set(FIRMWARE_CXX_FLAGS_DEBUG "-g" CACHE STRING "Additional flags for firmware target (Debug config) c++ compiler (note: CMAKE_CXX_FLAGS_DEBUG is ignored for firmware/bootloader).")
63 set(THIRDPARTY_DIR thirdparty)
64 set(LUA_DIR ${THIRDPARTY_DIR}/Lua/src)
65 set(COOS_DIR ${THIRDPARTY_DIR}/CoOS)
66 set(FATFS_DIR ${THIRDPARTY_DIR}/FatFs)
67 set(RADIO_BIN_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
69 configure_file(stamp.h.in stamp.h @ONLY)
71 add_subdirectory(translations)
72 add_subdirectory(bitmaps)
73 add_subdirectory(fonts)
75 set(EEPROM_VARIANT  0)
76 set(GVARS_VARIANT   1)
77 set(FRSKY_VARIANT   2)
78 set(3POS_VARIANT    4)
80 set(RADIO_DEPENDENCIES firmware_translations)
82 set(FATFS_SRC
83   ${FATFS_DIR}/ff.c
84   ${FATFS_DIR}/fattime.c
85   ${FATFS_DIR}/option/ccsbcs.c
88 if(PCB STREQUAL X12S OR PCB STREQUAL X10)
89   include(targets/horus/CMakeLists.txt)
90 elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL XLITE OR PCB STREQUAL XLITES)
91   include(targets/taranis/CMakeLists.txt)
92 elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X)
93   include(targets/sky9x/CMakeLists.txt)
94 else()
95   message(FATAL_ERROR "Unknown PCB '${PCB}'")
96 endif()
98 if(NOT PCB STREQUAL 9XRPRO)
99   option(DBLKEYS "Double Keys" ON)
100   if(DBLKEYS)
101     add_definitions(-DDBLKEYS)
102   endif()
103 endif()
105 if(CPU_TYPE STREQUAL STM32F4)
106   include(targets/common/arm/stm32/f4/CMakeLists.txt)
107 endif()
109 if(CPU_TYPE STREQUAL STM32F2)
110   include(targets/common/arm/stm32/f2/CMakeLists.txt)
111 endif()
113 if(CPU_FAMILY STREQUAL STM32)
114   include(targets/common/arm/stm32/CMakeLists.txt)
115 endif()
117 if(ARCH STREQUAL ARM)
118   include(targets/common/arm/CMakeLists.txt)
119 endif()
121 include_directories(targets/${TARGET_DIR} ${THIRDPARTY_DIR})
123 foreach(LANGUAGE ${GUI_LANGUAGES})
124   if(TRANSLATIONS STREQUAL ${LANGUAGE})
125     add_definitions(-DTRANSLATIONS_${LANGUAGE} -DTRANSLATIONS="${LANGUAGE}")
126   endif()
127 endforeach()
129 set(SRC ${SRC} debug.cpp)
131 if(${EEPROM} STREQUAL SDCARD)
132   set(SRC ${SRC} storage/storage_common.cpp storage/sdcard_raw.cpp storage/modelslist.cpp)
133 elseif(${EEPROM} STREQUAL EEPROM_RLC)
134   set(SRC ${SRC} storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp)
135   add_definitions(-DEEPROM -DEEPROM_RLC)
136 else()
137   set(SRC ${SRC} storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp)
138   add_definitions(-DEEPROM -DEEPROM_RAW)
139 endif()
141 include(storage/conversions/CMakeLists.txt)
143 add_definitions(-DFLAVOUR="${FLAVOUR}")
145 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
146 include_directories(${CMAKE_CURRENT_BINARY_DIR})
147 include_directories(${CMAKE_CURRENT_BINARY_DIR}/bitmaps/${GUI_DIR})
149 include(gui/CMakeLists.txt)
151 if(RTC_BACKUP_RAM)
152   add_definitions(-DRTC_BACKUP_RAM)
153   set(SRC ${SRC} storage/rlc.cpp)
154   set(FIRMWARE_SRC ${FIRMWARE_SRC} storage/rtc_backup.cpp)
155   set(GTEST_SRC ${GTEST_SRC} ${RADIO_SRC_DIRECTORY}/storage/rtc_backup.cpp)
156 endif()
158 if(NOT LUA STREQUAL NO)
159   add_definitions(-DLUA)
160   if(LUA_COMPILER)
161     add_definitions(-DLUA_COMPILER)
162   endif()
163   if(LUA_ALLOCATOR_TRACER AND DEBUG)
164     add_definitions(-DLUA_ALLOCATOR_TRACER)
165   endif()
166   if(NOT "${LUA_SCRIPT_LOAD_MODE}" STREQUAL "")
167     add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
168   endif()
169   include_directories(${LUA_DIR})
170   set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${LUA_EXPORT})
171   if(LUA STREQUAL YES)
172     add_definitions(-DLUA_MODEL_SCRIPTS)
173     set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
174   endif()
175   set(SRC ${SRC} lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp)
176   if(PCB STREQUAL X12S OR PCB STREQUAL X10)
177     set(SRC ${SRC} lua/widgets.cpp)
178   endif()
179   set(LUA_SRC lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c
180     lstate.c lstring.c ltable.c lrotable.c ltm.c lundump.c lvm.c lzio.c linit.c
181     lbaselib.c lmathlib.c lbitlib.c loadlib.c lauxlib.c ltablib.c lcorolib.c liolib.c lstrlib.c
182     )
183   foreach(FILE ${LUA_SRC})
184     set(SRC ${SRC} ${LUA_DIR}/${FILE})
185   endforeach()
186   if(MSVC)
187     # silence lots of warnings regarding "insecure" use of functions (sprintf, strcpy, etc) from Lua code
188     set(WARNING_FLAGS "${WARNING_FLAGS} /D_CRT_SECURE_NO_WARNINGS")
189   endif()
190 endif()
192 if(HELI)
193   add_definitions(-DHELI)
194 endif()
196 if(FLIGHT_MODES)
197   add_definitions(-DFLIGHT_MODES)
198   set(GUI_SRC ${GUI_SRC} model_flightmodes.cpp)
199 endif()
201 if(CURVES)
202   add_definitions(-DCURVES)
203   set(SRC ${SRC} curves.cpp)
204 endif()
206 if(GVARS)
207   add_definitions(-DGVARS)
208   set(SRC ${SRC} gvars.cpp)
209   math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT})
210 endif()
212 if(FAI STREQUAL YES)
213   add_definitions(-DFAI)
214 elseif(FAI STREQUAL CHOICE)
215   add_definitions(-DFAI_CHOICE)
216 endif()
218 if(NOT RAS)
219   add_definitions(-DNO_RAS)
220 endif()
222 if(FAS_PROTOTYPE)
223   add_definitions(-DFAS_PROTOTYPE)
224 endif()
226 if(AUTOSOURCE)
227   add_definitions(-DAUTOSOURCE)
228 endif()
230 if(AUTOSWITCH)
231   add_definitions(-DAUTOSWITCH)
232 endif()
234 if(JITTER_MEASURE)
235   add_definitions(-DJITTER_MEASURE)
236 endif()
238 if(ASTERISK)
239   add_definitions(-DASTERISK)
240 endif()
242 if(WATCHDOG)
243   add_definitions(-DWATCHDOG)
244 endif()
246 if(SIMU_AUDIO)
247   add_definitions(-DSIMU_AUDIO)
248 endif()
250 if(SIMU_DISKIO)
251   add_definitions(-DSIMU_DISKIO)
252 endif()
254 if(SDCARD)
255   add_definitions(-DSDCARD)
256   include_directories(${FATFS_DIR} ${FATFS_DIR}/option)
257   set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp)
258   set(FIRMWARE_SRC ${FIRMWARE_SRC} ${FATFS_SRC})
259 endif()
261 if(SHUTDOWN_CONFIRMATION)
262   add_definitions(-DSHUTDOWN_CONFIRMATION)
263 endif()
265 if(PPM_UNIT STREQUAL US)
266   add_definitions(-DPPM_UNIT_US)
267 elseif(PPM_UNIT STREQUAL PERCENT_PREC1)
268   add_definitions(-DPPM_UNIT_PERCENT_PREC1)
269 else()
270   add_definitions(-DPPM_UNIT_PERCENT_PREC0)
271 endif()
273 if(PPM_CENTER_ADJUSTABLE)
274   add_definitions(-DPPM_CENTER_ADJUSTABLE)
275 endif()
277 if(PPM_LIMITS_SYMETRICAL)
278   add_definitions(-DPPM_LIMITS_SYMETRICAL)
279 endif()
281 if(OVERRIDE_CHANNEL_FUNCTION)
282   add_definitions(-DOVERRIDE_CHANNEL_FUNCTION)
283 endif()
285 if(DANGEROUS_MODULE_FUNCTIONS)
286   add_definitions(-DDANGEROUS_MODULE_FUNCTIONS)
287 endif()
289 if(NOT SPLASH STREQUAL OFF)
290   add_definitions(-DSPLASH)
291 endif()
293 if(NOT DEFAULT_MODE STREQUAL "")
294   add_definitions(-DDEFAULT_MODE=${DEFAULT_MODE})
295 endif()
297 if(TRACE_SIMPGMSPACE)
298   add_definitions(-DTRACE_SIMPGMSPACE)
299 endif()
301 if(TRACE_LUA_INTERNALS)
302   add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
303 endif()
305 if(FRSKY_STICKS)
306   add_definitions(-DFRSKY_STICKS)
307 endif()
309 if(NOT FONT STREQUAL "")
310   add_definitions(-DFONT=${DEFAULT_MODE})
311 endif()
313 if(EEPROM_VARIANT_NEEDED)
314   add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT})
315 endif()
317 if(NIGHTLY_BUILD_WARNING)
318   add_definitions(-DNIGHTLY_BUILD_WARNING)
319 endif()
321 if(MODULE_PROTOCOL_FCC)
322   add_definitions(-DMODULE_PROTOCOL_FCC)
323 endif()
325 if(MODULE_PROTOCOL_LBT)
326   add_definitions(-DMODULE_PROTOCOL_LBT)
327 endif()
329 if(MODULE_PROTOCOL_FLEX)
330   add_definitions(-DMODULE_PROTOCOL_FLEX)
331 endif()
333 if(MODULE_PROTOCOL_D8)
334   add_definitions(-DMODULE_PROTOCOL_D8)
335 endif()
337 if(JUMPER_RELEASE)
338   add_definitions(-DJUMPER_RELEASE)
339 endif()
341 if(FRSKY_RELEASE)
342   add_definitions(-DFRSKY_RELEASE)
343   set(POPUP_LEVEL 3)
344 endif()
346 add_definitions(-DPOPUP_LEVEL=${POPUP_LEVEL})
348 set(SRC
349   ${SRC}
350   opentx.cpp
351   functions.cpp
352   strhelpers.cpp
353   switches.cpp
354   mixer.cpp
355   stamp.cpp
356   timers.cpp
357   trainer.cpp
358   )
360 if(GUI)
361   add_definitions(-DGUI)
362   set(SRC
363     ${SRC}
364     keys.cpp
365     maths.cpp
366     translations.cpp
367     gui/gui_common.cpp
368     )
369   foreach(FILE ${GUI_SRC})
370     set(SRC ${SRC} gui/${GUI_DIR}/${FILE})
371   endforeach()
372 endif()
374 foreach(FILE ${TARGET_SRC})
375   set(SRC targets/${TARGET_DIR}/${FILE} ${SRC})
376 endforeach()
378 foreach(FILE ${FIRMWARE_TARGET_SRC})
379   set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/${TARGET_DIR}/${FILE})
380 endforeach()
382 foreach(FILE ${PULSES_SRC})
383   set(SRC ${SRC} pulses/${FILE})
384 endforeach()
386 add_definitions(-DCORRECT_NEGATIVE_SHIFTS)
388 if(NOT MSVC)
389   set(WARNING_FLAGS "${WARNING_FLAGS} -Wall -Wno-address-of-packed-member -Wno-strict-aliasing -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits")
390   if(WARNINGS_AS_ERRORS)
391     set(WARNING_FLAGS "${WARNING_FLAGS} -Werror")
392   endif(WARNINGS_AS_ERRORS)
393 else()
394   add_definitions(-DHAVE_STRUCT_TIMESPEC)  # this is for pthread.h
395   if(WARNINGS_AS_ERRORS)
396     set(WARNING_FLAGS "${WARNING_FLAGS} /WX")
397   endif(WARNINGS_AS_ERRORS)
398 endif()
400 add_subdirectory(targets/simu)
401 if(NOT MSVC)
402   add_subdirectory(tests)
403 endif()
405 set(SRC ${SRC} ${FIRMWARE_SRC})
408 ##### firmware target #####
410 option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON)
411 if(NOT FIRMWARE_TARGET)
412   message(STATUS "firmware target disabled")
413   return()
414 endif()
416 set(CMAKE_EXECUTABLE_SUFFIX ".elf")
417 # trick to remove the -rdynamic and --out-implib issues
418 set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
419 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
420 # similar for -mmacosx-version-min="
421 set(CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG "")
422 set(CMAKE_CXX_OSX_DEPLOYMENT_TARGET_FLAG "")
423 # reset some CMake default flags which assume optimization levels/etc
424 set(CMAKE_C_FLAGS "${FIRMWARE_C_FLAGS}")
425 set(CMAKE_C_FLAGS_DEBUG "${FIRMWARE_C_FLAGS_DEBUG}")
426 set(CMAKE_C_FLAGS_RELEASE "")
427 set(CMAKE_C_FLAGS_MINSIZEREL "")
428 set(CMAKE_C_FLAGS_RELWITHDEBINFO "")
429 set(CMAKE_CXX_FLAGS "${FIRMWARE_CXX_FLAGS}")
430 set(CMAKE_CXX_FLAGS_DEBUG "${FIRMWARE_CXX_FLAGS_DEBUG}")
431 set(CMAKE_CXX_FLAGS_RELEASE "")
432 set(CMAKE_CXX_FLAGS_MINSIZEREL "")
433 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "")
434 # customize linker command
435 set(CMAKE_EXE_LINKER_FLAGS "")
436 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
437 set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
439 use_cxx11()  # ensure gnu++11 in CXX_FLAGS with CMake < 3.1
441 find_program(BASH bash HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "bash shell for firmware size report (eg. c:/cygwin/bin/bash.exe on Windows).")
443 if(NOT MSVC)
444   set(OPT s)
446   if(ARCH STREQUAL ARM)
447     enable_language(ASM)
448     set(CMAKE_C_COMPILER arm-none-eabi-gcc)
449     set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
450     set(CMAKE_ASM_COMPILER arm-none-eabi-as)
452     set(CMAKE_SYSTEM_NAME Generic)
453     set(CMAKE_SYSTEM_VERSION 1)
454     set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> -o <OBJECT> <SOURCE>")
456     set(COMMON_FLAGS "-mcpu=${MCU} -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=firmware.lst -O${OPT} -gdwarf-2 -DHSE_VALUE=${HSE_VALUE} -fno-exceptions -fdata-sections -ffunction-sections ${WARNING_FLAGS}")
457     set(COMMON_FLAGS "${COMMON_FLAGS} ${FPU_FLAGS}")
459     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS} -Wimplicit")
460     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
462     # these are in addition to CMAKE_CXX_FLAGS
463     set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
465     if(ACCESS_LIB)
466       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--whole-archive ${RADIO_SRC_DIRECTORY}/${THIRDPARTY_DIR}/libACCESS/libAccess.a -Wl,--no-whole-archive")
467     endif()
468     
469     if(SEMIHOSTING)
470       add_definitions(-DSEMIHOSTING)
471       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
472     endif()
474     # Use newlib nano, which saves a few kilobytes.
475     if(NOT NANO STREQUAL NO)
476       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
477       if(NOT LUA STREQUAL NO)
478         # Lua needs %g and %f
479         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float -u _scanf_float")
480       endif()
481       # Nano's malloc does work well with lua, use our own
482       add_definitions(-DUSE_BIN_ALLOCATOR)
483       set(SRC ${SRC} bin_allocator.cpp)
484     endif()
486     if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X9LITE OR PCB STREQUAL X9LITES OR PCB STREQUAL X10 OR PCB STREQUAL X12S)
487       add_subdirectory(targets/common/arm/stm32/bootloader)
488       include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader)
489       set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader)
490     elseif(OPENRC_BOOTLOADER)
491       # We fetch Mike's bootloader as it is not included inside OpenTX
492       message(STATUS "Downloading Mike's bootloader: https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER}")
493       file(DOWNLOAD https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER} ${CMAKE_CURRENT_BINARY_DIR}/bootloader.lbm STATUS status)
494       list(GET status 0 error_code)
495       if(error_code)
496         list(GET status 1 error_message)
497         message(FATAL_ERROR "Download failed: ${error_message}")
498       endif()
499     endif()
501     add_definitions(-DRTOS_COOS)
503     add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
504     link_libraries(firmware -lstdc++)
505     add_dependencies(firmware ${RADIO_DEPENDENCIES} ${FIRMWARE_DEPENDENCIES})
506     set_target_properties(firmware PROPERTIES EXCLUDE_FROM_ALL TRUE)
508     add_custom_command(
509       TARGET firmware POST_BUILD
510       COMMAND arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
511       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
512     )
514     find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.")  # OS X might only have "awk"
515     if (BASH AND GAWK)
516       add_custom_target(firmware-size
517         COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf'
518         DEPENDS firmware
519         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
520         )
521     else()
522       add_custom_target(firmware-size
523         COMMAND arm-none-eabi-size -A firmware.elf
524         DEPENDS firmware
525         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
526         )
527     endif()
528   endif()  # ARM
530   if(CPU_FAMILY STREQUAL STM32)
531     add_custom_target(flash
532       COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin
533       DEPENDS firmware
534       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
535     )
537     add_custom_target(flash-jtag
538       COMMAND st-flash --reset write firmware.bin 0x8000000
539       DEPENDS firmware
540       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
541       )
543     add_custom_target(flash-stlink
544       COMMAND ST-LINK_CLI -c SWD -P firmware.bin 0x8000000 -Rst -Q
545       DEPENDS firmware-size
546       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
547       )
548   endif()
550   PrintTargetReport("firmware")
552 endif(NOT MSVC)
553 # Include the lua subdirectory after CMAKE_C_COMPILER has been
554 # set. Otherwise, the custom commands it includes will use the
555 # default CMAKE_C_COMPILER instead of the one we set manually
556 add_subdirectory(lua)