# # 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.5.0) 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) SET(CMAKE_CXX_STANDARD 14) 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(QT_USE_IMPORTED_TARGETS TRUE) 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}") 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 REQUIRED) ADD_SUBDIRECTORY(TetraIF) ADD_SUBDIRECTORY(Z/src) ADD_SUBDIRECTORY(Lts) # at last, to make sure we get all targets in NGL_TS_TARGETS property ADD_SUBDIRECTORY(translations) #----------------------------------------------------------------------------------------------------- OPTION(BUILD_QAV "Build script for local QAV analysis" OFF) IF (BUILD_QAV) ADD_SUBDIRECTORY(qav) ENDIF()