1 include(CMakeForceCompiler)
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)
36 option(SIMU_AUDIO "Enable simulator audio." ON)
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)
72 set(MAVLINK_VARIANT 8)
73 set(M2561_VARIANT 16384)
74 set(M128_VARIANT 32768)
76 set(FIRMWARE_DEPENDENCIES firmware_translations)
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)
95 string(TOLOWER ${PCB} FLAVOUR)
96 set(EEPROM EEPROM_RLC)
98 add_definitions(-DEEPROM_VARIANT=${M2561_VARIANT})
101 set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps)
102 add_definitions(-DPCBSTD -DPCB${PCB} -DCPUM2561)
103 set(TARGET_SRC ${TARGET_SRC} board.cpp)
106 model_inputs_mixes.cpp
110 add_definitions(-DSP22)
113 add_definitions(-DPWM_BACKLIGHT)
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)
121 message(FATAL_ERROR "Unknown PCB '${PCB}'")
124 if(NOT PCB STREQUAL 9XR AND NOT PCB STREQUAL 9XRPRO)
125 option(DBLKEYS "Double Keys" ON)
127 add_definitions(-DDBLKEYS)
131 if(CPU_TYPE STREQUAL STM32F4)
132 include(targets/common/arm/stm32/f4/CMakeLists.txt)
135 if(CPU_TYPE STREQUAL STM32F2)
136 include(targets/common/arm/stm32/f2/CMakeLists.txt)
139 if(CPU_FAMILY STREQUAL STM32)
140 include(targets/common/arm/stm32/CMakeLists.txt)
143 if(ARCH STREQUAL ARM)
144 include(targets/common/arm/CMakeLists.txt)
146 include(targets/common/avr/CMakeLists.txt)
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}")
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)
165 set(SRC ${SRC} storage/storage_common.cpp storage/eeprom_common.cpp storage/eeprom_raw.cpp)
166 add_definitions(-DEEPROM -DEEPROM_RAW)
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)
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)
184 add_definitions(-DRAMBACKUP)
185 set(SRC ${SRC} storage/rambackup.cpp storage/rlc.cpp)
189 add_definitions(-DTEMPLATES)
190 set(SRC ${SRC} templates.cpp)
191 set(GUI_SRC ${GUI_SRC} model_templates.cpp)
194 if(NOT LUA STREQUAL NO)
195 add_definitions(-DLUA)
197 add_definitions(-DLUA_COMPILER)
199 if(LUA_ALLOCATOR_TRACER AND DEBUG)
200 add_definitions(-DLUA_ALLOCATOR_TRACER)
202 if(NOT "${LUA_SCRIPT_LOAD_MODE}" STREQUAL "")
203 add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
205 include_directories(${LUA_DIR})
206 set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${LUA_EXPORT})
208 add_definitions(-DLUA_MODEL_SCRIPTS)
209 set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
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)
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
219 foreach(FILE ${LUA_SRC})
220 set(SRC ${SRC} ${LUA_DIR}/${FILE})
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")
229 add_definitions(-DHELI)
233 add_definitions(-DFLIGHT_MODES)
234 set(GUI_SRC ${GUI_SRC} model_flightmodes.cpp)
238 add_definitions(-DCURVES)
239 set(SRC ${SRC} curves.cpp)
243 add_definitions(-DGVARS)
244 set(SRC ${SRC} gvars.cpp)
245 math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT})
249 add_definitions(-DFAI)
250 elseif(FAI STREQUAL CHOICE)
251 add_definitions(-DFAI_CHOICE)
255 add_definitions(-DNO_RAS)
259 add_definitions(-DFAS_PROTOTYPE)
263 add_definitions(-DAUTOSOURCE)
267 add_definitions(-DAUTOSWITCH)
271 add_definitions(-DJITTER_MEASURE)
274 if(WATCHDOG_DISABLED)
275 add_definitions(-DWATCHDOG_DISABLED)
279 add_definitions(-DSIMU_AUDIO)
283 add_definitions(-DSIMU_DISKIO)
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})
293 if(SHUTDOWN_CONFIRMATION)
294 add_definitions(-DSHUTDOWN_CONFIRMATION)
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)
302 add_definitions(-DPPM_UNIT_PERCENT_PREC0)
305 if(PPM_CENTER_ADJUSTABLE)
306 add_definitions(-DPPM_CENTER_ADJUSTABLE)
309 if(PPM_LIMITS_SYMETRICAL)
310 add_definitions(-DPPM_LIMITS_SYMETRICAL)
313 if(OVERRIDE_CHANNEL_FUNCTION)
314 add_definitions(-DOVERRIDE_CHANNEL_FUNCTION)
317 if(DANGEROUS_MODULE_FUNCTIONS)
318 add_definitions(-DDANGEROUS_MODULE_FUNCTIONS)
321 if(SPLASH STREQUAL FRSKY)
322 add_definitions(-DSPLASH -DSPLASH_FRSKY)
323 elseif(NOT SPLASH STREQUAL OFF)
324 add_definitions(-DSPLASH)
327 if(NOT DEFAULT_MODE STREQUAL "")
328 add_definitions(-DDEFAULT_MODE=${DEFAULT_MODE})
331 if(TRACE_SIMPGMSPACE)
332 add_definitions(-DTRACE_SIMPGMSPACE)
335 if(TRACE_LUA_INTERNALS)
336 add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
340 add_definitions(-DFRSKY_STICKS)
343 if(NOT FONT STREQUAL "")
344 add_definitions(-DFONT=${DEFAULT_MODE})
347 if(EEPROM_VARIANT_NEEDED)
348 add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT})
351 if(NIGHTLY_BUILD_WARNING)
352 add_definitions(-DNIGHTLY_BUILD_WARNING)
353 endif(NIGHTLY_BUILD_WARNING)
368 add_definitions(-DGUI)
376 foreach(FILE ${GUI_SRC})
377 set(SRC ${SRC} gui/${GUI_DIR}/${FILE})
379 if(ARCH STREQUAL ARM)
382 gui/gui_common_arm.cpp
387 foreach(FILE ${TARGET_SRC})
388 set(SRC targets/${TARGET_DIR}/${FILE} ${SRC})
391 foreach(FILE ${FIRMWARE_TARGET_SRC})
392 set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/${TARGET_DIR}/${FILE})
395 foreach(FILE ${PULSES_SRC})
396 set(SRC ${SRC} pulses/${FILE})
399 add_definitions(-DCORRECT_NEGATIVE_SHIFTS)
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)
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)
413 add_subdirectory(targets/simu)
415 add_subdirectory(tests)
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")
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).")
459 if(ARCH STREQUAL ARM)
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")
479 add_definitions(-DSEMIHOSTING)
480 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
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")
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)
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)
505 list(GET status 1 error_message)
506 message(FATAL_ERROR "Download failed: ${error_message}")
510 add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
511 link_libraries(firmware -lstdc++)
512 add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
515 TARGET firmware POST_BUILD
516 COMMAND arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
517 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
520 find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.") # OS X might only have "awk"
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'
525 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
528 add_custom_target(firmware-size
529 COMMAND arm-none-eabi-size -A firmware.elf
531 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
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)
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}
556 string(REPLACE "/" "\\" SRC_WIN "${SRC}")
557 string(REPLACE "/" "\\" ALLSRC_WIN "${ALLSRC}")
559 "setlocal EnableDelayedExpansion"
560 "del \"${ALLSRC_WIN}\""
561 "for %%f in (${SRC_WIN}) do ("
563 "set p=!p:^\\=/! \necho \# 1 !p! >> \"${ALLSRC_WIN}\""
564 "type %%f >> \"${ALLSRC_WIN}\""
567 string(REPLACE ";" "\n" ALLSRC_BAT "${ALLSRC_BAT}")
568 file(WRITE "${ALLSRC}.bat" "${ALLSRC_BAT}")
571 COMMAND "${ALLSRC}.bat"
572 WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
578 add_executable(firmware ${ALLSRC})
580 add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
583 TARGET firmware POST_BUILD
584 COMMAND avr-objcopy -O ihex -R .eeprom firmware.elf firmware.hex
585 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
588 add_custom_target(firmware.lss
589 COMMAND avr-objdump -h -S firmware.elf > firmware.lss
591 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
594 add_custom_target(firmware-size
595 COMMAND avr-size --format=avr --mcu=${MCU} firmware.elf
597 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
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
606 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
609 add_custom_target(jtag-flash
610 COMMAND st-flash --reset write firmware.bin 0x8000000
612 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
615 add_custom_target(flash
616 COMMAND avrdude -c usbasp -p ${AVRDUDE_MCU} -U flash:w:firmware.hex:i
618 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
622 PrintTargetReport("firmware")