# ############################################################################## # CMake support for the EIVE OBSW # # Author: R. Mueller # ############################################################################## # ############################################################################## # Pre-Project preparation # ############################################################################## cmake_minimum_required(VERSION 3.13) set(OBSW_VERSION_MAJOR 1) set(OBSW_VERSION_MINOR 26) set(OBSW_VERSION_REVISION 4) # set(CMAKE_VERBOSE TRUE) option( EIVE_HARDCODED_TOOLCHAIN_FILE "\ For Linux Board Target BSPs, a default toolchain file will be set. Should be set to OFF \ if a different toolchain file is set externally" ON) if(NOT FSFW_OSAL) set(FSFW_OSAL linux CACHE STRING "OS for the FSFW.") endif() if(TGT_BSP) if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack") option(LINUX_CROSS_COMPILE ON) endif() if(TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack") option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" OFF) elseif(TGT_BSP MATCHES "arm/q7s") option(EIVE_Q7S_EM "Build configuration for the EM" OFF) option(EIVE_BUILD_GPSD_GPS_HANDLER "Build GPSD dependent GPS Handler" ON) endif() option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" ON) else() option(EIVE_CREATE_UNIQUE_OBSW_BIN "Append username to generated binary name" OFF) endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # Perform steps like loading toolchain files where applicable. include(PreProjectConfig) pre_project_config() # Project Name project(eive-obsw) # Specify the C++ standard set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) include(EiveHelpers) option(EIVE_ADD_ETL_LIB "Add ETL library" ON) option(EIVE_ADD_JSON_LIB "Add JSON library" ON) set(OBSW_MAX_SCHEDULED_TCS 500) if(EIVE_Q7S_EM) set(OBSW_Q7S_EM 1 CACHE STRING "Q7S EM configuration") set(INIT_VAL 0) else() set(OBSW_Q7S_EM 0 CACHE STRING "Q7S EM configuration") set(INIT_VAL 1) endif() set(OBSW_ADD_MGT ${INIT_VAL} CACHE STRING "Add MGT module") set(OBSW_ADD_BPX_BATTERY_HANDLER ${INIT_VAL} CACHE STRING "Add MGT module") set(OBSW_ADD_STAR_TRACKER ${INIT_VAL} CACHE STRING "Add Startracker module") set(OBSW_ADD_SUN_SENSORS ${INIT_VAL} CACHE STRING "Add sun sensor module") set(OBSW_ADD_SUS_BOARD_ASS ${INIT_VAL} CACHE STRING "Add sun sensor board assembly") set(OBSW_ADD_ACS_BOARD ${INIT_VAL} CACHE STRING "Add ACS board module") set(OBSW_ADD_GPS_CTRL ${INIT_VAL} CACHE STRING "Add GPS controllers") set(OBSW_ADD_CCSDS_IP_CORES 1 CACHE STRING "Add CCSDS IP cores") set(OBSW_TM_TO_PTME 1 CACHE STRING "Send telemetry to PTME IP core") set(OBSW_TC_FROM_PDEC 1 CACHE STRING "Poll telecommand from PDEC IP core") set(OBSW_ADD_TCS_CTRL ${INIT_VAL} CACHE STRING "Add TCS controllers") set(OBSW_ADD_HEATERS ${INIT_VAL} CACHE STRING "Add TCS heaters") set(OBSW_ADD_PLOC_SUPERVISOR ${INIT_VAL} CACHE STRING "Add PLOC supervisor handler") set(OBSW_ADD_SA_DEPL ${INIT_VAL} CACHE STRING "Add SA deployment handler") set(OBSW_ADD_PLOC_MPSOC ${INIT_VAL} CACHE STRING "Add MPSoC handler") set(OBSW_ADD_ACS_CTRL ${INIT_VAL} CACHE STRING "Add ACS controller") set(OBSW_ADD_RTD_DEVICES ${INIT_VAL} CACHE STRING "Add RTD devices") set(OBSW_ADD_RAD_SENSORS ${INIT_VAL} CACHE STRING "Add Rad Sensor module") set(OBSW_ADD_PL_PCDU ${INIT_VAL} CACHE STRING "Add Payload PCDU modukle") set(OBSW_ADD_SYRLINKS 1 CACHE STRING "Add Syrlinks module") set(OBSW_ADD_TMP_DEVICES ${INIT_VAL} CACHE STRING "Add TMP devices") set(OBSW_ADD_GOMSPACE_PCDU ${INIT_VAL} CACHE STRING "Add GomSpace PCDU modules") set(OBSW_ADD_RW ${INIT_VAL} CACHE STRING "Add RW modules") set(OBSW_ADD_SCEX_DEVICE ${INIT_VAL} CACHE STRING "Add Solar Cell Experiment module") set(OBSW_SYRLINKS_SIMULATED 0 CACHE STRING "Syrlinks is simulated") # ############################################################################## # Pre-Sources preparation # ############################################################################## # Version handling set(GIT_VER_HANDLING_OK FALSE) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) determine_version_with_git("--exclude" "docker_*") set(GIT_INFO ${GIT_INFO} CACHE STRING "Version information retrieved with git describe") if(GIT_INFO) set(GIT_INFO ${GIT_INFO} CACHE STRING "Version information retrieved with git describe") # CMakeLists.txt is now single source of information. list(GET GIT_INFO 1 # OBSW_VERSION_MAJOR) list(GET GIT_INFO 2 OBSW_VERSION_MINOR) list(GET # GIT_INFO 3 OBSW_VERSION_REVISION) list(LENGTH GIT_INFO LIST_LEN) if(LIST_LEN GREATER 4) list(GET GIT_INFO 4 OBSW_VERSION_CST_GIT_SHA1) endif() if(NOT OBSW_VERSION_MAJOR) set(OBSW_VERSION_MAJOR ${OBSW_VERSION_MAJOR_IF_GIT_FAILS}) endif() if(NOT OBSW_VERSION_MINOR) set(FSFW_SUBVERSION ${OBSW_VERSION_MINOR_IF_GIT_FAILS}) endif() if(NOT OBSW_VERSION_REVISION) set(FSFW_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS}) endif() set(GIT_VER_HANDLING_OK TRUE) else() set(GIT_VER_HANDLING_OK FALSE) endif() endif() if(NOT GIT_VER_HANDLING_OK) set(OBSW_VERSION_MAJOR ${OBSW_VERSION_MAJOR_IF_GIT_FAILS}) set(OBSW_VERSION_MINOR ${OBSW_VERSION_MINOR_IF_GIT_FAILS}) set(OBSW_VERSION_REVISION ${OBSW_VERSION_REVISION_IF_GIT_FAILS}) endif() # Set names and variables set(OBSW_NAME ${CMAKE_PROJECT_NAME}) set(WATCHDOG_NAME eive-watchdog) set(SIMPLE_OBSW_NAME eive-simple) set(UNITTEST_NAME eive-unittest) set(LIB_FSFW_NAME fsfw) set(LIB_EIVE_MISSION eive-mission) set(LIB_ETL_TARGET etl::etl) set(LIB_CSP_NAME libcsp) set(LIB_LWGPS_NAME lwgps) set(LIB_ARCSEC wire) set(LIB_GOMSPACE_CLIENTS gs_clients) set(LIB_GOMSPACE_CSP gs_csp) 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(LIB_DUMMIES dummies) # Set path names set(FSFW_PATH fsfw) set(TEST_PATH test) set(UNITTEST_PATH unittest) set(LINUX_PATH linux) set(LIB_GOMSPACE_PATH ${THIRD_PARTY_FOLDER}/gomspace-sw) set(COMMON_PATH common) set(DUMMY_PATH dummies) 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_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 OFF) # Analyse different OS and architecture/target options, determine BSP_PATH, # display information about compiler etc. pre_source_hw_os_config() if(TGT_BSP) set(LIBGPS_VERSION_MAJOR 3) # I assume a newer version than 3.17 will be installed on other Linux board # than the Q7S set(LIBGPS_VERSION_MINOR 20) if(TGT_BSP MATCHES "arm/q7s" OR TGT_BSP MATCHES "arm/raspberrypi" OR TGT_BSP MATCHES "arm/beagleboneblack" OR TGT_BSP MATCHES "arm/egse" OR TGT_BSP MATCHES "arm/te0720-1cfa") find_library(${LIB_GPS} gps) set(FSFW_CONFIG_PATH "linux/fsfwconfig") if(NOT BUILD_Q7S_SIMPLE_MODE) set(EIVE_ADD_LINUX_FILES TRUE) set(EIVE_ADD_LINUX_FSFWCONFIG TRUE) set(ADD_GOMSPACE_CSP TRUE) set(ADD_GOMSPACE_CLIENTS TRUE) set(FSFW_HAL_ADD_LINUX ON) set(FSFW_HAL_LINUX_ADD_LIBGPIOD ON) set(FSFW_HAL_LINUX_ADD_PERIPHERAL_DRIVERS ON) endif() elseif(UNIX) set(EIVE_ADD_LINUX_FILES ON) 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/egse") # Used by configure file set(EGSE ON) set(FSFW_HAL_LINUX_ADD_LIBGPIOD OFF) set(OBSW_ADD_STAR_TRACKER 1) set(OBSW_DEBUG_STARTRACKER 1) 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) set(LIBGPS_VERSION_MAJOR 3) set(LIBGPS_VERSION_MINOR 17) endif() if(TGT_BSP MATCHES "arm/te0720-1cfa") set(TE0720_1CFA ON) endif() else() # Required by FSFW library set(FSFW_CONFIG_PATH "${BSP_PATH}/fsfwconfig") if(UNIX) set(EIVE_ADD_LINUX_FILES ON) endif() endif() include(BuildType) set_build_type() # Configuration files configure_file(${COMMON_CONFIG_PATH}/commonConfig.h.in commonConfig.h) configure_file(${FSFW_CONFIG_PATH}/FSFWConfig.h.in FSFWConfig.h) configure_file(${BSP_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" OR TGT_BSP MATCHES "arm/egse") 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") # 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_library(${LIB_DUMMIES}) # Add main executable add_executable(${OBSW_NAME}) set(OBSW_BIN_NAME ${CMAKE_PROJECT_NAME}) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(WARNING_FLAGS "-Wall" "-Wextra" "-Wimplicit-fallthrough=1" "-Wno-unused-parameter" "-Wno-psabi" "-Wduplicated-cond" # check for duplicate conditions "-Wduplicated-branches" # check for duplicate branches "-Wlogical-op" # Search for bitwise operations instead of logical "-Wnull-dereference" # Search for NULL dereference "-Wundef" # Warn if undefind marcos are used "-Wformat=2" # Format string problem detection "-Wformat-overflow=2" # Formatting issues in printf "-Wformat-truncation=2" # Formatting issues in printf "-Wformat-security" # Search for dangerous printf operations "-Wstrict-overflow=3" # Warn if integer overflows might happen "-Warray-bounds=2" # Some array bounds violations will be found "-Wshift-overflow=2" # Search for bit left shift overflows (