1 include(CMakeForceCompiler)
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)
36 option(SIMU_AUDIO "Enable simulator audio." ON)
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)
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 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)
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)
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 FLAMENCO)
170 set(SRC ${SRC} storage/eeprom_conversions.cpp)
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)
183 add_definitions(-DRAMBACKUP)
184 set(SRC ${SRC} storage/rambackup.cpp storage/rlc.cpp)
188 add_definitions(-DTEMPLATES)
189 set(SRC ${SRC} templates.cpp)
190 set(GUI_SRC ${GUI_SRC} model_templates.cpp)
193 if(NOT LUA STREQUAL NO)
194 add_definitions(-DLUA)
196 add_definitions(-DLUA_COMPILER)
198 if(LUA_ALLOCATOR_TRACER AND DEBUG)
199 add_definitions(-DLUA_ALLOCATOR_TRACER)
201 if(NOT "${LUA_SCRIPT_LOAD_MODE}" STREQUAL "")
202 add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
204 include_directories(${LUA_DIR})
205 set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${LUA_EXPORT})
207 add_definitions(-DLUA_MODEL_SCRIPTS)
208 set(GUI_SRC ${GUI_SRC} model_custom_scripts.cpp)
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)
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
218 foreach(FILE ${LUA_SRC})
219 set(SRC ${SRC} ${LUA_DIR}/${FILE})
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")
228 add_definitions(-DHELI)
232 add_definitions(-DFLIGHT_MODES)
233 set(GUI_SRC ${GUI_SRC} model_flightmodes.cpp)
237 add_definitions(-DCURVES)
238 set(SRC ${SRC} curves.cpp)
242 add_definitions(-DGVARS)
243 set(SRC ${SRC} gvars.cpp)
244 math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT})
248 add_definitions(-DFAI)
249 elseif(FAI STREQUAL CHOICE)
250 add_definitions(-DFAI_CHOICE)
254 add_definitions(-DFAS_PROTOTYPE)
258 add_definitions(-DAUTOSOURCE)
262 add_definitions(-DAUTOSWITCH)
266 add_definitions(-DJITTER_MEASURE)
269 if(WATCHDOG_DISABLED)
270 add_definitions(-DWATCHDOG_DISABLED)
274 add_definitions(-DSIMU_AUDIO)
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})
284 if(SHUTDOWN_CONFIRMATION)
285 add_definitions(-DSHUTDOWN_CONFIRMATION)
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)
293 add_definitions(-DPPM_UNIT_PERCENT_PREC0)
296 if(PPM_CENTER_ADJUSTABLE)
297 add_definitions(-DPPM_CENTER_ADJUSTABLE)
300 if(PPM_LIMITS_SYMETRICAL)
301 add_definitions(-DPPM_LIMITS_SYMETRICAL)
304 if(OVERRIDE_CHANNEL_FUNCTION)
305 add_definitions(-DOVERRIDE_CHANNEL_FUNCTION)
308 if(DANGEROUS_MODULE_FUNCTIONS)
309 add_definitions(-DDANGEROUS_MODULE_FUNCTIONS)
312 if(SPLASH STREQUAL FRSKY)
313 add_definitions(-DSPLASH -DSPLASH_FRSKY)
314 elseif(NOT SPLASH STREQUAL OFF)
315 add_definitions(-DSPLASH)
318 if(NOT DEFAULT_MODE STREQUAL "")
319 add_definitions(-DDEFAULT_MODE=${DEFAULT_MODE})
322 if(TRACE_SIMPGMSPACE)
323 add_definitions(-DTRACE_SIMPGMSPACE)
326 if(TRACE_LUA_INTERNALS)
327 add_definitions(-DTRACE_LUA_INTERNALS_ENABLED)
331 add_definitions(-DBINDING_OPTIONS)
335 add_definitions(-DFRSKY_STICKS)
338 if(NOT FONT STREQUAL "")
339 add_definitions(-DFONT=${DEFAULT_MODE})
342 if(EEPROM_VARIANT_NEEDED)
343 add_definitions(-DEEPROM_VARIANT=${EEPROM_VARIANT})
346 if(NIGHTLY_BUILD_WARNING)
347 add_definitions(-DNIGHTLY_BUILD_WARNING)
348 endif(NIGHTLY_BUILD_WARNING)
351 add_definitions(-DUSEHORUSBT)
367 add_definitions(-DGUI)
375 foreach(FILE ${GUI_SRC})
376 set(SRC ${SRC} gui/${GUI_DIR}/${FILE})
378 if(ARCH STREQUAL ARM)
381 gui/gui_common_arm.cpp
386 foreach(FILE ${TARGET_SRC})
387 set(SRC targets/${TARGET_DIR}/${FILE} ${SRC})
390 foreach(FILE ${FIRMWARE_TARGET_SRC})
391 set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/${TARGET_DIR}/${FILE})
394 foreach(FILE ${PULSES_SRC})
395 set(SRC ${SRC} pulses/${FILE})
398 add_definitions(-DCORRECT_NEGATIVE_SHIFTS)
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)
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)
412 add_subdirectory(targets/simu)
414 add_subdirectory(tests)
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")
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).")
458 if(ARCH STREQUAL ARM)
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")
478 add_definitions(-DSEMIHOSTING)
479 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs")
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")
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)
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)
504 list(GET status 1 error_message)
505 message(FATAL_ERROR "Download failed: ${error_message}")
509 add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
510 link_libraries(firmware -lstdc++)
511 add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
514 TARGET firmware POST_BUILD
515 COMMAND arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
516 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
519 find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.") # OS X might only have "awk"
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'
524 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
527 add_custom_target(firmware-size
528 COMMAND arm-none-eabi-size -A firmware.elf
530 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
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)
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}
555 string(REPLACE "/" "\\" SRC_WIN "${SRC}")
556 string(REPLACE "/" "\\" ALLSRC_WIN "${ALLSRC}")
558 "setlocal EnableDelayedExpansion"
559 "del \"${ALLSRC_WIN}\""
560 "for %%f in (${SRC_WIN}) do ("
562 "set p=!p:^\\=/! \necho \# 1 !p! >> \"${ALLSRC_WIN}\""
563 "type %%f >> \"${ALLSRC_WIN}\""
566 string(REPLACE ";" "\n" ALLSRC_BAT "${ALLSRC_BAT}")
567 file(WRITE "${ALLSRC}.bat" "${ALLSRC_BAT}")
570 COMMAND "${ALLSRC}.bat"
571 WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
577 add_executable(firmware ${ALLSRC})
579 add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
582 TARGET firmware POST_BUILD
583 COMMAND avr-objcopy -O ihex -R .eeprom firmware.elf firmware.hex
584 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
587 add_custom_target(firmware.lss
588 COMMAND avr-objdump -h -S firmware.elf > firmware.lss
590 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
593 add_custom_target(firmware-size
594 COMMAND avr-size --format=avr --mcu=${MCU} firmware.elf
596 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
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
605 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
608 add_custom_target(jtag-flash
609 COMMAND st-flash --reset write firmware.bin 0x8000000
611 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
614 add_custom_target(flash
615 COMMAND avrdude -c usbasp -p ${AVRDUDE_MCU} -U flash:w:firmware.hex:i
617 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
621 PrintTargetReport("firmware")