Fix 2.2.2RC1 no gvar compile (#5961)
[opentx.git] / radio / src / CMakeLists.txt
blobbfca8706e8ddf13f3b000c9d238b6171a5e52d59
1 include(CMakeForceCompiler)
2 include(Bitmaps)
4 set(PCB_TYPES X7 XLITE X9D X9D+ X9E X10 X12S 9X 9XR 9X128 9XR128 9X2561 GRUVIN9X MEGA2560 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 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)
20 option(HELI "Heli menu" ON)
21 option(FLIGHT_MODES "Flight Modes" ON)
22 option(CURVES "Curves" ON)
23 option(GVARS "Global variables" ON)
24 option(GUI "GUI enabled" ON)
25 option(PPM_CENTER_ADJUSTABLE "PPM center adjustable" ON)
26 option(PPM_LIMITS_SYMETRICAL "PPM limits symetrical" OFF)
27 option(OVERRIDE_CHANNEL_FUNCTION "OverrideChannel function available" ON)
28 option(DANGEROUS_MODULE_FUNCTIONS "Dangerous module functions (RangeCheck / Bind / Module OFF, etc.) available" OFF)
29 option(FAI "Competition mode (no telemetry)" OFF)
30 option(AUTOSOURCE "Automatic source detection in menus" ON)
31 option(AUTOSWITCH "Automatic switch detection in menus" ON)
32 option(SEMIHOSTING "Enable debugger semihosting" OFF)
33 option(JITTER_MEASURE "Enable ADC jitter measurement" OFF)
34 option(WATCHDOG_DISABLED "Disable hardware Watchdog" OFF)
35 if(SDL_FOUND)
36   option(SIMU_AUDIO "Enable simulator audio." ON)
37 endif()
38 option(LUA "Enable LUA support" ON)
39 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)
40 option(SIMU_LUA_COMPILER "Pre-compile and save Lua scripts in simulator." ON)
41 option(FAS_PROTOTYPE "Support of old FAS prototypes (different resistors)" OFF)
42 option(RAS "RAS (SWR) enabled" ON)
43 option(TEMPLATES "Model templates menu" OFF)
44 option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON)
45 option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF)
46 option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF)
47 option(NANO "Use nano newlib and binalloc")
48 option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF)
50 # since we reset all default CMAKE compiler flags for firmware builds, provide an alternate way for user to specify additional flags.
51 set(FIRMWARE_C_FLAGS "" CACHE STRING "Additional flags for firmware target c compiler (note: all CMAKE_C_FLAGS[_*] are ignored for firmware/bootloader).")
52 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).")
53 set(FIRMWARE_CXX_FLAGS "" CACHE STRING "Additional flags for firmware target c++ compiler (note: all CMAKE_CXX_FLAGS[_*] are ignored for firmware/bootloader).")
54 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).")
56 set(THIRDPARTY_DIR thirdparty)
57 set(LUA_DIR ${THIRDPARTY_DIR}/Lua/src)
58 set(COOS_DIR ${THIRDPARTY_DIR}/CoOS)
59 set(FATFS_DIR ${THIRDPARTY_DIR}/FatFs)
60 set(RADIO_BIN_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
62 configure_file(stamp.h.in stamp.h @ONLY)
64 add_subdirectory(translations)
65 add_subdirectory(bitmaps)
66 add_subdirectory(fonts)
68 set(EEPROM_VARIANT  0)
69 set(GVARS_VARIANT   1)
70 set(FRSKY_VARIANT   2)
71 set(3POS_VARIANT    4)
72 set(MAVLINK_VARIANT 8)
73 set(M2561_VARIANT   16384)
74 set(M128_VARIANT    32768)
76 set(FIRMWARE_DEPENDENCIES firmware_translations)
78 set(FATFS_SRC
79   ${FATFS_DIR}/ff.c
80   ${FATFS_DIR}/fattime.c
81   ${FATFS_DIR}/option/ccsbcs.c
84 if(PCB STREQUAL X12S OR PCB STREQUAL X10)
85   include(targets/horus/CMakeLists.txt)
86 elseif(PCB STREQUAL X9E OR PCB STREQUAL X9D+ OR PCB STREQUAL X9D OR PCB STREQUAL X7 OR PCB STREQUAL XLITE)
87   include(targets/taranis/CMakeLists.txt)
88 elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X)
89   include(targets/sky9x/CMakeLists.txt)
90 elseif(PCB STREQUAL 9X OR PCB STREQUAL 9XR OR PCB STREQUAL 9X128 OR PCB STREQUAL 9XR128)
91   include(targets/9x/CMakeLists.txt)
92 elseif(PCB STREQUAL 9X2561)
93   set(ARCH AVR)
94   set(MCU atmega2561)
95   string(TOLOWER ${PCB} FLAVOUR)
96   set(EEPROM EEPROM_RLC)
97   set(SDCARD NO)
98   add_definitions(-DEEPROM_VARIANT=${M2561_VARIANT})
99   set(GUI_DIR 128x64)
100   set(TARGET_DIR 9x)
101   set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps)
102   add_definitions(-DPCBSTD -DPCB${PCB} -DCPUM2561)
103   set(TARGET_SRC ${TARGET_SRC} board.cpp)
104   set(GUI_SRC
105     ${GUI_SRC}
106     model_inputs_mixes.cpp
107     radio_diagkeys.cpp
108     radio_diaganas.cpp)
109   if(SP22)
110     add_definitions(-DSP22)
111   endif()
112   if(PWM_BACKLIGHT)
113     add_definitions(-DPWM_BACKLIGHT)
114   endif()
115   set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} lcd_driver.cpp)
116 elseif(PCB STREQUAL GRUVIN9X)
117   include(targets/gruvin9x/CMakeLists.txt)
118 elseif(PCB STREQUAL MEGA2560)
119   include(targets/mega2560/CMakeLists.txt)
120 else()
121   message(FATAL_ERROR "Unknown PCB '${PCB}'")
122 endif()
124 if(NOT PCB STREQUAL 9XR AND NOT PCB STREQUAL 9XRPRO)
125   option(DBLKEYS "Double Keys" ON)
126   if(DBLKEYS)
127     add_definitions(-DDBLKEYS)
128   endif()
129 endif()
131 if(CPU_TYPE STREQUAL STM32F4)
132   include(targets/common/arm/stm32/f4/CMakeLists.txt)
133 endif()
135 if(CPU_TYPE STREQUAL STM32F2)
136   include(targets/common/arm/stm32/f2/CMakeLists.txt)
137 endif()
139 if(CPU_FAMILY STREQUAL STM32)
140   include(targets/common/arm/stm32/CMakeLists.txt)
141 endif()
143 if(ARCH STREQUAL ARM)
144   include(targets/common/arm/CMakeLists.txt)
145 else()
146   include(targets/common/avr/CMakeLists.txt)
147 endif()
149 include_directories(targets/${TARGET_DIR} ${THIRDPARTY_DIR})
151 foreach(LANGUAGE ${GUI_LANGUAGES})
152   if(TRANSLATIONS STREQUAL ${LANGUAGE})
153     add_definitions(-DTRANSLATIONS_${LANGUAGE} -DTRANSLATIONS="${LANGUAGE}")
154   endif()
155 endforeach()
157 set(SRC ${SRC} debug.cpp)
159 if(${EEPROM} STREQUAL SDCARD)
160   set(SRC ${SRC} storage/storage_common.cpp storage/sdcard_raw.cpp storage/modelslist.cpp)
161 elseif(${EEPROM} STREQUAL EEPROM_RLC)
162   set(SRC ${SRC} storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_rlc.cpp)
163   add_definitions(-DEEPROM -DEEPROM_RLC)
164 else()
165   set(SRC ${SRC} storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp)
166   add_definitions(-DEEPROM -DEEPROM_RAW)
167 endif()
169 if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE)
170   add_definitions(-DEEPROM_CONVERSIONS)
171   set(SRC ${SRC} storage/eeprom_conversions.cpp)
172 endif()
174 add_definitions(-DFLAVOUR="${FLAVOUR}")
176 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
177 include_directories(${CMAKE_CURRENT_BINARY_DIR})
178 include_directories(${CMAKE_CURRENT_BINARY_DIR}/bitmaps/${GUI_DIR})
180 add_subdirectory(lua)
181 include(gui/CMakeLists.txt)
183 if(RAMBACKUP)
184   add_definitions(-DRAMBACKUP)
185   set(SRC ${SRC} storage/rambackup.cpp storage/rlc.cpp)
186 endif()
188 if(TEMPLATES)
189   add_definitions(-DTEMPLATES)
190   set(SRC ${SRC} templates.cpp)
191   set(GUI_SRC ${GUI_SRC} model_templates.cpp)
192 endif()
194 if(NOT LUA STREQUAL NO)
195   add_definitions(-DLUA)
196   if(LUA_COMPILER)
197     add_definitions(-DLUA_COMPILER)
198   endif()
199   if(LUA_ALLOCATOR_TRACER AND DEBUG)
200     add_definitions(-DLUA_ALLOCATOR_TRACER)
201   endif()
202   if(NOT "${LUA_SCRIPT_LOAD_MODE}" STREQUAL "")
203     add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
204   endif()
205   include_directories(${LUA_DIR})
206   set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${LUA_EXPORT})
207   if(LUA STREQUAL YES)
208     add_definitions(-DLUA_MODEL_SCRIPTS)
209     set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
210   endif()
211   set(SRC ${SRC} lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp)
212   if(PCB STREQUAL X12S OR PCB STREQUAL X10)
213     set(SRC ${SRC} lua/widgets.cpp)
214   endif()
215   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
216     lstate.c lstring.c ltable.c lrotable.c ltm.c lundump.c lvm.c lzio.c linit.c
217     lbaselib.c lmathlib.c lbitlib.c loadlib.c lauxlib.c ltablib.c lcorolib.c liolib.c lstrlib.c
218     )
219   foreach(FILE ${LUA_SRC})
220     set(SRC ${SRC} ${LUA_DIR}/${FILE})
221   endforeach()
222   if(MSVC)
223     # silence lots of warnings regarding "insecure" use of functions (sprintf, strcpy, etc) from Lua code
224     set(WARNING_FLAGS "${WARNING_FLAGS} /D_CRT_SECURE_NO_WARNINGS")
225   endif()
226 endif()
228 if(HELI)
229   add_definitions(-DHELI)
230 endif()
232 if(FLIGHT_MODES)
233   add_definitions(-DFLIGHT_MODES)
234   set(GUI_SRC ${GUI_SRC} model_flightmodes.cpp)
235 endif()
237 if(CURVES)
238   add_definitions(-DCURVES)
239   set(SRC ${SRC} curves.cpp)
240 endif()
242 if(GVARS)
243   add_definitions(-DGVARS)
244   set(SRC ${SRC} gvars.cpp)
245   math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT})
246 endif()
248 if(FAI STREQUAL YES)
249   add_definitions(-DFAI)
250 elseif(FAI STREQUAL CHOICE)
251   add_definitions(-DFAI_CHOICE)
252 endif()
254 if(NOT RAS)
255   add_definitions(-DNO_RAS)
256 endif()
258 if(FAS_PROTOTYPE)
259   add_definitions(-DFAS_PROTOTYPE)
260 endif()
262 if(AUTOSOURCE)
263   add_definitions(-DAUTOSOURCE)
264 endif()
266 if(AUTOSWITCH)
267   add_definitions(-DAUTOSWITCH)
268 endif()
270 if(JITTER_MEASURE)
271   add_definitions(-DJITTER_MEASURE)
272 endif()
274 if(WATCHDOG_DISABLED)
275   add_definitions(-DWATCHDOG_DISABLED)
276 endif()
278 if(SIMU_AUDIO)
279   add_definitions(-DSIMU_AUDIO)
280 endif()
282 if(SIMU_DISKIO)
283   add_definitions(-DSIMU_DISKIO)
284 endif()
286 if(SDCARD)
287   add_definitions(-DSDCARD)
288   include_directories(${FATFS_DIR} ${FATFS_DIR}/option)
289   set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp)
290   set(FIRMWARE_SRC ${FIRMWARE_SRC} ${FATFS_SRC})
291 endif()
293 if(SHUTDOWN_CONFIRMATION)
294   add_definitions(-DSHUTDOWN_CONFIRMATION)
295 endif()
297 if(PPM_UNIT STREQUAL US)
298   add_definitions(-DPPM_UNIT_US)
299 elseif(PPM_UNIT STREQUAL PERCENT_PREC1)
300   add_definitions(-DPPM_UNIT_PERCENT_PREC1)
301 else()
302   add_definitions(-DPPM_UNIT_PERCENT_PREC0)
303 endif()
305 if(PPM_CENTER_ADJUSTABLE)
306   add_definitions(-DPPM_CENTER_ADJUSTABLE)
307 endif()
309 if(PPM_LIMITS_SYMETRICAL)
310   add_definitions(-DPPM_LIMITS_SYMETRICAL)
311 endif()
313 if(OVERRIDE_CHANNEL_FUNCTION)
314   add_definitions(-DOVERRIDE_CHANNEL_FUNCTION)
315 endif()
317 if(DANGEROUS_MODULE_FUNCTIONS)
318   add_definitions(-DDANGEROUS_MODULE_FUNCTIONS)
319 endif()
321 if(SPLASH STREQUAL FRSKY)
322   add_definitions(-DSPLASH -DSPLASH_FRSKY)
323 elseif(NOT SPLASH STREQUAL OFF)
324   add_definitions(-DSPLASH)
325 endif()
327 if(NOT DEFAULT_MODE STREQUAL "")
328   add_definitions(-DDEFAULT_MODE=${DEFAULT_MODE})
329 endif()
331 if(TRACE_SIMPGMSPACE)
332   add_definitions(-DTRACE_SIMPGMSPACE)
333 endif()
335 if(TRACE_LUA_INTERNALS)
336   add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
337 endif()
339 if(FRSKY_STICKS)
340   add_definitions(-DFRSKY_STICKS)
341 endif()
343 if(NOT FONT STREQUAL "")
344   add_definitions(-DFONT=${DEFAULT_MODE})
345 endif()
347 if(EEPROM_VARIANT_NEEDED)
348   add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT})
349 endif()
351 if(NIGHTLY_BUILD_WARNING)
352   add_definitions(-DNIGHTLY_BUILD_WARNING)
353 endif(NIGHTLY_BUILD_WARNING)
355 set(SRC
356   ${SRC}
357   opentx.cpp
358   functions.cpp
359   strhelpers.cpp
360   switches.cpp
361   mixer.cpp
362   stamp.cpp
363   timers.cpp
364   trainer_input.cpp
365   )
367 if(GUI)
368   add_definitions(-DGUI)
369   set(SRC
370     ${SRC}
371     keys.cpp
372     maths.cpp
373     translations.cpp
374     gui/gui_common.cpp
375     )
376   foreach(FILE ${GUI_SRC})
377     set(SRC ${SRC} gui/${GUI_DIR}/${FILE})
378   endforeach()
379   if(ARCH STREQUAL ARM)
380     set(SRC
381       ${SRC}
382       gui/gui_common_arm.cpp
383       )
384   endif()
385 endif()
387 foreach(FILE ${TARGET_SRC})
388   set(SRC targets/${TARGET_DIR}/${FILE} ${SRC})
389 endforeach()
391 foreach(FILE ${FIRMWARE_TARGET_SRC})
392   set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/${TARGET_DIR}/${FILE})
393 endforeach()
395 foreach(FILE ${PULSES_SRC})
396   set(SRC ${SRC} pulses/${FILE})
397 endforeach()
399 add_definitions(-DCORRECT_NEGATIVE_SHIFTS)
401 if(NOT MSVC)
402   set(WARNING_FLAGS "${WARNING_FLAGS} -Wall -Wno-strict-aliasing -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits")
403   if(WARNINGS_AS_ERRORS)
404     set(WARNING_FLAGS "${WARNING_FLAGS} -Werror")
405   endif(WARNINGS_AS_ERRORS)
406 else()
407   add_definitions(-DHAVE_STRUCT_TIMESPEC)  # this is for pthread.h
408   if(WARNINGS_AS_ERRORS)
409     set(WARNING_FLAGS "${WARNING_FLAGS} /WX")
410   endif(WARNINGS_AS_ERRORS)
411 endif()
413 add_subdirectory(targets/simu)
414 if(NOT MSVC)
415   add_subdirectory(tests)
416 endif()
418 set(SRC ${SRC} ${FIRMWARE_SRC})
421 ##### firmware target #####
423 option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON)
424 if(NOT FIRMWARE_TARGET)
425   message(STATUS "firmware target disabled")
426   return()
427 endif()
429 set(CMAKE_EXECUTABLE_SUFFIX ".elf")
430 # trick to remove the -rdynamic and --out-implib issues
431 set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
432 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
433 # similar for -mmacosx-version-min="
434 set(CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG "")
435 set(CMAKE_CXX_OSX_DEPLOYMENT_TARGET_FLAG "")
436 # reset some CMake default flags which assume optimization levels/etc
437 set(CMAKE_C_FLAGS "${FIRMWARE_C_FLAGS}")
438 set(CMAKE_C_FLAGS_DEBUG "${FIRMWARE_C_FLAGS_DEBUG}")
439 set(CMAKE_C_FLAGS_RELEASE "")
440 set(CMAKE_C_FLAGS_MINSIZEREL "")
441 set(CMAKE_C_FLAGS_RELWITHDEBINFO "")
442 set(CMAKE_CXX_FLAGS "${FIRMWARE_CXX_FLAGS}")
443 set(CMAKE_CXX_FLAGS_DEBUG "${FIRMWARE_CXX_FLAGS_DEBUG}")
444 set(CMAKE_CXX_FLAGS_RELEASE "")
445 set(CMAKE_CXX_FLAGS_MINSIZEREL "")
446 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "")
447 # customize linker command
448 set(CMAKE_EXE_LINKER_FLAGS "")
449 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
450 set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
452 use_cxx11()  # ensure gnu++11 in CXX_FLAGS with CMake < 3.1
454 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).")
456 if(NOT MSVC)
457   set(OPT s)
459   if(ARCH STREQUAL ARM)
461     enable_language(ASM)
462     set(CMAKE_C_COMPILER arm-none-eabi-gcc)
463     set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
464     set(CMAKE_ASM_COMPILER arm-none-eabi-as)
466     set(CMAKE_SYSTEM_NAME Generic)
467     set(CMAKE_SYSTEM_VERSION 1)
468     set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> -o <OBJECT> <SOURCE>")
470     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}")
471     set(COMMON_FLAGS "${COMMON_FLAGS} ${FPU_FLAGS}")
473     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS} -Wimplicit")
474     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
476     # these are in addition to CMAKE_CXX_FLAGS
477     set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
478     if(SEMIHOSTING)
479       add_definitions(-DSEMIHOSTING)
480       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
481     endif()
482     # Use newlib nano, which saves a few kilobytes.
483     if(NOT NANO STREQUAL NO)
484       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
485       if(NOT LUA STREQUAL NO)
486         # Lua needs %g and %f
487         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float -u _scanf_float")
488       endif()
489       # Nano's malloc does work well with lua, use our own
490       add_definitions(-DUSE_BIN_ALLOCATOR)
491       set(SRC ${SRC} bin_allocator.cpp)
492     endif()
495     if(PCB STREQUAL XLITE OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X10 OR PCB STREQUAL X12S)
496       add_subdirectory(targets/common/arm/stm32/bootloader)
497       include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader)
498       set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader)
499     elseif(OPENRC_BOOTLOADER)
500       # We fetch Mike's bootloader as it is not included inside OpenTX
501       message(STATUS "Downloading Mike's bootloader: https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER}")
502       file(DOWNLOAD https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER} ${CMAKE_CURRENT_BINARY_DIR}/bootloader.lbm STATUS status)
503       list(GET status 0 error_code)
504       if(error_code)
505         list(GET status 1 error_message)
506         message(FATAL_ERROR "Download failed: ${error_message}")
507       endif()
508     endif()
510     add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
511     link_libraries(firmware -lstdc++)
512     add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
514     add_custom_command(
515       TARGET firmware POST_BUILD
516       COMMAND arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
517       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
518     )
520     find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.")  # OS X might only have "awk"
521     if (BASH AND GAWK)
522       add_custom_target(firmware-size
523         COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf'
524         DEPENDS firmware
525         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
526         )
527     else()
528       add_custom_target(firmware-size
529         COMMAND arm-none-eabi-size -A firmware.elf
530         DEPENDS firmware
531         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
532         )
533     endif()
535   else()  # AVR
537     set(CMAKE_C_COMPILER avr-gcc)
538     set(CMAKE_CXX_COMPILER avr-gcc)
540     set(COMMON_FLAGS "-mmcu=${MCU} -DF_CPU=16000000UL -O${OPT} -gdwarf-2 -fno-exceptions -flto -fwhole-program -fno-inline-small-functions -mstrict-X ${WARNING_FLAGS}")
541     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
542     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
543     set(CMAKE_EXE_LINKER_FLAGS "-Wno-uninitialized")  # bogus "uninitialized" warnings from ld
545     include_directories(storage gui/${GUI_DIR})
547     set(ALLSRC ${PROJECT_BINARY_DIR}/allsrc.cpp)
548     if (BASH AND NOT WIN32)
549       add_custom_command(
550         OUTPUT ${ALLSRC}
551         COMMAND ${BASH} -kc 'rm -f ${ALLSRC}\; for f in ${SRC}\; do echo "\\# 1 \\\"$$f\\\"" >> ${ALLSRC}\; cat "$$f" >> ${ALLSRC}\; done'
552         WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
553         DEPENDS ${SRC}
554         )
555     elseif(WIN32)
556       string(REPLACE "/" "\\" SRC_WIN "${SRC}")
557       string(REPLACE "/" "\\" ALLSRC_WIN "${ALLSRC}")
558       set(ALLSRC_BAT
559           "setlocal EnableDelayedExpansion"
560           "del \"${ALLSRC_WIN}\""
561           "for %%f in (${SRC_WIN}) do ("
562             "set p=\"%%f\""
563             "set p=!p:^\\=/! \necho \# 1 !p! >> \"${ALLSRC_WIN}\""
564             "type %%f >> \"${ALLSRC_WIN}\""
565           ")\n"
566         )
567       string(REPLACE ";" "\n" ALLSRC_BAT "${ALLSRC_BAT}")
568       file(WRITE "${ALLSRC}.bat" "${ALLSRC_BAT}")
569       add_custom_command(
570         OUTPUT ${ALLSRC}
571         COMMAND "${ALLSRC}.bat"
572         WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
573         DEPENDS ${SRC}
574         )
575     else()
576       set(ALLSRC ${SRC})
577     endif()
578     add_executable(firmware ${ALLSRC})
580     add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
582     add_custom_command(
583       TARGET firmware POST_BUILD
584       COMMAND avr-objcopy -O ihex -R .eeprom firmware.elf firmware.hex
585       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
586       )
588     add_custom_target(firmware.lss
589       COMMAND avr-objdump -h -S firmware.elf > firmware.lss
590       DEPENDS firmware
591       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
592       )
594     add_custom_target(firmware-size
595       COMMAND avr-size --format=avr --mcu=${MCU} firmware.elf
596       DEPENDS firmware
597       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
598       )
600   endif()  # ARM or AVR
602   if(CPU_FAMILY STREQUAL STM32)
603     add_custom_target(flash
604       COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin
605       DEPENDS firmware
606       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
607     )
609     add_custom_target(jtag-flash
610       COMMAND st-flash --reset write firmware.bin 0x8000000
611       DEPENDS firmware
612       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
613       )
614   else()
615     add_custom_target(flash
616       COMMAND avrdude -c usbasp -p ${AVRDUDE_MCU} -U flash:w:firmware.hex:i
617       DEPENDS firmware
618       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
619       )
620   endif()
622   PrintTargetReport("firmware")
624 endif(NOT MSVC)