################################################################################ # CMake support for the EIVE OBSW # # Author: R. Mueller ################################################################################ ################################################################################ # Pre-Project preparation ################################################################################ cmake_minimum_required(VERSION 3.13) # set(CMAKE_VERBOSE TRUE) set(CMAKE_SCRIPT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(EIVE_BUILD_UNITTESTS "Build Catch2 unittests" OFF) option(EIVE_ADD_ETL_LIB "Add ETL library" ON) option(EIVE_ADD_JSON_LIB "Add JSON library" ON) option(EIVE_SYSROOT_MAGIC "Perform sysroot magic which might not be necessary" OFF) option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" ON) if(NOT FSFW_OSAL) set(FSFW_OSAL linux CACHE STRING "OS for the FSFW.") endif() if(TGT_BSP) if(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack") option(LINUX_CROSS_COMPILE ON) option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" OFF) elseif(TGT_BSP MATCHES "arm/q7s") option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" ON) endif() endif() # Perform steps like loading toolchain files where applicable. include(${CMAKE_SCRIPT_PATH}/PreProjectConfig.cmake) pre_project_config() # Project Name project(eive-obsw ASM C CXX) ################################################################################ # Pre-Sources preparation ################################################################################ # Specify the C++ standard set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) # Set names and variables set(OBSW_NAME ${CMAKE_PROJECT_NAME}) set(WATCHDOG_NAME eive-watchdog) set(SIMPLE_OBSW_NAME eive-simple) set(LIB_FSFW_NAME fsfw) set(LIB_EIVE_MISSION eive-mission) set(LIB_ETL_NAME etl) set(LIB_CSP_NAME libcsp) set(LIB_LWGPS_NAME lwgps) set(LIB_ARCSEC wire) set(THIRD_PARTY_FOLDER thirdparty) set(LIB_CXX_FS -lstdc++fs) set(LIB_CATCH2 Catch2) set(LIB_GPS gps) set(LIB_JSON_NAME nlohmann_json::nlohmann_json) # Set path names set(FSFW_PATH fsfw) set(TEST_PATH test/testtasks) set(UNITTEST_PATH unittest) set(LINUX_PATH linux) set(COMMON_PATH common) set(WATCHDOG_PATH watchdog) set(COMMON_CONFIG_PATH ${COMMON_PATH}/config) set(UNITTEST_CFG_PATH ${UNITTEST_PATH}/testcfg) set(LIB_EIVE_MISSION_PATH mission) set(LIB_CSP_PATH ${THIRD_PARTY_FOLDER}/libcsp) set(LIB_ETL_PATH ${THIRD_PARTY_FOLDER}/etl) set(LIB_CATCH2_PATH ${THIRD_PARTY_FOLDER}/Catch2) set(LIB_LWGPS_PATH ${THIRD_PARTY_FOLDER}/lwgps) set(LIB_ARCSEC_PATH ${THIRD_PARTY_FOLDER}/arcsec_star_tracker) set(LIB_JSON_PATH ${THIRD_PARTY_FOLDER}/json) set(FSFW_WARNING_SHADOW_LOCAL_GCC OFF) set(EIVE_ADD_LINUX_FILES False) if(EIVE_BUILD_UNITTESTS) endif() if(FSFW_ADD_UNITTESTS) set(CATCH2_TARGET Catch2) endif() # Analyse different OS and architecture/target options, determine BSP_PATH, # display information about compiler etc. include (${CMAKE_SCRIPT_PATH}/HardwareOsPreConfig.cmake) pre_source_hw_os_config() if(TGT_BSP) if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack" ) set(FSFW_CONFIG_PATH "linux/fsfwconfig") if(NOT BUILD_Q7S_SIMPLE_MODE) set(EIVE_ADD_LINUX_FILES TRUE) set(ADD_CSP_LIB TRUE) set(FSFW_HAL_ADD_LINUX ON) endif() endif() if(TGT_BSP MATCHES "arm/raspberrypi") # Used by configure file set(RASPBERRY_PI ON) set(FSFW_HAL_ADD_RASPBERRY_PI ON) endif() if(TGT_BSP MATCHES "arm/beagleboneblack") # Used by configure file set(BEAGLEBONEBLACK ON) endif() if(TGT_BSP MATCHES "arm/q7s") # Used by configure file set(XIPHOS_Q7S ON) endif() else() # Required by FSFW library set(FSFW_CONFIG_PATH "${BSP_PATH}/fsfwconfig") endif() if(EIVE_BUILD_UNITTESTS) # configure_file(${UNITTEST_CFG_PATH}/TestsConfig.h.in TestsConfig.h) # set(FSFW_CONFIG_PATH ${UNITTEST_CFG_PATH}) endif() # Configuration files configure_file(${COMMON_CONFIG_PATH}/commonConfig.h.in commonConfig.h) configure_file(${FSFW_CONFIG_PATH}/FSFWConfig.h.in FSFWConfig.h) configure_file(${FSFW_CONFIG_PATH}/OBSWConfig.h.in OBSWConfig.h) if(TGT_BSP MATCHES "arm/q7s") configure_file(${BSP_PATH}/boardconfig/q7sConfig.h.in q7sConfig.h) elseif(TGT_BSP MATCHES "arm/raspberrypi") configure_file(${BSP_PATH}/boardconfig/rpiConfig.h.in rpiConfig.h) endif() configure_file(${WATCHDOG_PATH}/watchdogConf.h.in watchdogConf.h) # Set common config path for FSFW set(FSFW_ADDITIONAL_INC_PATHS "${COMMON_PATH}/config" ${CMAKE_CURRENT_BINARY_DIR} ) ################################################################################ # Executable and Sources ################################################################################ #global compiler options need to be set before adding executables if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") add_compile_options( "-Wall" "-Wextra" "-Wimplicit-fallthrough=1" "-Wno-unused-parameter" "-Wno-psabi" ) # Remove unused sections. add_compile_options( "-ffunction-sections" "-fdata-sections" ) # Removed unused sections. add_link_options( "-Wl,--gc-sections" ) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set(COMPILER_FLAGS "/permissive-") endif() add_library(${LIB_EIVE_MISSION}) # Add executable add_executable(${OBSW_NAME}) if(EIVE_CREATE_UNIQUE_OBSW_BIN) set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME}-$ENV{USERNAME}) else() set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME}) endif() set_target_properties(${OBSW_NAME} PROPERTIES OUTPUT_NAME ${OBSW_BIN_NAME}) #watchdog add_executable(${WATCHDOG_NAME} EXCLUDE_FROM_ALL) add_subdirectory(${WATCHDOG_PATH}) target_link_libraries(${WATCHDOG_NAME} PUBLIC ${LIB_CXX_FS} ) target_include_directories(${WATCHDOG_NAME} PUBLIC ${CMAKE_BINARY_DIR} ) if(EIVE_ADD_ETL_LIB) add_subdirectory(${LIB_ETL_PATH}) endif() if(EIVE_ADD_JSON_LIB) add_subdirectory(${LIB_JSON_PATH}) endif() if(NOT EIVE_BUILD_UNITTESTS) if(EIVE_ADD_LINUX_FILES) add_subdirectory(${LIB_ARCSEC_PATH}) add_subdirectory(${LINUX_PATH}) endif() add_subdirectory(${BSP_PATH}) if(ADD_CSP_LIB) add_subdirectory(${LIB_CSP_PATH}) endif() endif() add_subdirectory(${COMMON_PATH}) add_subdirectory(${LIB_LWGPS_PATH}) add_subdirectory(${FSFW_PATH}) add_subdirectory(${LIB_EIVE_MISSION_PATH}) add_subdirectory(${TEST_PATH}) if(EIVE_BUILD_UNITTESTS) # add_subdirectory(${LIB_CATCH2_PATH}) add_subdirectory(${UNITTEST_PATH}) endif() ################################################################################ # Post-Sources preparation ################################################################################ # Add libraries target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_FSFW_NAME} ${LIB_LWGPS_NAME} ${LIB_OS_NAME} ) target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_EIVE_MISSION} ) if(TGT_BSP MATCHES "arm/q7s") target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_ARCSEC} ${LIB_GPS} ) endif() if(ADD_CSP_LIB) target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_CSP_NAME} ) endif() if(EIVE_ADD_ETL_LIB) target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_ETL_NAME} ) endif() if(EIVE_ADD_JSON_LIB) target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_JSON_NAME} ) endif() if(EIVE_BUILD_UNITTESTS) target_link_libraries(${TARGET_NAME} PRIVATE ${CATCH2_TARGET} ) endif() target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_CXX_FS} ) # Add include paths for all sources. target_include_directories(${LIB_EIVE_MISSION} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${FSFW_CONFIG_PATH} ${CMAKE_CURRENT_BINARY_DIR} ${LIB_ARCSEC_PATH} ) if(TGT_BSP MATCHES "arm/q7s") target_include_directories(${LIB_EIVE_MISSION} PUBLIC ${ARCSEC_LIB_PATH} ) endif() if(CMAKE_VERBOSE) message(STATUS "Warning flags: ${WARNING_FLAGS}") endif() if(${CMAKE_CROSSCOMPILING}) include (${CMAKE_SCRIPT_PATH}/HardwareOsPostConfig.cmake) post_source_hw_os_config() endif() if(NOT CMAKE_SIZE) set(CMAKE_SIZE size) if(WIN32) set(FILE_SUFFIX ".exe") endif() endif() if(EIVE_BUILD_WATCHDOG) set(TARGET_STRING "OBSW Watchdog") else() if(TGT_BSP) set(TARGET_STRING "Target BSP: ${TGT_BSP}") else() set(TARGET_STRING "Target BSP: Hosted") endif() endif() string(CONCAT POST_BUILD_COMMENT "Build directory: ${CMAKE_BINARY_DIR}\n" "Target OSAL: ${FSFW_OSAL}\n" "Target Build Type: ${CMAKE_BUILD_TYPE}\n" "${TARGET_STRING}" ) add_custom_command( TARGET ${OBSW_NAME} POST_BUILD COMMAND ${CMAKE_SIZE} ${OBSW_BIN_NAME}${FILE_SUFFIX} COMMENT ${POST_BUILD_COMMENT} ) include (${CMAKE_SCRIPT_PATH}/BuildType.cmake) set_build_type()