# # Haupt CMakeLists.txt für das Projekt TDS # # $Id$ # $HeadURL$ # $Author$ # # Setzen von CMAKE_INSTALL_PREFIX auf "/shd/CTC" falls nicht über Kommandozeile angegeben # CMAKE_MINIMUM_REQUIRED(VERSION 3.16) IF(POLICY CMP0069) CMAKE_POLICY(SET CMP0069 NEW) # cmake >= 3.9.0 - INTERPROCEDURAL_OPTIMIZATION behavior ENDIF() IF(POLICY CMP0071) CMAKE_POLICY(SET CMP0071 NEW) # cmake >= 3.10.0 - automatically process generated sources with AUTOMOC ENDIF() IF(POLICY CMP0072) CMAKE_POLICY(SET CMP0072 NEW) # cmake >= 3.11.0 - prefer libOpenGL.so over legacy libGL.so ENDIF() IF(NOT DEFINED CMAKE_INSTALL_PREFIX) SET(CMAKE_INSTALL_PREFIX "/shd/CTC" CACHE STRING "Install path prefix, prepended onto install directories." FORCE) ENDIF() # # # Setzen von CMAKE_BUILD_TYPE auf "Debug" falls nicht über Kommandozeile angegeben # IF(NOT DEFINED CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) ENDIF() ADD_DEFINITIONS(-DEXPORT_BDV_TOPIC_AS_JSON) SET(_ver "1.2.0") IF(DEFINED LTS_VERSION_MAJOR AND DEFINED LTS_VERSION_MINOR AND DEFINED LTS_VERSION_PATCH) SET(_ver "${LTS_VERSION_MAJOR}.${LTS_VERSION_MINOR}.${LTS_VERSION_PATCH}") ENDIF() PROJECT(LTS VERSION ${_ver}) MESSAGE(STATUS "LTS Version: ${LTS_VERSION_MAJOR}.${LTS_VERSION_MINOR}.${LTS_VERSION_PATCH}") SET(LTS_VERSION_DATE "01.01.2018" CACHE STRING "The date when this software was compiled") ADD_DEFINITIONS(-DLTS_VERSION_MAJOR=\"${LTS_VERSION_MAJOR}\") ADD_DEFINITIONS(-DLTS_VERSION_MINOR=\"${LTS_VERSION_MINOR}\") ADD_DEFINITIONS(-DLTS_VERSION_PATCH=\"${LTS_VERSION_PATCH}\") ADD_DEFINITIONS(-DLTS_VERSION_DATE=\"${LTS_VERSION_DATE}\") IF(JENKINS_BUILD_NUMBER) ADD_DEFINITIONS(-DJENKINS_BUILD_NUMBER=\"${JENKINS_BUILD_NUMBER}\") ELSE() ADD_DEFINITIONS(-DJENKINS_BUILD_NUMBER=\"unknown\") ENDIF() ADD_DEFINITIONS(-DAPP6C) SET(CMAKE_INCLUDE_CURRENT_DIR ON) include_directories(${CMAKE_SOURCE_DIR}/include) SET(CMAKE_CXX_STANDARD 20) SET(CMAKE_CXX_STANDARD_REQUIRED 14) SET(CMAKE_VISIBILITY_INLINES_HIDDEN ON) SET(CMAKE_CXX_VISIBILITY_PRESET hidden) SET(CMAKE_POSITION_INDEPENDENT_CODE ON) IF(CMAKE_VERSION VERSION_GREATER 3.15.9) OPTION(USE_UNITY_BUILDS "Use Unity builds to speed up compilation (cmake 3.16 or newer required!)" OFF) IF (USE_UNITY_BUILDS) SET(CMAKE_UNITY_BUILD ON) SET(CMAKE_UNITY_BUILD_BATCH_SIZE 40) ENDIF() ENDIF() IF(WIN32) SET(EXTERNAL_LIBRARY_DIR "C:/Development/Projekte/SituationMap/ExtFw" CACHE STRING "Library dir with all external dependencies") LIST(APPEND CMAKE_PREFIX_PATH "${EXTERNAL_LIBRARY_DIR}") LIST(APPEND CMAKE_PROGRAM_PATH "${EXTERNAL_LIBRARY_DIR}/bin;${EXTERNAL_LIBRARY_DIR}/dev-utils/bin") ENDIF() ENABLE_TESTING() INCLUDE(CTest) CONFIGURE_FILE(CTestCustom.ctest ${CMAKE_BINARY_DIR}/CTestCustom.ctest COPYONLY) CONFIGURE_FILE(lts-cc.conf ${CMAKE_BINARY_DIR}/lts-cc.conf.distrib COPYONLY) SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) IF(WIN32) SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) ELSE(WIN32) SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) ENDIF() # # Disallow in-source build # INCLUDE(MacroEnsureOutOfSourceBuild) macro_ensure_out_of_source_build("In-Source build nicht erlaubt!") # # Qt ist wichtig - zuerst suchen # SET(CMAKE_AUTOMOC TRUE) SET(CMAKE_AUTOUIC TRUE) SET(QT_USE_IMPORTED_TARGETS TRUE) # Prefer Qt6, fallback to Qt5. Create Qt5::*-aliases when Qt6 is found so existing CMakeLists continue to work. # Try to detect Qt6 with a minimal check and then create aliases/placeholders for components used across the project. # Prefer Qt6, fallback to Qt5. Create Qt5::* aliases only when the corresponding # Qt6:: component target exists. Avoid creating IMPORTED placeholder targets which # have no LOCATION and later inject 'NOTFOUND' into autogen timestamp deps. # Find minimal Qt6 Core first, then probe for other components (non-fatal). find_package(Qt6 6.8 COMPONENTS Core QUIET) if(Qt6_FOUND) message(STATUS "Found Qt6: ${Qt6Core_VERSION}") set(_qlist Concurrent Core Gui Location LinguistTools Network OpenGL PrintSupport Sensors Multimedia Sql Svg SerialPort Test UiTools WebSockets WebEngineCore WebEngineWidgets Widgets Xml XmlPatterns) foreach(_comp ${_qlist}) # Probe for each component (non-fatal). If found, create a Qt5:: alias. find_package(Qt6 COMPONENTS ${_comp} QUIET) if(TARGET "Qt6::${_comp}") add_library("Qt5::${_comp}" ALIAS "Qt6::${_comp}") endif() endforeach() # Map version variable for compatibility if available if(Qt6Core_VERSION) set(Qt5Core_VERSION ${Qt6Core_VERSION} CACHE INTERNAL "Compatibility Qt5Core_VERSION mapped from Qt6") endif() # Find rcc/lrelease programs as compatibility fallbacks find_program(_rcc_exec rcc-qt6 rcc) if(_rcc_exec) set(Qt5Core_RCC_EXECUTABLE ${_rcc_exec} CACHE INTERNAL "Compatibility rcc executable") endif() find_program(_lrelease_exec lrelease-qt6 lrelease) if(_lrelease_exec) set(Qt5_LRELEASE_EXECUTABLE ${_lrelease_exec} CACHE INTERNAL "Compatibility lrelease executable") if(TARGET Qt6::LinguistTools AND NOT TARGET Qt5::lrelease) add_executable(Qt5::lrelease IMPORTED) set_target_properties(Qt5::lrelease PROPERTIES IMPORTED_LOCATION ${Qt5_LRELEASE_EXECUTABLE}) endif() endif() else() FIND_PACKAGE(Qt5 5.9.0 COMPONENTS Concurrent Core Gui Location LinguistTools Network OpenGL PrintSupport Sensors Multimedia Sql Svg SerialPort Test UiTools WebSockets WebEngineCore WebEngineWidgets Widgets Xml XmlPatterns REQUIRED) MESSAGE(STATUS "Qt version is ${Qt5Core_VERSION}") endif() MESSAGE(STATUS "Qt version is ${Qt5Core_VERSION}") ADD_DEFINITIONS(-DQT_USE_QSTRINGBUILDER) ADD_DEFINITIONS(-DQT_NO_CAST_TO_ASCII) ADD_DEFINITIONS(-DQT_NO_CAST_FROM_ASCII) ADD_DEFINITIONS(-DQT_NO_URL_CAST_FROM_STRING) ADD_DEFINITIONS(-DQT_DEPRECATED_WARNINGS) ADD_DEFINITIONS(-DQT_NO_CAST_FROM_BYTEARRAY) #ADD_DEFINITIONS(-DQT_NO_DEPRECATED) ADD_DEFINITIONS(-DQT_DISABLE_DEPRECATED_BEFORE=0x050900) ADD_DEFINITIONS(-DQT_NO_FOREACH) IF(NOT WIN32) ADD_DEFINITIONS(-DQT_STRICT_ITERATORS) ENDIF() # # Ein paar NGL-spezifische Macros # INCLUDE(NGLMacros) # # Projektspezifische Einstellungen? # NGL_INSTALL(SV AAR WS FILES lts-cc.conf DESTINATION . RENAME lts-cc.conf.distrib) OPTION(ETS_MODE "Build for ETS (No B-Contamination etc)" OFF) IF(ETS_MODE) ADD_DEFINITIONS(-DETS_MODE) ENDIF() OPTION(TABLET_MODE "Build for TABLET " OFF) IF(TABLET_MODE) ADD_DEFINITIONS(-DTABLET_MODE) ENDIF() OPTION(GUEZ_MODE "Build for GUEZ " ON) IF(GUEZ_MODE) ADD_DEFINITIONS(-DGUEZ_MODE) ENDIF() # # Doxygen # INCLUDE(DoxygenMacros) IF(NOT DOXYGEN_OUT_DIR) SET(DOXYGEN_OUT_DIR ${CMAKE_BINARY_DIR}/doxygen) ENDIF() ADD_DOXYGEN_TARGET(TDS ${CMAKE_SOURCE_DIR}/doxygen/Doxyfile.in ${CMAKE_BINARY_DIR}/Doxyfile ${CMAKE_SOURCE_DIR}/doxygen/rheinmetall_defence_logo.jpg ${DOXYGEN_OUT_DIR}) IF(NOT DOXYGEN_OUT_DIR_2025) SET(DOXYGEN_OUT_DIR_2025 ${CMAKE_BINARY_DIR}/doxygen2025) ENDIF() ADD_DOXYGEN_TARGET(TDS2025 ${CMAKE_SOURCE_DIR}/doxygen/Doxyfile2025.in ${CMAKE_BINARY_DIR}/Doxyfile ${CMAKE_SOURCE_DIR}/doxygen/rheinmetall_defence_logo.jpg ${DOXYGEN_OUT_DIR_2025}) # # Compilerflags # IF(WIN32) ADD_DEFINITIONS(-DWIN32 -D_USE_MATH_DEFINES -D_WIN32_WINNT=0x0501 -DUNICODE) ELSE() ADD_DEFINITIONS(-D_LINUX) ENDIF() IF(MSVC) # C4250: 'class1' : inherits 'class2::member' via dominance # C4251: 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2' # C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow) # C4496: 'function': was declared deprecated # C4267: 'var' : conversion from 'size_t' to 'type', possible loss of data ADD_DEFINITIONS(-wd4250 -wd4251 -wd4290 -wd4496 -wd4267 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS /bigobj ) # komplette Programmoptimierung SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") # .pdb - Datei nicht gefunden SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /IGNORE:4099") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4099") # min() und max() nicht als Macros ADD_DEFINITIONS(-DNOMINMAX) SET(CMAKE_MSVCIDE_RUN_PATH "" CACHE PATH "Run path to use when starting programs from MSVC") ENDIF() IF(UNIX) # Alle Warnungen aktivieren SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra -Wmissing-include-dirs") # disable SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-overloaded-virtual") IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") IF(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.0) MESSAGE(FATAL_ERROR "gcc 4.8 or higher is required to build TDS: ${CMAKE_CXX_COMPILER_VERSION}") ENDIF() IF(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9.99) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-aliasing") # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-attribute=const") # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-final-types") # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-final-methods") # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override") ENDIF() ENDIF() ENDIF() OPTION(USE_IPO "Use interprocedural optimizations (cmake 3.9 or higher required)" OFF) IF (USE_IPO AND CMAKE_VERSION VERSION_GREATER 3.8.9) INCLUDE(CheckIPOSupported) check_ipo_supported(RESULT result OUTPUT output) IF(result) SET(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) ELSE() MESSAGE(WARNING "IPO is not supported: ${output}") ENDIF() ENDIF() OPTION(USE_ASAN "Use Address Sanitizer (current Clang only)" OFF) IF (USE_ASAN) IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") MESSAGE(STATUS "enable Address Sanitizer with Clang (is: ${CMAKE_CXX_COMPILER_ID})") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g -O1") ELSE() MESSAGE(STATUS "Address Sanitizer only supported with Clang (is: ${CMAKE_CXX_COMPILER_ID})") ENDIF() ENDIF(USE_ASAN) OPTION(USE_UBSAN "Use UndefinedBehavior Sanitizer (current Clang only)" OFF) IF (USE_UBSAN) IF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") ELSE() MESSAGE(STATUS "UndefinedBehavior only supported with Clang (is: ${CMAKE_CXX_COMPILER_ID})") ENDIF() ENDIF(USE_UBSAN) OPTION(BUILD_RPM "Build a RPM - install script in scripts subdir" OFF) IF(BUILD_RPM) ADD_SUBDIRECTORY(scripts) ELSE() ADD_DEFINITIONS(-DLTS_DEBUG) ENDIF() IF (NOT DEFINED _pname) IF(GUEZ_MODE) SET (_pname "guez") ADD_DEFINITIONS(-DPROJECTBUILD="guez") MESSAGE(STATUS "NO ProjectName givin! BUT GUEZ_MODE set PROJECTBUILD to guez") ELSE() MESSAGE(WARNING "NO ProjectName givin! Can't install coresponding lts-cc.conf! and PROJECTBUILD is empty") ADD_DEFINITIONS(-DPROJECTBUILD="") ENDIF() ELSE() MESSAGE(STATUS "ProjectName givin! PROJECTBUILD is ${_pname} ") ADD_DEFINITIONS(-DPROJECTBUILD=\"${_pname}\") ENDIF() # # DDS benoetigt zwingend RTI # FIND_PACKAGE(RTI QUIET) if(NOT RTI_FOUND) message(WARNING "RTI not found; creating placeholder RTI::* imported targets to allow configure without RTI installation") set(_rti_libs nddscore nddsc nddscpp2 rtiroutingservice) foreach(_lib ${_rti_libs}) if(NOT TARGET RTI::${_lib}) add_library(RTI::${_lib} UNKNOWN IMPORTED) set_property(TARGET RTI::${_lib} PROPERTY INTERFACE_INCLUDE_DIRECTORIES "") endif() endforeach() endif() # Respect MIGRATE_MODULE: when set to a relative path (e.g. "Lts/Common"), only add # the top-level subdirectories required to configure/build that module. This allows # per-module migration builds via -DMIGRATE_MODULE=. if(NOT DEFINED MIGRATE_MODULE) set(MIGRATE_MODULE "" CACHE STRING "If set, only add subdirectories covering this module (path relative to repo root)") endif() function(NGL_ADD_SUBDIR_GUARDED subdir) if(MIGRATE_MODULE STREQUAL "") add_subdirectory(${subdir}) else() # normalize to forward slashes string(REPLACE "\\" "/" _mig "${MIGRATE_MODULE}") string(REPLACE "\\" "/" _sub "${subdir}") if(_mig MATCHES "^${_sub}(/|$)" OR _sub MATCHES "^${_mig}(/|$)") message(STATUS "Including subdir ${subdir} because MIGRATE_MODULE=${MIGRATE_MODULE}") add_subdirectory(${subdir}) else() message(STATUS "Skipping subdir ${subdir} because MIGRATE_MODULE=${MIGRATE_MODULE}") endif() endif() endfunction() # Add only guarded subdirectories NGL_ADD_SUBDIR_GUARDED(TetraIF) NGL_ADD_SUBDIR_GUARDED(Z/src) NGL_ADD_SUBDIR_GUARDED(Lts) # at last, to make sure we get all targets in NGL_TS_TARGETS property NGL_ADD_SUBDIR_GUARDED(translations) #----------------------------------------------------------------------------------------------------- OPTION(BUILD_QAV "Build script for local QAV analysis" OFF) IF (BUILD_QAV) ADD_SUBDIRECTORY(qav) ENDIF()