From baa4f65d9be92bb443b1ddfbd60413564d7f251f Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Sat, 26 Mar 2022 12:08:45 +0100 Subject: [PATCH] Use ExternalPoject_Add() to split by toolchain --- CMakeLists.txt | 346 +++++------------- cmake/DownloadGTest.cmake | 25 ++ cmake/GenericDefinitions.cmake | 89 +++++ cmake/NativeTargets.cmake | 75 ++++ cmake/QtDefs.cmake | 65 ++++ cmake/toolchain/arm-none-eabi.cmake | 67 ++++ cmake/toolchain/native.cmake | 2 + companion/src/CMakeLists.txt | 8 +- radio/src/CMakeLists.txt | 247 ++++++------- .../arm/stm32/bootloader/CMakeLists.txt | 2 +- .../common/arm/stm32/f4/CMakeLists.txt | 34 +- radio/src/targets/horus/CMakeLists.txt | 50 +-- radio/src/tests/conversions.cpp | 2 +- tools/build-gh.sh | 7 +- 14 files changed, 551 insertions(+), 468 deletions(-) create mode 100644 cmake/DownloadGTest.cmake create mode 100644 cmake/GenericDefinitions.cmake create mode 100644 cmake/NativeTargets.cmake create mode 100644 cmake/QtDefs.cmake create mode 100644 cmake/toolchain/arm-none-eabi.cmake create mode 100644 cmake/toolchain/native.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3808964f1..6a5bc68f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,5 @@ + +cmake_minimum_required(VERSION 3.13) project(EdgeTX) set(VERSION_MAJOR "2") @@ -8,280 +10,96 @@ set(VERSION_SUFFIX $ENV{OPENTX_VERSION_SUFFIX}) set(VERSION_FAMILY ${VERSION_MAJOR}.${VERSION_MINOR}) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}${VERSION_SUFFIX}) -cmake_minimum_required(VERSION 3.13) +option(EdgeTX_SUPERBUILD "Cross-compile EdgeTX for each toolchain" ON) +include(ExternalProject) -# Automatically link Qt executables to qtmain target on Windows -# https://cmake.org/cmake/help/latest/policy/CMP0020.html -cmake_policy(SET CMP0020 NEW) +if(EdgeTX_SUPERBUILD) + # Fetch all command line args into CMAKE_ARGS + get_cmake_property(CACHE_VARS CACHE_VARIABLES) + foreach(CACHE_VAR ${CACHE_VARS}) + get_property(CACHE_VAR_HELPSTRING CACHE ${CACHE_VAR} PROPERTY HELPSTRING) + if(CACHE_VAR_HELPSTRING STREQUAL "No help, variable specified on the command line.") + get_property(CACHE_VAR_TYPE CACHE ${CACHE_VAR} PROPERTY TYPE) + if(CACHE_VAR_TYPE STREQUAL "UNINITIALIZED") + set(CACHE_VAR_TYPE) + else() + set(CACHE_VAR_TYPE :${CACHE_VAR_TYPE}) + endif() + list(APPEND CMAKE_ARGS "-D${CACHE_VAR}${CACHE_VAR_TYPE}=${${CACHE_VAR}}") + endif() + endforeach() + message("-- CMAKE_ARGS: ${CMAKE_ARGS}") -# Allow keyword and plain target_link_libraries() signatures to be mixed -# https://cmake.org/cmake/help/latest/policy/CMP0023.html -cmake_policy(SET CMP0023 OLD) + # Add explicit targets for triggering cmake in the external projects + set_property(DIRECTORY PROPERTY EP_STEP_TARGETS configure clean) + + # Native targets + ExternalProject_Add(native + SOURCE_DIR ${CMAKE_SOURCE_DIR} + BINARY_DIR ${CMAKE_BINARY_DIR}/native + CMAKE_ARGS ${CMAKE_ARGS} -Wno-dev + CMAKE_CACHE_ARGS + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_SOURCE_DIR}/cmake/toolchain/native.cmake + -DEdgeTX_SUPERBUILD:BOOL=0 + -DNATIVE_BUILD:BOOL=1 + INSTALL_COMMAND "" + EXCLUDE_FROM_ALL TRUE + ) -# Use @rpath in a target's install name on MacOS X for locating shared libraries -# https://cmake.org/cmake/help/latest/policy/CMP0042.html -if(POLICY CMP0042) - cmake_policy(SET CMP0042 NEW) + # ARM targets + ExternalProject_Add(arm-none-eabi + SOURCE_DIR ${CMAKE_SOURCE_DIR} + BINARY_DIR ${CMAKE_BINARY_DIR}/arm-none-eabi + CMAKE_ARGS ${CMAKE_ARGS} -Wno-dev + CMAKE_CACHE_ARGS + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_SOURCE_DIR}/cmake/toolchain/arm-none-eabi.cmake + -DEdgeTX_SUPERBUILD:BOOL=0 + -DNATIVE_BUILD:BOOL=0 + INSTALL_COMMAND "" + EXCLUDE_FROM_ALL TRUE + ) + + add_custom_target(configure + DEPENDS native-configure arm-none-eabi-configure) + + add_custom_target(libsimulator + COMMAND ${CMAKE_COMMAND} --build native --target libsimulator + DEPENDS configure + ) + + add_custom_target(gtests-radio + COMMAND ${CMAKE_COMMAND} --build native --target gtests-radio + DEPENDS configure + ) + + add_custom_target(tests-radio + COMMAND ${CMAKE_COMMAND} --build native --target tests-radio + DEPENDS configure + ) + + add_custom_target(firmware + COMMAND ${CMAKE_COMMAND} --build arm-none-eabi --target firmware + DEPENDS configure + ) + + add_custom_target(firmware-size + COMMAND ${CMAKE_COMMAND} --build arm-none-eabi --target firmware-size + DEPENDS configure + ) + + # Quit cmake at this point + return() endif() -# Ignore COMPILE_DEFINITIONS_ properties (prefer generator expressions) -# https://cmake.org/cmake/help/latest/policy/CMP0043.html -if(POLICY CMP0043) - cmake_policy(SET CMP0043 NEW) -endif() +enable_language(ASM) -# Only interpret if() arguments as variables or keywords when unquoted -# https://cmake.org/cmake/help/latest/policy/CMP0054.html -if(POLICY CMP0054) - cmake_policy(SET CMP0054 NEW) -endif() - -# Custom command byproducts must be explicit - for ninja -# https://cmake.org/cmake/help/latest/policy/CMP0058.html -if(POLICY CMP0058) - cmake_policy(SET CMP0058 NEW) -endif() - -set(CMAKE_COLOR_MAKEFILE ON) - -set(CMAKE_CXX_STANDARD 11) -add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition - -set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) -set(RADIO_SRC_DIR ${RADIO_DIRECTORY}/src) -set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/companion/src) -set(SIMU_SRC_DIRECTORY ${COMPANION_SRC_DIRECTORY}/simulation) -set(TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools) -set(UTILS_DIR ${PROJECT_SOURCE_DIR}/radio/util) -set(LIBOPENUI_TOOLS_DIR ${RADIO_SRC_DIR}/thirdparty/libopenui/tools) - -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) - -include(Macros) -today(DATE) -now(TIME) -git_id(GIT_STR) +include(GenericDefinitions) message(STATUS "EdgeTX ${VERSION} @ ${GIT_STR}") -# options shared by all targets - -option(APP_CUSTOM_DBG_HANDLER "Use custom message handler for debug output in all Qt apps." ON) -set(APP_CUSTOM_DBG_LEVEL "0" CACHE STRING - "Debug output level: 0=debug+; 1=info+; 2=warn+; 3=critical+; 4=fatal only.") -set(APP_CUSTOM_DBG_SHOW_FILE "DEFAULT" CACHE STRING - "Show source file names in debug output. 1/0/DEFAULT (default is ON with DEBUG builds).") - -option(VERBOSE_CMAKELISTS "Show extra information while processing CMakeLists.txt files." OFF) -option(WARNINGS_AS_ERRORS "Treat any compiler warning as an error (adds -Werror flag)." OFF) - -if(WIN32) - set(WIN_EXTRA_LIBS_PATH "C:/Programs" CACHE PATH - "Base path to extra libs/headers on Windows (SDL & pthreads folders should be in here).") - list(APPEND CMAKE_PREFIX_PATH "${WIN_EXTRA_LIBS_PATH}" "${WIN_EXTRA_LIBS_PATH}/SDL") # hints for FindSDL -endif() - -if(CMAKE_HOST_APPLE) - execute_process(COMMAND xcrun --show-sdk-path - OUTPUT_VARIABLE SDKROOT - ERROR_QUIET - OUTPUT_STRIP_TRAILING_WHITESPACE) - - message("-- SDKROOT: ${SDKROOT}") - set(CMAKE_OSX_SYSROOT ${SDKROOT}) - set(SYSROOT_ARG -isysroot ${SDKROOT}) -endif() - - -# Python check -find_package(PythonInterp 3 REQUIRED) -if(PYTHONINTERP_FOUND) - message(STATUS "Python found, version: ${PYTHON_VERSION_STRING}") - get_filename_component(PYTHON_DIRECTORY ${PYTHON_EXECUTABLE} DIRECTORY) -else() - message(WARNING "Python not found! Most firmware and simu flavors not buildable.") - set(LUA NO) -endif() - -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # regular Clang or AppleClang - set(CLANG TRUE) -endif() - -option(DISABLE_COMPANION "Disable building companion and simulators" OFF) - -if(NOT DISABLE_COMPANION) # FIXME cosmetics/style - -if(APPLE AND EXISTS /usr/local/opt/qt5) - # Homebrew installs Qt5 (up to at least 5.9.1) in - # /usr/local/qt5, ensure it can be found by CMake since - # it is not in the default /usr/local prefix. - list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/qt5") -endif() - -find_package(Qt5Core) -find_package(Qt5Widgets) -find_package(Qt5Xml) -find_package(Qt5LinguistTools) -find_package(Qt5PrintSupport) -find_package(Qt5Multimedia) -find_package(Qt5Svg) - -if(Qt5Core_FOUND) - message(STATUS "Qt Version: ${Qt5Core_VERSION}") - - ### Get locations of Qt binary executables & libs (libs are for distros, not for linking) - # first set up some hints - get_target_property(QtCore_LOCATION Qt5::Core LOCATION) - get_filename_component(qt_core_path ${QtCore_LOCATION} PATH) - if(APPLE) - get_filename_component(qt_core_path "${qt_core_path}/.." ABSOLUTE) - endif() - - set(QT_LIB_DIR ${qt_core_path} CACHE PATH "Path to Qt libraries (.dll|.framework|.so).") - find_path(QT_BIN_DIR NAMES "qmake" "qmake.exe" HINTS "${CMAKE_PREFIX_PATH}/bin" "${qt_core_path}/../bin" "${qt_core_path}" DOC "Path to Qt binaries (qmake, lupdate, etc.).") - find_program(QT_QMAKE_EXECUTABLE qmake HINTS "${QT_BIN_DIR}" DOC "Location of qmake program.") - find_program(QT_LUPDATE_EXECUTABLE lupdate HINTS "${QT_BIN_DIR}" DOC "Location of Qt's 'lupdate' program for updating translation files.") - - # Try to find Qt translations - if(QT_QMAKE_EXECUTABLE) - execute_process( - COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS - OUTPUT_VARIABLE qt_translations_hint - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - endif() - find_path(QT_TRANSLATIONS_DIR NAMES "qt_en.qm" HINTS "${qt_translations_hint}" DOC "Path to prebuilt Qt translations (qt_*.qm).") - - ### Common definitions for the Qt-based apps - list(APPEND APP_COMMON_DEFINES -DSIMU) - list(APPEND APP_COMMON_DEFINES -DQXT_STATIC) - list(APPEND APP_COMMON_DEFINES -DQT_USE_QSTRINGBUILDER) # more efficient QString construction using % operator - - if(MSVC) - list(APPEND APP_COMMON_DEFINES -D__STDC_LIMIT_MACROS) - endif() - if(APP_CUSTOM_DBG_HANDLER) - # provide full qDebug log context to our custom handler. This may also affect libsimulator, which is why it is here - list(APPEND APP_COMMON_DEFINES -DQT_MESSAGELOGCONTEXT) - list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=1) - if(APP_CUSTOM_DBG_LEVEL GREATER -1 AND APP_CUSTOM_DBG_LEVEL LESS 5) - list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_DEFAULT_LEVEL=${APP_CUSTOM_DBG_LEVEL}) - endif() - if(NOT APP_CUSTOM_DBG_SHOW_FILE STREQUAL "DEFAULT" AND (APP_CUSTOM_DBG_SHOW_FILE STREQUAL "1" OR APP_CUSTOM_DBG_SHOW_FILE STREQUAL "0")) - list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_SHOW_SRC_PATH=${APP_CUSTOM_DBG_SHOW_FILE}) - endif() - else() - list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=0) - endif() - -else() - message(WARNING "Qt not found! Companion and Simulator builds disabled.") -endif() - -if(NOT WIN32) - find_package(Fox QUIET) # QUIET not working on WIN32? - if (FOX_FOUND) - message(STATUS "Foxlib found at ${FOX_LIBRARY}") - else() # if(NOT WIN32) - message("Libfox not found, simu target will not be available") - endif() -endif() - -if(Qt5Core_FOUND OR FOX_FOUND) - set(SDL_BUILDING_LIBRARY YES) # this prevents FindSDL from appending SDLmain lib to the results, which we don't want - find_package("SDL") - if(SDL_FOUND) - message(STATUS "SDL Lib: ${SDL_LIBRARY}; Headers: ${SDL_INCLUDE_DIR}; Version: ${SDL_VERSION_STRING}") - if (NOT ${SDL_VERSION_STRING} VERSION_LESS "2.0") - message(FATAL_ERROR "OpenTX requires SDL 1.x, not 2.x") - endif() - else() - message(STATUS "SDL not found! Simulator audio, and joystick inputs, will not work.") - endif() -endif() -endif(NOT DISABLE_COMPANION) - -# Check for a file that is typically left from a OpenTX 2.1 build and abort if found -if (EXISTS ${RADIO_SRC_DIR}/stamp.h OR EXISTS ${RADIO_SRC_DIR}/translations/en.h) - message(FATAL_ERROR "Source directory contains files leftover from a OpenTX 2.1 build. Please run `git clean -f` in source directory (Careful: Will remove any extra files) or do a new clean git checkout") -endif() - -# Windows-specific includes and libs shared by sub-projects -if(WIN32) - list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIR}/thirdparty/windows/dirent") - if(MSVC) - list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIR}/thirdparty/windows/msinttypes") - #set(WIN_PTHREAD_BASE_PATH "${WIN_EXTRA_LIBS_PATH}/pthreads/Pre-built.2" CACHE PATH "Where to find pthreads include and lib folders.") - #list(APPEND WIN_INCLUDE_DIRS "${WIN_PTHREAD_BASE_PATH}/include") - #find_file(WIN_PTHREAD_LIB pthreadVC2.lib PATHS "${WIN_PTHREAD_BASE_PATH}" PATH_SUFFIXES lib/x86 lib NO_DEFAULT_PATH) - #find_file(WIN_PTHREAD_DLL pthreadVC2.dll PATHS "${WIN_PTHREAD_BASE_PATH}" PATH_SUFFIXES lib/x86 lib dll/x86 dll NO_DEFAULT_PATH) - #if(WIN_PTHREAD_LIB) - # list(APPEND WIN_LINK_LIBRARIES "${WIN_PTHREAD_LIB}") - #else() - # message(SEND_ERROR "pthreadVC2.lib not found!") - #endif() - find_package(pthreads) - #target_link_libraries(mytarget pthreads) - else() - set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES OFF) - set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES OFF) - set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES OFF) - set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES OFF) - endif() -endif() - -set(GTEST_ROOT /usr CACHE STRING "Base path to Google Test headers and source.") - -find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to Google Test header files folder ('gtest/gtest.h').") -find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") - -if(NOT GTEST_INCDIR OR NOT GTEST_SRCDIR) - message(STATUS "Googletest will be downloaded") - - set(GTEST_VERSION 1.8.1) - - set(GTEST_SRCDIR "${RADIO_SRC_DIR}/tests/googletest-release-${GTEST_VERSION}/googletest") - set(GTEST_INCDIR "${GTEST_SRCDIR}/include") - - set(GTEST_URL "https://github.com/google/googletest/archive/release-${GTEST_VERSION}.tar.gz") - set(GTEST_ARCHIVE "${RADIO_SRC_DIR}/tests/gtest-${GTEST_VERSION}.tar.gz") - - if (NOT EXISTS "${GTEST_SRCDIR}") - file(DOWNLOAD "${GTEST_URL}" ${GTEST_ARCHIVE} SHOW_PROGRESS) - execute_process( - COMMAND ${CMAKE_COMMAND} -E tar -xf ${GTEST_ARCHIVE} - WORKING_DIRECTORY ${RADIO_SRC_DIR}/tests) - execute_process( - COMMAND ${CMAKE_COMMAND} -E remove -f ${GTEST_ARCHIVE}) - endif() +if(NATIVE_BUILD) + include(NativeTargets) endif() add_subdirectory(${RADIO_SRC_DIR}) - -add_custom_target(tests-radio - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-radio - DEPENDS gtests-radio - ) - -if(Qt5Core_FOUND AND NOT DISABLE_COMPANION) - add_subdirectory(${COMPANION_SRC_DIRECTORY}) - add_custom_target(tests-companion - COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-companion - DEPENDS gtests-companion - ) - add_custom_target(gtests - DEPENDS gtests-radio gtests-companion - ) - add_custom_target(tests - DEPENDS tests-radio tests-companion - ) -else() - add_custom_target(gtests - DEPENDS gtests-radio - ) - add_custom_target(tests - DEPENDS tests-radio - ) -endif() diff --git a/cmake/DownloadGTest.cmake b/cmake/DownloadGTest.cmake new file mode 100644 index 000000000..3480d98d8 --- /dev/null +++ b/cmake/DownloadGTest.cmake @@ -0,0 +1,25 @@ +set(GTEST_ROOT /usr CACHE STRING "Base path to Google Test headers and source.") + +find_path(GTEST_INCDIR gtest/gtest.h HINTS "${GTEST_ROOT}/include" DOC "Path to Google Test header files folder ('gtest/gtest.h').") +find_path(GTEST_SRCDIR src/gtest-all.cc HINTS "${GTEST_ROOT}" "${GTEST_ROOT}/src/gtest" DOC "Path of Google Test 'src' folder.") + +if(NOT GTEST_INCDIR OR NOT GTEST_SRCDIR) + message(STATUS "Googletest will be downloaded") + + set(GTEST_VERSION 1.8.1) + + set(GTEST_SRCDIR "${RADIO_SRC_DIR}/tests/googletest-release-${GTEST_VERSION}/googletest") + set(GTEST_INCDIR "${GTEST_SRCDIR}/include") + + set(GTEST_URL "https://github.com/google/googletest/archive/release-${GTEST_VERSION}.tar.gz") + set(GTEST_ARCHIVE "${RADIO_SRC_DIR}/tests/gtest-${GTEST_VERSION}.tar.gz") + + if (NOT EXISTS "${GTEST_SRCDIR}") + file(DOWNLOAD "${GTEST_URL}" ${GTEST_ARCHIVE} SHOW_PROGRESS) + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar -xf ${GTEST_ARCHIVE} + WORKING_DIRECTORY ${RADIO_SRC_DIR}/tests) + execute_process( + COMMAND ${CMAKE_COMMAND} -E remove -f ${GTEST_ARCHIVE}) + endif() +endif() diff --git a/cmake/GenericDefinitions.cmake b/cmake/GenericDefinitions.cmake new file mode 100644 index 000000000..2fda0c6b7 --- /dev/null +++ b/cmake/GenericDefinitions.cmake @@ -0,0 +1,89 @@ +# Automatically link Qt executables to qtmain target on Windows +# https://cmake.org/cmake/help/latest/policy/CMP0020.html +cmake_policy(SET CMP0020 NEW) + +# Allow keyword and plain target_link_libraries() signatures to be mixed +# https://cmake.org/cmake/help/latest/policy/CMP0023.html +cmake_policy(SET CMP0023 OLD) + +# Use @rpath in a target's install name on MacOS X for locating shared libraries +# https://cmake.org/cmake/help/latest/policy/CMP0042.html +if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif() + +# Ignore COMPILE_DEFINITIONS_ properties (prefer generator expressions) +# https://cmake.org/cmake/help/latest/policy/CMP0043.html +if(POLICY CMP0043) + cmake_policy(SET CMP0043 NEW) +endif() + +# Only interpret if() arguments as variables or keywords when unquoted +# https://cmake.org/cmake/help/latest/policy/CMP0054.html +if(POLICY CMP0054) + cmake_policy(SET CMP0054 NEW) +endif() + +# Custom command byproducts must be explicit - for ninja +# https://cmake.org/cmake/help/latest/policy/CMP0058.html +if(POLICY CMP0058) + cmake_policy(SET CMP0058 NEW) +endif() + +set(CMAKE_COLOR_MAKEFILE ON) + +set(CMAKE_CXX_STANDARD 11) +add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition + +set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio) +set(RADIO_SRC_DIR ${RADIO_DIRECTORY}/src) +set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/companion/src) +set(SIMU_SRC_DIRECTORY ${COMPANION_SRC_DIRECTORY}/simulation) +set(TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools) +set(UTILS_DIR ${PROJECT_SOURCE_DIR}/radio/util) +set(LIBOPENUI_TOOLS_DIR ${RADIO_SRC_DIR}/thirdparty/libopenui/tools) + +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake) + +include(Macros) +today(DATE) +now(TIME) +git_id(GIT_STR) + +# Python check +find_package(PythonInterp 3 REQUIRED) +if(PYTHONINTERP_FOUND) + message(STATUS "Python found, version: ${PYTHON_VERSION_STRING}") + get_filename_component(PYTHON_DIRECTORY ${PYTHON_EXECUTABLE} DIRECTORY) +else() + message(WARNING "Python not found! Most firmware and simu flavors not buildable.") + set(LUA NO) +endif() + +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") # regular Clang or AppleClang + set(CLANG TRUE) +endif() + +if(CMAKE_HOST_APPLE) + execute_process(COMMAND xcrun --show-sdk-path + OUTPUT_VARIABLE SDKROOT + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + + message("-- SDKROOT: ${SDKROOT}") + #set(CMAKE_OSX_SYSROOT ${SDKROOT}) + set(SYSROOT_ARG -isysroot ${SDKROOT}) +endif() + +# options shared by all targets + +option(APP_CUSTOM_DBG_HANDLER "Use custom message handler for debug output in all Qt apps." ON) +set(APP_CUSTOM_DBG_LEVEL "0" CACHE STRING + "Debug output level: 0=debug+; 1=info+; 2=warn+; 3=critical+; 4=fatal only.") +set(APP_CUSTOM_DBG_SHOW_FILE "DEFAULT" CACHE STRING + "Show source file names in debug output. 1/0/DEFAULT (default is ON with DEBUG builds).") + +option(VERBOSE_CMAKELISTS "Show extra information while processing CMakeLists.txt files." OFF) +option(WARNINGS_AS_ERRORS "Treat any compiler warning as an error (adds -Werror flag)." OFF) diff --git a/cmake/NativeTargets.cmake b/cmake/NativeTargets.cmake new file mode 100644 index 000000000..df34c7d43 --- /dev/null +++ b/cmake/NativeTargets.cmake @@ -0,0 +1,75 @@ + +option(DISABLE_COMPANION "Disable building companion and simulators" OFF) + +# if(WIN32) +# set(WIN_EXTRA_LIBS_PATH "C:/Programs" CACHE PATH +# "Base path to extra libs/headers on Windows (SDL & pthreads folders should be in here).") +# list(APPEND CMAKE_PREFIX_PATH "${WIN_EXTRA_LIBS_PATH}" "${WIN_EXTRA_LIBS_PATH}/SDL") # hints for FindSDL +# endif() + +# libfox +if(NOT WIN32) + find_package(Fox QUIET) # QUIET not working on WIN32? + if (FOX_FOUND) + message(STATUS "Foxlib found at ${FOX_LIBRARY}") + else() # if(NOT WIN32) + message("Libfox not found, simu target will not be available") + endif() +endif() + +if(NOT DISABLE_COMPANION) + include(QtDefs) +endif(NOT DISABLE_COMPANION) + +if(Qt5Core_FOUND OR FOX_FOUND) + set(SDL_BUILDING_LIBRARY YES) # this prevents FindSDL from appending SDLmain lib to the results, which we don't want + find_package("SDL") + if(SDL_FOUND) + message(STATUS "SDL Lib: ${SDL_LIBRARY}; Headers: ${SDL_INCLUDE_DIR}; Version: ${SDL_VERSION_STRING}") + if (NOT ${SDL_VERSION_STRING} VERSION_LESS "2.0") + message(FATAL_ERROR "OpenTX requires SDL 1.x, not 2.x") + endif() + else() + message(STATUS "SDL not found! Simulator audio, and joystick inputs, will not work.") + endif() +endif() + +# Windows-specific includes and libs shared by sub-projects +if(WIN32) + list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIR}/thirdparty/windows/dirent") + # TODO: is that still necessary? + set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES OFF) + set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES OFF) + set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES OFF) + set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES OFF) +endif() + +# google tests +include(DownloadGTest) + +add_custom_target(tests-radio + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-radio + DEPENDS gtests-radio + ) + +if(Qt5Core_FOUND AND NOT DISABLE_COMPANION) + add_subdirectory(${COMPANION_SRC_DIRECTORY}) + add_custom_target(tests-companion + COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gtests-companion + DEPENDS gtests-companion + ) + add_custom_target(gtests + DEPENDS gtests-radio gtests-companion + ) + add_custom_target(tests + DEPENDS tests-radio tests-companion + ) +else() + add_custom_target(gtests + DEPENDS gtests-radio + ) + add_custom_target(tests + DEPENDS tests-radio + ) +endif() + diff --git a/cmake/QtDefs.cmake b/cmake/QtDefs.cmake new file mode 100644 index 000000000..77bea007b --- /dev/null +++ b/cmake/QtDefs.cmake @@ -0,0 +1,65 @@ +if(APPLE AND EXISTS /usr/local/opt/qt5) + # Homebrew installs Qt5 (up to at least 5.9.1) in + # /usr/local/qt5, ensure it can be found by CMake since + # it is not in the default /usr/local prefix. + list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/qt5") +endif() + +find_package(Qt5Core) +find_package(Qt5Widgets) +find_package(Qt5Xml) +find_package(Qt5LinguistTools) +find_package(Qt5PrintSupport) +find_package(Qt5Multimedia) +find_package(Qt5Svg) + +if(Qt5Core_FOUND) + message(STATUS "Qt Version: ${Qt5Core_VERSION}") + + ### Get locations of Qt binary executables & libs (libs are for distros, not for linking) + # first set up some hints + get_target_property(QtCore_LOCATION Qt5::Core LOCATION) + get_filename_component(qt_core_path ${QtCore_LOCATION} PATH) + if(APPLE) + get_filename_component(qt_core_path "${qt_core_path}/.." ABSOLUTE) + endif() + + set(QT_LIB_DIR ${qt_core_path} CACHE PATH "Path to Qt libraries (.dll|.framework|.so).") + find_path(QT_BIN_DIR NAMES "qmake" "qmake.exe" HINTS "${CMAKE_PREFIX_PATH}/bin" "${qt_core_path}/../bin" "${qt_core_path}" DOC "Path to Qt binaries (qmake, lupdate, etc.).") + find_program(QT_QMAKE_EXECUTABLE qmake HINTS "${QT_BIN_DIR}" DOC "Location of qmake program.") + find_program(QT_LUPDATE_EXECUTABLE lupdate HINTS "${QT_BIN_DIR}" DOC "Location of Qt's 'lupdate' program for updating translation files.") + + # Try to find Qt translations + if(QT_QMAKE_EXECUTABLE) + execute_process( + COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS + OUTPUT_VARIABLE qt_translations_hint + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() + find_path(QT_TRANSLATIONS_DIR NAMES "qt_en.qm" HINTS "${qt_translations_hint}" DOC "Path to prebuilt Qt translations (qt_*.qm).") + + ### Common definitions for the Qt-based apps + list(APPEND APP_COMMON_DEFINES -DSIMU) + list(APPEND APP_COMMON_DEFINES -DQXT_STATIC) + list(APPEND APP_COMMON_DEFINES -DQT_USE_QSTRINGBUILDER) # more efficient QString construction using % operator + + if(MSVC) + list(APPEND APP_COMMON_DEFINES -D__STDC_LIMIT_MACROS) + endif() + if(APP_CUSTOM_DBG_HANDLER) + # provide full qDebug log context to our custom handler. This may also affect libsimulator, which is why it is here + list(APPEND APP_COMMON_DEFINES -DQT_MESSAGELOGCONTEXT) + list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=1) + if(APP_CUSTOM_DBG_LEVEL GREATER -1 AND APP_CUSTOM_DBG_LEVEL LESS 5) + list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_DEFAULT_LEVEL=${APP_CUSTOM_DBG_LEVEL}) + endif() + if(NOT APP_CUSTOM_DBG_SHOW_FILE STREQUAL "DEFAULT" AND (APP_CUSTOM_DBG_SHOW_FILE STREQUAL "1" OR APP_CUSTOM_DBG_SHOW_FILE STREQUAL "0")) + list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_SHOW_SRC_PATH=${APP_CUSTOM_DBG_SHOW_FILE}) + endif() + else() + list(APPEND APP_COMMON_DEFINES -DAPP_DBG_HANDLER_ENABLE=0) + endif() +else() + message(WARNING "Qt not found! Companion and Simulator builds disabled.") +endif() diff --git a/cmake/toolchain/arm-none-eabi.cmake b/cmake/toolchain/arm-none-eabi.cmake new file mode 100644 index 000000000..f7ed2a223 --- /dev/null +++ b/cmake/toolchain/arm-none-eabi.cmake @@ -0,0 +1,67 @@ +# arm-none-eabi toolchain +set(TOOLCHAIN_PREFIX arm-none-eabi-) + +if(MINGW OR CYGWIN OR WIN32) + set(UTIL_SEARCH_CMD where) +elseif(UNIX OR APPLE) + set(UTIL_SEARCH_CMD which) +endif() + +execute_process( + COMMAND ${UTIL_SEARCH_CMD} ${TOOLCHAIN_PREFIX}gcc + OUTPUT_VARIABLE BINUTILS_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +get_filename_component(ARM_TOOLCHAIN_DIR ${BINUTILS_PATH} DIRECTORY) + +# Without that flag CMake is not able to pass test compilation check +if (${CMAKE_VERSION} VERSION_EQUAL "3.6.0" OR ${CMAKE_VERSION} VERSION_GREATER "3.6") + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +else() + set(CMAKE_EXE_LINKER_FLAGS_INIT "--specs=nosys.specs") +endif() + +# Generate .elf files +set(CMAKE_EXECUTABLE_SUFFIX ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_C ".elf") +set(CMAKE_EXECUTABLE_SUFFIX_CXX ".elf") + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) + +# Default C compiler flags +set(CMAKE_C_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS_RELEASE_INIT "-O3 -Wall") +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -Wall") +set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE) +set(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall") +set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE) + +# Default C++ compiler flags +set(CMAKE_CXX_FLAGS_DEBUG_INIT "-g3 -Og -Wall -pedantic -DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG_INIT}" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS_RELEASE_INIT "-O3 -Wall") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE_INIT}" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -Wall") +set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL_INIT}" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g -Wall") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT}" CACHE STRING "" FORCE) + +# customize linker command +set(CMAKE_EXE_LINKER_FLAGS "") +set(CMAKE_C_LINK_EXECUTABLE " -o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o ") + +set(CMAKE_OBJCOPY ${ARM_TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "objcopy tool") +set(CMAKE_SIZE_UTIL ${ARM_TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}size CACHE INTERNAL "size tool") + +#set(CMAKE_SYSROOT ${ARM_TOOLCHAIN_DIR}/../arm-none-eabi) +set(CMAKE_SYSROOT "") +set(CMAKE_FIND_ROOT_PATH ${BINUTILS_PATH}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/cmake/toolchain/native.cmake b/cmake/toolchain/native.cmake new file mode 100644 index 000000000..6c8bd8ba4 --- /dev/null +++ b/cmake/toolchain/native.cmake @@ -0,0 +1,2 @@ +# Native toolchain + diff --git a/companion/src/CMakeLists.txt b/companion/src/CMakeLists.txt index 35bfd2968..f24046aea 100644 --- a/companion/src/CMakeLists.txt +++ b/companion/src/CMakeLists.txt @@ -354,10 +354,10 @@ if(POLICY CMP0026) cmake_policy(SET CMP0026 OLD) # https://cmake.org/cmake/help/v3.0/policy/CMP0026.html endif() -if(SIMU_TARGET) - get_property(current_plugin TARGET edgetx-${FLAVOUR}-simulator PROPERTY LOCATION) - list(APPEND simulator_plugins "${current_plugin}") -endif() +#if(SIMU_TARGET) +# get_property(current_plugin TARGET edgetx-${FLAVOUR}-simulator PROPERTY LOCATION) +# list(APPEND simulator_plugins "${current_plugin}") +#endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") message(STATUS "install " ${CMAKE_BINARY_DIR} " to " ${CMAKE_INSTALL_PREFIX}/bin) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index f17b5252b..539ad14f6 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -518,8 +518,8 @@ else() endif(WARNINGS_AS_ERRORS) endif() -add_subdirectory(targets/simu) -if(NOT MSVC) +if(NATIVE_BUILD) + add_subdirectory(targets/simu) add_subdirectory(tests) endif() @@ -527,20 +527,11 @@ set(SRC ${SRC} ${FIRMWARE_SRC}) ##### firmware target ##### -option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON) -if(NOT FIRMWARE_TARGET) +if(NATIVE_BUILD) message(STATUS "firmware target disabled") return() endif() -set(CMAKE_EXECUTABLE_SUFFIX ".elf") -# trick to remove the -rdynamic and --out-implib issues -set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") -set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") -# similar for -mmacosx-version-min=" -set(CMAKE_C_OSX_DEPLOYMENT_TARGET_FLAG "") -set(CMAKE_CXX_OSX_DEPLOYMENT_TARGET_FLAG "") -# reset some CMake default flags which assume optimization levels/etc set(CMAKE_C_FLAGS "${FIRMWARE_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${FIRMWARE_C_FLAGS_DEBUG}") set(CMAKE_C_FLAGS_RELEASE "") @@ -551,140 +542,118 @@ set(CMAKE_CXX_FLAGS_DEBUG "${FIRMWARE_CXX_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_RELEASE "") set(CMAKE_CXX_FLAGS_MINSIZEREL "") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "") -# customize linker command -set(CMAKE_EXE_LINKER_FLAGS "") -set(CMAKE_C_LINK_EXECUTABLE " -o ") -set(CMAKE_CXX_LINK_EXECUTABLE " -o ") -set(CMAKE_C_STANDARD_LIBRARIES "") -set(CMAKE_CXX_STANDARD_LIBRARIES "") +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)." + ) -use_cxx11() # ensure gnu++11 in CXX_FLAGS with CMake < 3.1 +set(OPT "s" CACHE STRING "Optimization mode (0/1/2/s") -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).") +set(COMMON_FLAGS "-mcpu=${MCU} -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=firmware.lst") +set(COMMON_FLAGS "${COMMON_FLAGS} -gdwarf-2 -fno-exceptions -fdata-sections -ffunction-sections") +set(COMMON_FLAGS "${COMMON_FLAGS} -DHSE_VALUE=${HSE_VALUE}") +set(COMMON_FLAGS "${COMMON_FLAGS} -O${OPT} ${FPU_FLAGS}") +set(COMMON_FLAGS "${COMMON_FLAGS} ${WARNING_FLAGS}") -if(NOT MSVC) - set(OPT "s" CACHE STRING "Optimization mode (0/1/2/s") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS} -Wimplicit") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}") - if(ARCH STREQUAL ARM) - enable_language(ASM) - set(CMAKE_C_COMPILER ${FIRMWARE_C_COMPILER}) - set(CMAKE_CXX_COMPILER ${FIRMWARE_CXX_COMPILER}) - set(CMAKE_ASM_COMPILER ${FIRMWARE_ASM_COMPILER}) - set(CMAKE_RANLIB ${FIRMWARE_RANLIB}) +# these are in addition to CMAKE_CXX_FLAGS +set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIR}/${LINKER_SCRIPT}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections") - set(CMAKE_SYSTEM_NAME Generic) - set(CMAKE_SYSTEM_VERSION 1) - set(CMAKE_ASM_COMPILE_OBJECT " -o ") +if(SEMIHOSTING) + add_definitions(-DSEMIHOSTING) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs") +endif() - 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}") - set(COMMON_FLAGS "${COMMON_FLAGS} ${FPU_FLAGS}") - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS} -Wimplicit") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}") - - # these are in addition to CMAKE_CXX_FLAGS - set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIR}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections") - - if(SEMIHOSTING) - add_definitions(-DSEMIHOSTING) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=rdimon.specs") - endif() - - # Use newlib nano, which saves a few kilobytes. - if(NOT NANO STREQUAL NO) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs") - if(LUA) - # Lua needs %g and %f - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float -u _scanf_float") - endif() - if(SDRAM) - # Target with SDRAM do not need a custom allocator for now - # as the custom allocator has alignement issues - message("Target has SDRAM, do not use BIN_ALLOCATOR") - else() - # Nano's malloc does work well with lua, use our own - add_definitions(-DUSE_BIN_ALLOCATOR) - set(SRC ${SRC} bin_allocator.cpp) - endif() - endif() - - if(OPENRC_BOOTLOADER) - # We fetch Mike's bootloader as it is not included inside OpenTX - message(STATUS "Downloading Mike's bootloader: https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER}") - file(DOWNLOAD https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER} ${CMAKE_CURRENT_BINARY_DIR}/bootloader.lbm STATUS status) - list(GET status 0 error_code) - if(error_code) - list(GET status 1 error_message) - message(FATAL_ERROR "Download failed: ${error_message}") - endif() - elseif(BOOTLOADER) - add_subdirectory(targets/common/arm/stm32/bootloader) - include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) - set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} bootloader) - endif() - - add_definitions(-DFREE_RTOS) - - add_executable(firmware ${SRC} ${FIRMWARE_HEADERS}) - link_libraries(firmware -lstdc++) - add_dependencies(firmware ${RADIO_DEPENDENCIES} ${FIRMWARE_DEPENDENCIES}) - set_target_properties(firmware PROPERTIES EXCLUDE_FROM_ALL TRUE) - - if(ACCESS_DENIED) - add_subdirectory(thirdparty/AccessDenied) - include_directories(thirdparty/AccessDenied) - target_link_libraries(firmware AccessDenied) - endif() - - add_custom_command( - TARGET firmware POST_BUILD - COMMAND ${FIRMWARE_OBJCOPY} -O binary firmware.elf firmware.bin - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - find_program(GAWK gawk HINTS "c:/cygwin/bin/" "c:/msys/bin/" DOC "gawk for firmware size report.") # OS X might only have "awk" - if (BASH AND GAWK) - add_custom_target(firmware-size - COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf' - DEPENDS firmware - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - else() - add_custom_target(firmware-size - COMMAND ${FIRMWARE_SIZE} -A firmware.elf - DEPENDS firmware - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - endif() - endif() # ARM - - if(CPU_FAMILY STREQUAL STM32) - add_custom_target(flash - COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin - DEPENDS firmware - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - add_custom_target(flash-bl - COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D bootloader.bin - DEPENDS bootloader - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - add_custom_target(flash-jtag - COMMAND st-flash --reset write firmware.bin 0x8000000 - DEPENDS firmware - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - - add_custom_target(flash-stlink - COMMAND ST-LINK_CLI -c SWD -P firmware.bin 0x8000000 -Rst -Q - DEPENDS firmware-size - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) +# Use newlib nano, which saves a few kilobytes. +if(NOT NANO STREQUAL NO) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs") + if(LUA) + # Lua needs %g and %f + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -u _printf_float -u _scanf_float") endif() + if(SDRAM) + # Target with SDRAM do not need a custom allocator for now + # as the custom allocator has alignement issues + message("Target has SDRAM, do not use BIN_ALLOCATOR") + else() + # Nano's malloc does work well with lua, use our own + add_definitions(-DUSE_BIN_ALLOCATOR) + set(SRC ${SRC} bin_allocator.cpp) + endif() +endif() - PrintTargetReport("firmware") +# Bootloader +if(BOOTLOADER) + add_subdirectory(targets/common/arm/stm32/bootloader) + include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader) + set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} bootloader) +endif() -endif(NOT MSVC) +add_definitions(-DFREE_RTOS) + +add_executable(firmware ${SRC} ${FIRMWARE_HEADERS}) +link_libraries(firmware -lstdc++) +add_dependencies(firmware ${RADIO_DEPENDENCIES} ${FIRMWARE_DEPENDENCIES}) +set_target_properties(firmware PROPERTIES EXCLUDE_FROM_ALL TRUE) + +if(ACCESS_DENIED) + add_subdirectory(thirdparty/AccessDenied) + include_directories(thirdparty/AccessDenied) + target_link_libraries(firmware AccessDenied) +endif() + +add_custom_command( + TARGET firmware POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary firmware.elf firmware.bin + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + +find_program(GAWK gawk + HINTS "c:/cygwin/bin/" "c:/msys/bin/" + DOC "gawk for firmware size report.") # OS X might only have "awk" + +if (BASH AND GAWK) + add_custom_target(firmware-size + COMMAND ${BASH} -kc '${RADIO_DIRECTORY}/util/elf-size-report.sh --mcu=${CPU_TYPE_FULL} ${SIZE_TARGET_MEM_DEFINE} firmware.elf' + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +else() + add_custom_target(firmware-size + COMMAND ${CMAKE_SIZE_UTIL} -A firmware.elf + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +endif() + +if(CPU_FAMILY STREQUAL STM32) + add_custom_target(flash + COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D firmware.bin + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + + add_custom_target(flash-bl + COMMAND dfu-util --alt 0 --dfuse-address 0x08000000:leave -d 0483:df11 -D bootloader.bin + DEPENDS bootloader + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + + add_custom_target(flash-jtag + COMMAND st-flash --reset write firmware.bin 0x8000000 + DEPENDS firmware + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + + add_custom_target(flash-stlink + COMMAND ST-LINK_CLI -c SWD -P firmware.bin 0x8000000 -Rst -Q + DEPENDS firmware-size + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) +endif() + +PrintTargetReport("firmware") diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 64ba5f989..525bc1e37 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -180,7 +180,7 @@ endif() add_custom_command( TARGET bootloader POST_BUILD - COMMAND ${FIRMWARE_OBJCOPY} -O binary bootloader.elf ${CMAKE_BINARY_DIR}/bootloader.bin + COMMAND ${CMAKE_OBJCOPY} -O binary bootloader.elf ${CMAKE_BINARY_DIR}/bootloader.bin ) if(PYTHONINTERP_FOUND) diff --git a/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt b/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt index b85c33c81..a1bf45710 100644 --- a/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/f4/CMakeLists.txt @@ -2,25 +2,27 @@ set(CPU_FAMILY STM32) set(MCU cortex-m4) set(FPU_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16") -# STM32 HAL/LL library -set(STM32CUBE_DIR ${THIRDPARTY_DIR}/STM32F4xx_HAL_Driver) +if(NOT NATIVE_BUILD) + # STM32 HAL/LL library + set(STM32CUBE_DIR ${THIRDPARTY_DIR}/STM32F4xx_HAL_Driver) -add_library(stm32cube_ll OBJECT EXCLUDE_FROM_ALL - ${STM32CUBE_DIR}/Src/stm32f4xx_ll_gpio.c - ${STM32CUBE_DIR}/Src/stm32f4xx_ll_tim.c - ${STM32CUBE_DIR}/Src/stm32f4xx_ll_dma.c - ${STM32CUBE_DIR}/Src/stm32f4xx_ll_usart.c - ${STM32CUBE_DIR}/Src/stm32f4xx_ll_rcc.c - ) + add_library(stm32cube_ll OBJECT EXCLUDE_FROM_ALL + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_gpio.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_tim.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_dma.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_usart.c + ${STM32CUBE_DIR}/Src/stm32f4xx_ll_rcc.c + ) -target_compile_options(stm32cube_ll PRIVATE -DUSE_FULL_LL_DRIVER) -target_include_directories(stm32cube_ll PRIVATE - ${STM32CUBE_DIR}/Inc - ${THIRDPARTY_DIR}/CMSIS/Device/ST/STM32F4xx/Include - ${THIRDPARTY_DIR}/CMSIS/Include) + target_compile_options(stm32cube_ll PRIVATE -DUSE_FULL_LL_DRIVER) + target_include_directories(stm32cube_ll PRIVATE + ${STM32CUBE_DIR}/Inc + ${THIRDPARTY_DIR}/CMSIS/Device/ST/STM32F4xx/Include + ${THIRDPARTY_DIR}/CMSIS/Include) -set(FIRMWARE_SRC ${FIRMWARE_SRC} $) -set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) + set(FIRMWARE_SRC ${FIRMWARE_SRC} $) + set(BOOTLOADER_SRC ${BOOTLOADER_SRC} $) +endif() # StdPeriph library set(STM32LIB_DIR ${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index a1ab32e93..8726740bf 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -308,50 +308,20 @@ set(STM32LIB_SRC STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma2d.c ) -MACRO(GET_GCC_INCLUDE_PATH gcc_include_path) - if (WIN32) - execute_process(COMMAND ${CMAKE_C_COMPILER} -v -x c -E NUL ERROR_VARIABLE _gcc_output OUTPUT_QUIET) - else() - execute_process(COMMAND ${CMAKE_C_COMPILER} -v -x c -E - INPUT_FILE /dev/null ERROR_VARIABLE _gcc_output OUTPUT_QUIET) - endif() - - # Build an array of string from the GCC output - string(REPLACE "\n" ";" _gcc_output "${_gcc_output}") - - set(_capture_include FALSE) - set(_include_path "") - - # Go through the lines and capture between '"#include <...> search starts here:"' and 'End of search list.' - foreach(_line ${_gcc_output}) - if(${_line} STREQUAL "End of search list.") - set(_capture_include FALSE) - endif() - - if(_capture_include) - # Remove the leading and trailing empty characters - string(REPLACE "\r" "" _line ${_line}) - string(SUBSTRING "${_line}" 1 -1 _line) - set(_include_path "${_include_path}" "-I\"${_line}\"") - endif() - - if(${_line} STREQUAL "#include <...> search starts here:") - set(_capture_include TRUE) - endif() - endforeach() - set(${gcc_include_path} ${_include_path}) -ENDMACRO() - if(PYTHONINTERP_FOUND) - GET_GCC_INCLUDE_PATH(gcc_include_path) - add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp WORKING_DIRECTORY ${RADIO_DIRECTORY}/src - COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs_private.h -DPCBHORUS -DPCB${PCB} -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU -I. -Igui/colorlcd -Itargets/horus -Itargets/common/arm/stm32 -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include ${gcc_include_path} -Wno-asm-operand-widths -Wno-pragma-once-outside-header ${SYSROOT_ARG} > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp + COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs_private.h + -DPCBHORUS -DPCB${PCB} -DCPUARM -DSTM32F4 -DSTM32F429_439xx -DCOLORLCD -DBACKUP -DSIMU + -I. -Igui/colorlcd -Itargets/horus -Itargets/common/arm/stm32 + -I${THIRDPARTY_DIR} -I${THIRDPARTY_DIR}/libopenui/src + -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/STM32F4xx_StdPeriph_Driver/inc + -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include + -I${THIRDPARTY_DIR}/STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Libraries/CMSIS/Include + -Wno-asm-operand-widths -Wno-pragma-once-outside-header ${SYSROOT_ARG} + > ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) - - add_custom_target(datacopy - DEPENDS ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp - ) + add_custom_target(datacopy DEPENDS ${PROJECT_BINARY_DIR}/radio/src/datacopy.cpp) endif() diff --git a/radio/src/tests/conversions.cpp b/radio/src/tests/conversions.cpp index 259db2023..957ba5fdd 100644 --- a/radio/src/tests/conversions.cpp +++ b/radio/src/tests/conversions.cpp @@ -217,7 +217,7 @@ TEST(Conversions, ConversionXLiteFrom23) } #endif -#if defined(PCBX7) +#if defined(PCBX7) && (STORAGE_CONVERSIONS <= 219) TEST(Conversions, ConversionX7From23) { #if defined(SDCARD_YAML) diff --git a/tools/build-gh.sh b/tools/build-gh.sh index 72afd9021..0c377f219 100755 --- a/tools/build-gh.sh +++ b/tools/build-gh.sh @@ -49,7 +49,7 @@ fi : ${SRCDIR:=$(dirname "$(pwd)/$0")/..} : ${BUILD_TYPE:=Release} -: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -DDISABLE_COMPANION=YES -Wno-dev "} +: ${COMMON_OPTIONS:="-DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_RULE_MESSAGES=OFF -Wno-dev "} : ${EXTRA_OPTIONS:="$EXTRA_OPTIONS"} COMMON_OPTIONS+=${EXTRA_OPTIONS} @@ -147,8 +147,9 @@ do esac cmake ${BUILD_OPTIONS} "${SRCDIR}" - make -j"${CORES}" ${FIRMARE_TARGET} + make arm-none-eabi-configure + make -C arm-none-eabi -j"${CORES}" ${FIRMARE_TARGET} rm -f CMakeCache.txt - mv firmware.bin "../${fw_name}" + mv arm-none-eabi/firmware.bin "../${fw_name}" done