# # Copyright(c) 2006 to 2022 ZettaScale Technology and others # # This program and the accompanying materials are made available under the # terms of the Eclipse Public License v. 2.0 which is available at # http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License # v. 1.0 which is available at # http://www.eclipse.org/org/documents/edl-v10.php. # # SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause # include (GenerateExportHeader) add_library(ddsc) if(BUILD_TESTING OR EXPORT_ALL_SYMBOLS) set_property(TARGET ddsc PROPERTY WINDOWS_EXPORT_ALL_SYMBOLS TRUE) else() set_property(TARGET ddsc PROPERTY C_VISIBILITY_PRESET hidden) endif() if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") target_link_libraries(ddsc PRIVATE dbghelp) endif() if(ENABLE_TCP_TLS AND OPENSSL_FOUND) target_link_libraries(ddsc PRIVATE OpenSSL::SSL) if(CMAKE_GENERATOR MATCHES "Visual Studio") set_target_properties(ddsc PROPERTIES LINK_FLAGS "/ignore:4099") endif() endif() if(ENABLE_LTO) include(CheckIPOSupported) check_ipo_supported(RESULT ipo_supported OUTPUT error) if(ipo_supported) if(ANDROID AND "${CMAKE_ANDROID_ARCH_ABI}" STREQUAL "armeabi-v7a") # clang android LTO bug (only armv7 affected) # https://stackoverflow.com/questions/56238019/linker-error-when-enabling-link-time-optimization-in-ndk # Fixed in newer clang versions: https://reviews.llvm.org/D79919 # But fixed here to keep supported android api level as low as possible # Tested with android ndk v20.0.5594570 (android api 29) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -flto=full") else() set_property(TARGET ddsc PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE) set_property(TARGET ddsc PROPERTY INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL TRUE) #-flto and debugging info do not seem to go well together #set_property(TARGET ddsc PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) endif() endif() endif() # Support the OMG DDS Security within ddsc adds quite a bit of code. if(ENABLE_SECURITY) target_link_libraries(ddsc PRIVATE "$") target_include_directories( ddsc PUBLIC $>) endif() include(cdr/CMakeLists.txt) include(ddsi/CMakeLists.txt) include(ddsc/CMakeLists.txt) # The not-so-elegant inclusion of all configured plug-ins for static builds. At least it # keeps most of the dirty things in one place. if(NOT BUILD_SHARED_LIBS) get_property(plugin_list GLOBAL PROPERTY cdds_plugin_list) if(plugin_list) list(JOIN plugin_list "," plugin_commasep) target_compile_options(ddsc PRIVATE "-DPLUGINS=${plugin_commasep}") target_link_libraries(ddsc PRIVATE ${plugin_list}) foreach(plugin ${plugin_list}) set(propname ${plugin}_symbols) get_property(plugin_symbols GLOBAL PROPERTY ${propname}) list(JOIN plugin_symbols "," plugin_symbols_commasep) target_compile_options(ddsc PRIVATE "-DPLUGIN_SYMBOLS_${plugin}=${plugin_symbols_commasep}") endforeach() endif() if(ENABLE_SSL) target_link_libraries(ddsc PUBLIC security_openssl) endif() endif() add_coverage(ddsc) target_link_libraries(ddsc PRIVATE "$") target_compile_definitions( ddsc PUBLIC $>) target_include_directories( ddsc PUBLIC $>) # SOVERSION should increase on incompatible ABI change set_target_properties(ddsc PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) # define target property to indicate if Cyclone DDS is compiled with type library support define_property(TARGET PROPERTY TYPELIB_IS_AVAILABLE BRIEF_DOCS "Indicator whether type library is available with current Cyclone DDS build configuration." FULL_DOCS "Indicator whether type library is available with current Cyclone DDS build configuration." ) set_property( TARGET ddsc APPEND PROPERTY TYPELIB_IS_AVAILABLE "${ENABLE_TYPELIB}") set_property( TARGET ddsc APPEND PROPERTY EXPORT_PROPERTIES "TYPELIB_IS_AVAILABLE") # define target property to indicate if Cyclone DDS is compiled with type discovery define_property(TARGET PROPERTY TYPE_DISCOVERY_IS_AVAILABLE BRIEF_DOCS "Indicator whether type discovery is available with current Cyclone DDS build configuration." FULL_DOCS "Indicator whether type discovery is available with current Cyclone DDS build configuration." ) set_property( TARGET ddsc APPEND PROPERTY TYPE_DISCOVERY_IS_AVAILABLE "${ENABLE_TYPE_DISCOVERY}") set_property( TARGET ddsc APPEND PROPERTY EXPORT_PROPERTIES "TYPE_DISCOVERY_IS_AVAILABLE") # define target property to indicate if Cyclone DDS is compiled with topic discovery define_property(TARGET PROPERTY TOPIC_DISCOVERY_IS_AVAILABLE BRIEF_DOCS "Indicator whether topic discovery is available with current Cyclone DDS build configuration." FULL_DOCS "Indicator whether topic discovery is available with current Cyclone DDS build configuration." ) set_property( TARGET ddsc APPEND PROPERTY TOPIC_DISCOVERY_IS_AVAILABLE "${ENABLE_TOPIC_DISCOVERY}") set_property( TARGET ddsc APPEND PROPERTY EXPORT_PROPERTIES "TOPIC_DISCOVERY_IS_AVAILABLE") # define target property to indicate if Cyclone DDS is compiled with qos provider define_property(TARGET PROPERTY QOS_PROVIDER_IS_AVAILABLE BRIEF_DOCS "Indicator whether qos provider is available with current Cyclone DDS build configuration." FULL_DOCS "Indicator whether qos provider is available with current Cyclone DDS build configuration." ) set_property( TARGET ddsc APPEND PROPERTY QOS_PROVIDER_IS_AVAILABLE "${ENABLE_QOS_PROVIDER}") set_property( TARGET ddsc APPEND PROPERTY EXPORT_PROPERTIES "QOS_PROVIDER_IS_AVAILABLE") # Create a pseudo-target that other targets (i.e. examples, tests) can depend # on and can also be provided as import-target by a package-file when building # those targets outside the regular Cyclone build-tree (i.e. the installed tree) add_library(${PROJECT_NAME}::ddsc ALIAS ddsc) install( TARGETS ddsc EXPORT "${PROJECT_NAME}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT lib LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib ) if (INSTALL_PDB) install(FILES $ DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT dev OPTIONAL ) endif() add_subdirectory(xtests)