Lua memory (de)allocation tracer: (#5191)
[opentx.git] / radio / src / CMakeLists.txt
blob35b29c0a75d3f4b60e650e995d7ad4dad65341bc
1 include(CMakeForceCompiler)
2 include(Bitmaps)
4 set(PCB_TYPES X7 X7S 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)
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" OFF)
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(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)
39 option(SIMU_LUA_COMPILER "Pre-compile and save Lua scripts in simulator." ON)
40 option(FAS_PROTOTYPE "Support of old FAS prototypes (different resistors)" OFF)
41 option(TEMPLATES "Model templates menu" OFF)
42 option(TRACE_SIMPGMSPACE "Turn on traces in simpgmspace.cpp" ON)
43 option(TRACE_LUA_INTERNALS "Turn on traces for Lua internals" OFF)
44 option(BINDING_OPTIONS "Allow advanced frsky bindings" OFF)
45 option(FRSKY_STICKS "Reverse sticks for FrSky sticks" OFF)
46 option(NANO "Use nano newlib and binalloc")
47 option(NIGHTLY_BUILD_WARNING "Warn this is a nightly build" OFF)
48 option(USEHORUSBT "X9E BT module replaced by Horus BT module" 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 X7S)
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)
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 FLAMENCO)
170   set(SRC ${SRC} storage/eeprom_conversions.cpp)
171 endif()
173 add_definitions(-DFLAVOUR="${FLAVOUR}")
175 include_directories(${CMAKE_CURRENT_SOURCE_DIR})
176 include_directories(${CMAKE_CURRENT_BINARY_DIR})
177 include_directories(${CMAKE_CURRENT_BINARY_DIR}/bitmaps/${GUI_DIR})
179 add_subdirectory(lua)
180 include(gui/CMakeLists.txt)
182 if(RAMBACKUP)
183   add_definitions(-DRAMBACKUP)
184   set(SRC ${SRC} storage/rambackup.cpp storage/rlc.cpp)
185 endif()
187 if(TEMPLATES)
188   add_definitions(-DTEMPLATES)
189   set(SRC ${SRC} templates.cpp)
190   set(GUI_SRC ${GUI_SRC} model_templates.cpp)
191 endif()
193 if(NOT LUA STREQUAL NO)
194   add_definitions(-DLUA)
195   if(LUA_COMPILER)
196     add_definitions(-DLUA_COMPILER)
197   endif()
198   if(LUA_ALLOCATOR_TRACER AND DEBUG)
199     add_definitions(-DLUA_ALLOCATOR_TRACER)
200   endif()
201   if(NOT "${LUA_SCRIPT_LOAD_MODE}" STREQUAL "")
202     add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
203   endif()
204   include_directories(${LUA_DIR})
205   set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${LUA_EXPORT})
206   if(LUA STREQUAL YES)
207     add_definitions(-DLUA_MODEL_SCRIPTS)
208     set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
209   endif()
210   set(SRC ${SRC} lua/interface.cpp lua/api_general.cpp lua/api_lcd.cpp lua/api_model.cpp)
211   if(PCB STREQUAL X12S OR PCB STREQUAL X10)
212     set(SRC ${SRC} lua/widgets.cpp)
213   endif()
214   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
215     lstate.c lstring.c ltable.c lrotable.c ltm.c lundump.c lvm.c lzio.c linit.c
216     lbaselib.c lmathlib.c lbitlib.c loadlib.c lauxlib.c ltablib.c lcorolib.c liolib.c lstrlib.c
217     )
218   foreach(FILE ${LUA_SRC})
219     set(SRC ${SRC} ${LUA_DIR}/${FILE})
220   endforeach()
221   if(MSVC)
222     # silence lots of warnings regarding "insecure" use of functions (sprintf, strcpy, etc) from Lua code
223     set(WARNING_FLAGS "${WARNING_FLAGS} /D_CRT_SECURE_NO_WARNINGS")
224   endif()
225 endif()
227 if(HELI)
228   add_definitions(-DHELI)
229 endif()
231 if(FLIGHT_MODES)
232   add_definitions(-DFLIGHT_MODES)
233   set(GUI_SRC ${GUI_SRC} model_flightmodes.cpp)
234 endif()
236 if(CURVES)
237   add_definitions(-DCURVES)
238   set(SRC ${SRC} curves.cpp)
239 endif()
241 if(GVARS)
242   add_definitions(-DGVARS)
243   set(SRC ${SRC} gvars.cpp)
244   math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT})
245 endif()
247 if(FAI STREQUAL YES)
248   add_definitions(-DFAI)
249 elseif(FAI STREQUAL CHOICE)
250   add_definitions(-DFAI_CHOICE)
251 endif()
253 if(FAS_PROTOTYPE)
254   add_definitions(-DFAS_PROTOTYPE)
255 endif()
257 if(AUTOSOURCE)
258   add_definitions(-DAUTOSOURCE)
259 endif()
261 if(AUTOSWITCH)
262   add_definitions(-DAUTOSWITCH)
263 endif()
265 if(JITTER_MEASURE)
266   add_definitions(-DJITTER_MEASURE)
267 endif()
269 if(WATCHDOG_DISABLED)
270   add_definitions(-DWATCHDOG_DISABLED)
271 endif()
273 if(SIMU_AUDIO)
274   add_definitions(-DSIMU_AUDIO)
275 endif()
277 if(SDCARD)
278   add_definitions(-DSDCARD)
279   include_directories(${FATFS_DIR} ${FATFS_DIR}/option)
280   set(SRC ${SRC} sdcard.cpp rtc.cpp logs.cpp)
281   set(FIRMWARE_SRC ${FIRMWARE_SRC} ${FATFS_SRC})
282 endif()
284 if(SHUTDOWN_CONFIRMATION)
285   add_definitions(-DSHUTDOWN_CONFIRMATION)
286 endif()
288 if(PPM_UNIT STREQUAL US)
289   add_definitions(-DPPM_UNIT_US)
290 elseif(PPM_UNIT STREQUAL PERCENT_PREC1)
291   add_definitions(-DPPM_UNIT_PERCENT_PREC1)
292 else()
293   add_definitions(-DPPM_UNIT_PERCENT_PREC0)
294 endif()
296 if(PPM_CENTER_ADJUSTABLE)
297   add_definitions(-DPPM_CENTER_ADJUSTABLE)
298 endif()
300 if(PPM_LIMITS_SYMETRICAL)
301   add_definitions(-DPPM_LIMITS_SYMETRICAL)
302 endif()
304 if(OVERRIDE_CHANNEL_FUNCTION)
305   add_definitions(-DOVERRIDE_CHANNEL_FUNCTION)
306 endif()
308 if(DANGEROUS_MODULE_FUNCTIONS)
309   add_definitions(-DDANGEROUS_MODULE_FUNCTIONS)
310 endif()
312 if(SPLASH STREQUAL FRSKY)
313   add_definitions(-DSPLASH -DSPLASH_FRSKY)
314 elseif(NOT SPLASH STREQUAL OFF)
315   add_definitions(-DSPLASH)
316 endif()
318 if(NOT DEFAULT_MODE STREQUAL "")
319   add_definitions(-DDEFAULT_MODE=${DEFAULT_MODE})
320 endif()
322 if(TRACE_SIMPGMSPACE)
323   add_definitions(-DTRACE_SIMPGMSPACE)
324 endif()
326 if(TRACE_LUA_INTERNALS)
327   add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
328 endif()
330 if(BINDING_OPTIONS)
331   add_definitions(-DBINDING_OPTIONS)
332 endif()
334 if(FRSKY_STICKS)
335   add_definitions(-DFRSKY_STICKS)
336 endif()
338 if(NOT FONT STREQUAL "")
339   add_definitions(-DFONT=${DEFAULT_MODE})
340 endif()
342 if(EEPROM_VARIANT_NEEDED)
343   add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT})
344 endif()
346 if(NIGHTLY_BUILD_WARNING)
347   add_definitions(-DNIGHTLY_BUILD_WARNING)
348 endif(NIGHTLY_BUILD_WARNING)
350 if(USEHORUSBT)
351   add_definitions(-DUSEHORUSBT)
352 endif(USEHORUSBT)
354 set(SRC
355   ${SRC}
356   opentx.cpp
357   functions.cpp
358   strhelpers.cpp
359   switches.cpp
360   mixer.cpp
361   stamp.cpp
362   timers.cpp
363   trainer_input.cpp
364   )
366 if(GUI)
367   add_definitions(-DGUI)
368   set(SRC
369     ${SRC}
370     keys.cpp
371     maths.cpp
372     translations.cpp
373     gui/gui_common.cpp
374     )
375   foreach(FILE ${GUI_SRC})
376     set(SRC ${SRC} gui/${GUI_DIR}/${FILE})
377   endforeach()
378   if(ARCH STREQUAL ARM)
379     set(SRC
380       ${SRC}
381       gui/gui_common_arm.cpp
382       )
383   endif()
384 endif()
386 foreach(FILE ${TARGET_SRC})
387   set(SRC targets/${TARGET_DIR}/${FILE} ${SRC})
388 endforeach()
390 foreach(FILE ${FIRMWARE_TARGET_SRC})
391   set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/${TARGET_DIR}/${FILE})
392 endforeach()
394 foreach(FILE ${PULSES_SRC})
395   set(SRC ${SRC} pulses/${FILE})
396 endforeach()
398 add_definitions(-DCORRECT_NEGATIVE_SHIFTS)
400 if(NOT MSVC)
401   set(WARNING_FLAGS "${WARNING_FLAGS} -Wall -Wno-strict-aliasing -Wformat -Wreturn-type -Wunused -Wuninitialized -Wunknown-pragmas -Wno-switch -Wtype-limits")
402   if(WARNINGS_AS_ERRORS)
403     set(WARNING_FLAGS "${WARNING_FLAGS} -Werror")
404   endif(WARNINGS_AS_ERRORS)
405 else()
406   add_definitions(-DHAVE_STRUCT_TIMESPEC)  # this is for pthread.h
407   if(WARNINGS_AS_ERRORS)
408     set(WARNING_FLAGS "${WARNING_FLAGS} /WX")
409   endif(WARNINGS_AS_ERRORS)
410 endif()
412 add_subdirectory(targets/simu)
413 if(NOT MSVC)
414   add_subdirectory(tests)
415 endif()
417 set(SRC ${SRC} ${FIRMWARE_SRC})
420 ##### firmware target #####
422 option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON)
423 if(NOT FIRMWARE_TARGET)
424   message(STATUS "firmware target disabled")
425   return()
426 endif()
428 set(CMAKE_EXECUTABLE_SUFFIX ".elf")
429 # trick to remove the -rdynamic and --out-implib issues
430 set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
431 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
432 # similar for -mmacosx-version-min="
433 set(CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG "")
434 set(CMAKE_CXX_OSX_DEPLOYMENT_TARGET_FLAG "")
435 # reset some CMake default flags which assume optimization levels/etc
436 set(CMAKE_C_FLAGS "${FIRMWARE_C_FLAGS}")
437 set(CMAKE_C_FLAGS_DEBUG "${FIRMWARE_C_FLAGS_DEBUG}")
438 set(CMAKE_C_FLAGS_RELEASE "")
439 set(CMAKE_C_FLAGS_MINSIZEREL "")
440 set(CMAKE_C_FLAGS_RELWITHDEBINFO "")
441 set(CMAKE_CXX_FLAGS "${FIRMWARE_CXX_FLAGS}")
442 set(CMAKE_CXX_FLAGS_DEBUG "${FIRMWARE_CXX_FLAGS_DEBUG}")
443 set(CMAKE_CXX_FLAGS_RELEASE "")
444 set(CMAKE_CXX_FLAGS_MINSIZEREL "")
445 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "")
446 # customize linker command
447 set(CMAKE_EXE_LINKER_FLAGS "")
448 set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
449 set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET>")
451 use_cxx11()  # ensure gnu++11 in CXX_FLAGS with CMake < 3.1
453 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).")
455 if(NOT MSVC)
456   set(OPT s)
458   if(ARCH STREQUAL ARM)
460     enable_language(ASM)
461     set(CMAKE_C_COMPILER arm-none-eabi-gcc)
462     set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
463     set(CMAKE_ASM_COMPILER arm-none-eabi-as)
465     set(CMAKE_SYSTEM_NAME Generic)
466     set(CMAKE_SYSTEM_VERSION 1)
467     set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> -o <OBJECT> <SOURCE>")
469     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}")
470     set(COMMON_FLAGS "${COMMON_FLAGS} ${FPU_FLAGS}")
472     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS} -Wimplicit")
473     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
475     # these are in addition to CMAKE_CXX_FLAGS
476     set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
477     if(SEMIHOSTING)
478       add_definitions(-DSEMIHOSTING)
479       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
480     endif()
481     # Use newlib nano, which saves a few kilobytes.
482     if(NOT NANO STREQUAL NO)
483       set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
484       if(NOT LUA STREQUAL NO)
485         # Lua needs %g and %f
486         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float -u _scanf_float")
487       endif()
488       # Nano's malloc does work well with lua, use our own
489       add_definitions(-DUSE_BIN_ALLOCATOR)
490       set(SRC ${SRC} bin_allocator.cpp)
491     endif()
494     if(PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X7 OR PCB STREQUAL X7S)
495       add_subdirectory(targets/${TARGET_DIR}/bootloader)
496       include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/${TARGET_DIR}/bootloader)
497       set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader)
498     elseif(OPENRC_BOOTLOADER)
499       # We fetch Mike's bootloader as it is not included inside OpenTX
500       message(STATUS "Downloading Mike's bootloader: https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER}")
501       file(DOWNLOAD https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER} ${CMAKE_CURRENT_BINARY_DIR}/bootloader.lbm STATUS status)
502       list(GET status 0 error_code)
503       if(error_code)
504         list(GET status 1 error_message)
505         message(FATAL_ERROR "Download failed: ${error_message}")
506       endif()
507     endif()
509     add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
510     link_libraries(firmware -lstdc++)
511     add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
513     add_custom_command(
514       TARGET firmware POST_BUILD
515       COMMAND arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
516       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
517     )
519     find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.")  # OS X might only have "awk"
520     if (BASH AND GAWK)
521       add_custom_target(firmware-size
522         COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf'
523         DEPENDS firmware
524         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
525         )
526     else()
527       add_custom_target(firmware-size
528         COMMAND arm-none-eabi-size -A firmware.elf
529         DEPENDS firmware
530         WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
531         )
532     endif()
534   else()  # AVR
536     set(CMAKE_C_COMPILER avr-gcc)
537     set(CMAKE_CXX_COMPILER avr-gcc)
539     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}")
540     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
541     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
542     set(CMAKE_EXE_LINKER_FLAGS "-Wno-uninitialized")  # bogus "uninitialized" warnings from ld
544     include_directories(storage gui/${GUI_DIR})
546     set(ALLSRC ${PROJECT_BINARY_DIR}/allsrc.cpp)
547     if (BASH AND NOT WIN32)
548       add_custom_command(
549         OUTPUT ${ALLSRC}
550         COMMAND ${BASH} -kc 'rm -f ${ALLSRC}\; for f in ${SRC}\; do echo "\\# 1 \\\"$$f\\\"" >> ${ALLSRC}\; cat "$$f" >> ${ALLSRC}\; done'
551         WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
552         DEPENDS ${SRC}
553         )
554     elseif(WIN32)
555       string(REPLACE "/" "\\" SRC_WIN "${SRC}")
556       string(REPLACE "/" "\\" ALLSRC_WIN "${ALLSRC}")
557       set(ALLSRC_BAT
558           "setlocal EnableDelayedExpansion"
559           "del \"${ALLSRC_WIN}\""
560           "for %%f in (${SRC_WIN}) do ("
561             "set p=\"%%f\""
562             "set p=!p:^\\=/! \necho \# 1 !p! >> \"${ALLSRC_WIN}\""
563             "type %%f >> \"${ALLSRC_WIN}\""
564           ")\n"
565         )
566       string(REPLACE ";" "\n" ALLSRC_BAT "${ALLSRC_BAT}")
567       file(WRITE "${ALLSRC}.bat" "${ALLSRC_BAT}")
568       add_custom_command(
569         OUTPUT ${ALLSRC}
570         COMMAND "${ALLSRC}.bat"
571         WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
572         DEPENDS ${SRC}
573         )
574     else()
575       set(ALLSRC ${SRC})
576     endif()
577     add_executable(firmware ${ALLSRC})
579     add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
581     add_custom_command(
582       TARGET firmware POST_BUILD
583       COMMAND avr-objcopy -O ihex -R .eeprom firmware.elf firmware.hex
584       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
585       )
587     add_custom_target(firmware.lss
588       COMMAND avr-objdump -h -S firmware.elf > firmware.lss
589       DEPENDS firmware
590       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
591       )
593     add_custom_target(firmware-size
594       COMMAND avr-size --format=avr --mcu=${MCU} firmware.elf
595       DEPENDS firmware
596       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
597       )
599   endif()  # ARM or AVR
601   if(CPU_FAMILY STREQUAL STM32)
602     add_custom_target(flash
603       COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin
604       DEPENDS firmware
605       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
606     )
608     add_custom_target(jtag-flash
609       COMMAND st-flash --reset write firmware.bin 0x8000000
610       DEPENDS firmware
611       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
612       )
613   else()
614     add_custom_target(flash
615       COMMAND avrdude -c usbasp -p ${AVRDUDE_MCU} -U flash:w:firmware.hex:i
616       DEPENDS firmware
617       WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
618       )
619   endif()
621   PrintTargetReport("firmware")
623 endif(NOT MSVC)