Files
qt6-migration-pipeline/external/rti_connext_dds-7.7.0/resource/cmake/ConnextDdsAddExample.cmake
torstenandCopilot 342ffd3e5c Update submodule to latest BUILD_RTI fixes
- HandlerMinelayerData: BUILD_RTI Guards für RTI-Abhängigkeiten
- svcTabCommon: Export-Header-Fix via Fallback-Target
- TrainingAreaBase: Stub-Header für BUILD_RTI=OFF
- ddsfts: Include-Pfad und Dependency-Fixes
- BUILD_RTI=OFF Compilation vollständig unterstützt

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0JNZA586SACX1PRZ2DJAE5S
2026-08-21 19:30:20 +02:00

566 lines
16 KiB
CMake

# (c) 2017 Copyright, Real-Time Innovations, Inc. All rights reserved.
# No duplications, whole or partial, manual or electronic, may be made
# without express written permission. Any such copies, or revisions thereof,
# must display this notice unaltered.
# This code contains trade secrets of Real-Time Innovations, Inc.
#[[.rst:
.. connextdds_add_example:
ConnextDdsAddExample
--------------------
Function to build the examples.
::
connextdds_add_example(
IDL name
LANG language
[PREFIX prefix]
[SUB_NAME sub_name]
[PUB_NAME pub_name]
[DISABLE_SUBSCRIBER]
[NO_REQUIRE_QOS]
[DEPENDENCIES ...]
[CODEGEN_ARGS ...]
)
Add a new example to be built. This method will call Codegen, create the
CMake targets and set the dependencies.
``IDL`` (required):
Name of the IDL file (without extension).
``LANG`` (required):
Example language. Valid values are ``C``, ``C++``, ``C++98``, ``C++03`` and
``C++11``.
``PREFIX``:
Prefix name for the targets. If not present, the folder of the example name
will be used as prefix.
``SUB_NAME``:
Suffix for the subscriber application. If not present it's "subscriber".
``PUB_NAME``:
Suffix for the publisher application. If not present it's "publisher".
``DISABLE_SUBSCRIBER``:
Disable the subscriber build. The target for the subcriber will not be
created.
``NO_REQUIRE_QOS``:
If present, the function will copy the USER_QOS_PROFILES.xml file from the
source directory to the binary directory.
``DEPENDENCIES``:
Other target dependencies.
``CODEGEN_ARGS``:
Extra arguments for Codegen.
Output targets:
``<prefix>_publisher_<lang>``
Target for the publisher application.
``<prefix>_subscriber_<lang>``
Target for the subscriber application.
``<prefix>_<lang>_sources``
Target to call Codegen to generate the source files for the types and the
publisher and the subscriber (if they were generated).
``<prefix>_<lang>_obj``
Target for the object library with all the objects created with the source
code for the types.
``<prefix>_<lang>_qos``
Target to copy the USER_QOS_PROFILES.xml (if exists).
connextdds_call_codegen
--------------------
Function to generate the source code from codegen.
::
connextdds_call_codegen(
(IDL name | TYPE_FILE type_file_path)
LANG language
[PREFIX prefix]
[CODEGEN_ARGS ...]
)
Add a new example to be built. This method will call Codegen, create the
CMake targets and set the dependencies.
``IDL`` or ``TYPE_FILE`` (required):
One of the legacy ``IDL`` or ``TYPE_FILE`` must be provided. The IDL
argument expects the an IDL file name without extension. The new
``TYPE_FILE`` is to the type file path (could be IDL, XML, ...).
``LANG`` (required):
Example language. Valid values are ``C``, ``C++``, ``C++03`` and ``C++11``.
``PREFIX``:
Prefix name for the targets. If not present, the folder of the example name
will be used as prefix.
``CODEGEN_ARGS``:
Extra arguments for Codegen.
connextdds_copy_qos_profile
---------------------------
Function to copy the USER_QOS_PROFILES.xml file.
::
connextdds_copy_qos_profile(
TARGET_PREFIX prefix
DEPENDANT_TARGET dependant_target
[FILENAME qos_filename]
)
Copy the QoS profile file. It will create the ``<prefix>_<lang>_qos``
target. It will make the given target dependant of the target for the QoS.
``TARGET_PREFIX (required)``:
Prefix name for the target.
``DEPENDANT_TARGET``:
This target will depends of the created QoS target. So, when the dependant
target is build, the QoS file will be copied.
``FILENAME``:
The filename of the QoS file to be copied. If not specified the default
name USER_QOS_PROFILES.xml will be used.
connextdds_add_application
--------------------------
Function to build an example.
::
connextdds_add_application(
TARGET target
LANG language
SOURCES ...
[PREFIX prefix]
[OUTPUT_NAME output_name]
[QOS_FILENAME]
[NO_REQUIRE_QOS]
[DEPENDENCIES ...]
)
This method will create the executables from chosen sources.
``TARGET`` (required):
Name of the target for the application.
``LANG`` (required):
Example language. Valid values are ``C``, ``C++``, ``C++03`` and ``C++11``.
``PREFIX``:
Prefix name for the targets. If not present, the folder of the example name
will be used as prefix.
``OUTPUT_NAME``:
Output name for the application. If not present, the target name will be
used.
``QOS_FILENAME``:
The filename of the desired QOS file. If not specified USER_QOS_PROFILES.xml
is used.
``NO_REQUIRE_QOS``:
If present, the QoS file will not be copied to the binary dir.
``DEPENDENCIES``:
Other libraries to link.
#]]
include_guard(DIRECTORY)
# Find the RTI Connext DDS libraries
if(NOT RTIConnextDDS_FOUND)
find_package(RTIConnextDDS
"6.1.0"
REQUIRED
COMPONENTS
core
)
endif()
include(CMakeParseArguments)
include(ConnextDdsArgumentChecks)
include(ConnextDdsCodegen)
function(connextdds_add_example)
set(optional_args DISABLE_SUBSCRIBER NO_REQUIRE_QOS)
set(single_value_args IDL LANG PREFIX SUB_NAME PUB_NAME)
set(multi_value_args CODEGEN_ARGS DEPENDENCIES)
cmake_parse_arguments(_CONNEXT
"${optional_args}"
"${single_value_args}"
"${multi_value_args}"
${ARGN}
)
connextdds_check_required_arguments(
_CONNEXT_IDL
_CONNEXT_LANG
)
# First, we call Codegen to generate the header and source files from the
# IDL
if(_CONNEXT_CODEGEN_ARGS)
set(codegen_args CODEGEN_ARGS ${_CONNEXT_CODEGEN_ARGS})
else()
set(codegen_args)
endif()
if(_CONNEXT_PREFIX)
set(prefix "${_CONNEXT_PREFIX}")
else()
# If no prefix was given, the name of the example folder name is used
# as prefix
get_filename_component(
folder_name
"${CMAKE_CURRENT_SOURCE_DIR}"
DIRECTORY)
get_filename_component(
folder_name
"${folder_name}"
NAME)
set(prefix "${folder_name}")
endif()
set(sub_name "subscriber")
if (_CONNEXT_SUB_NAME)
set(sub_name "${_CONNEXT_SUB_NAME}")
endif()
set(pub_name "publisher")
if (_CONNEXT_PUB_NAME)
set(pub_name "${_CONNEXT_PUB_NAME}")
endif()
# Generate the sources for the types
connextdds_call_codegen(
IDL "${_CONNEXT_IDL}"
LANG "${_CONNEXT_LANG}"
PREFIX "${prefix}"
${codegen_args}
)
# Copy the USER_QOS_PROFILES.xml file if required
if(_CONNEXT_NO_REQUIRE_QOS)
set(no_require_qos NO_REQUIRE_QOS)
else()
set(no_require_qos)
endif()
# If the GENERATE_EXAMPLE option was provided, Codegen will generate the
# source code for the publisher and the subscriber applications
# If we don't provide that parameter, we will use the source code provided
# in the repository for the publisher and the subscriber
connextdds_sanitize_language(LANG ${_CONNEXT_LANG} VAR lang_var)
if(GENERATE_EXAMPLE IN_LIST _CONNEXT_CODEGEN_ARGS)
set(publisher_src ${${_CONNEXT_IDL}_${lang_var}_PUBLISHER_SOURCE})
set(subscriber_src ${${_CONNEXT_IDL}_${lang_var}_SUBSCRIBER_SOURCE})
else()
set(ex "c")
if("${_CONNEXT_LANG}" STREQUAL "C++"
OR "${_CONNEXT_LANG}" STREQUAL "C++98"
OR "${_CONNEXT_LANG}" STREQUAL "C++03"
OR "${_CONNEXT_LANG}" STREQUAL "C++11"
)
set(ex "cxx")
endif()
set(publisher_src
"${CMAKE_CURRENT_SOURCE_DIR}/${_CONNEXT_IDL}_${pub_name}.${ex}"
)
set(subscriber_src
"${CMAKE_CURRENT_SOURCE_DIR}/${_CONNEXT_IDL}_${sub_name}.${ex}"
)
endif()
# Add the target for the publisher application
connextdds_add_application(
TARGET "publisher"
LANG ${_CONNEXT_LANG}
SOURCES ${publisher_src}
PREFIX ${prefix}
OUTPUT_NAME "${_CONNEXT_IDL}_${pub_name}"
${no_require_qos}
SOURCES
$<TARGET_OBJECTS:${prefix}_${lang_var}_obj>
"${publisher_src}"
DEPENDENCIES
${_CONNEXT_DEPENDENCIES}
)
if(NOT _CONNEXT_DISABLE_SUBSCRIBER)
# Add the target for the subscriber application
connextdds_add_application(
TARGET "subscriber"
LANG ${_CONNEXT_LANG}
SOURCES ${subscriber_src}
PREFIX ${prefix}
OUTPUT_NAME "${_CONNEXT_IDL}_${sub_name}"
${no_require_qos}
SOURCES
$<TARGET_OBJECTS:${prefix}_${lang_var}_obj>
"${subscriber_src}"
DEPENDENCIES
${_CONNEXT_DEPENDENCIES}
)
endif()
endfunction()
function(connextdds_call_codegen)
set(optional_args)
set(single_value_args IDL TYPE_PATH LANG PREFIX)
set(multi_value_args CODEGEN_ARGS)
cmake_parse_arguments(_CONNEXT
"${optional_args}"
"${single_value_args}"
"${multi_value_args}"
${ARGN}
)
connextdds_check_required_arguments(
_CONNEXT_LANG
_CONNEXT_PREFIX
)
if(
(NOT DEFINED _CONNEXT_IDL AND NOT DEFINED _CONNEXT_TYPE_PATH)
OR (DEFINED _CONNEXT_IDL AND DEFINED _CONNEXT_TYPE_PATH)
)
message(
FATAL_ERROR "It is necessary to specify one (and only one) of IDL /"
" TYPE_PATH variables in the connextdds_call_codegen function"
)
endif()
set(_type_file_name "${_CONNEXT_IDL}")
set(_type_file_path "${CMAKE_CURRENT_SOURCE_DIR}/${_type_file_name}.idl")
if(_CONNEXT_TYPE_PATH)
get_filename_component(_type_file_name "${_CONNEXT_TYPE_PATH}" NAME_WE)
get_filename_component(_type_file_path "${_CONNEXT_TYPE_PATH}" REALPATH)
endif()
# Get the list of the source files to genrate and configure the command
# to cal Codegen
connextdds_rtiddsgen_run(
IDL_FILE
"${_type_file_path}"
OUTPUT_DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/src"
LANG ${_CONNEXT_LANG}
${_CONNEXT_CODEGEN_ARGS}
)
# Get the path to the generated publisher and subscriber source code
connextdds_sanitize_language(LANG ${_CONNEXT_LANG} VAR lang_var)
set(${_type_file_name}_${lang_var}_PUBLISHER_SOURCE
"${${_type_file_name}_${lang_var}_PUBLISHER_SOURCE}"
PARENT_SCOPE
)
set(${_type_file_name}_${lang_var}_SUBSCRIBER_SOURCE
"${${_type_file_name}_${lang_var}_SUBSCRIBER_SOURCE}"
PARENT_SCOPE
)
# This will help to ensure that all the files generated by codegen are
# created
add_custom_target(${_CONNEXT_PREFIX}_${lang_var}_sources
DEPENDS
${${_type_file_name}_${lang_var}_GENERATED_SOURCES}
)
# If we don't use a object library to generate our publisher and subsciber
# applications and we are building using more than one job, could happen
# the following situation:
# 1. The publisher and subscriber applications will be build in two
# different jobs (A and B)
# 2. The source code for the types is not generated
# 3. The job A will call Codegen
# 4. The job A starts to build the application
# 4. The job B calls Codegen
# 5. The build performer by the job A is broken because the job B is
# replacing code generated by the job A.
# Using the object library, we can depend of it and call the Codegen only
# one time.
set(obj_library ${_CONNEXT_PREFIX}_${lang_var}_obj)
add_library(${obj_library}
OBJECT
${${_type_file_name}_${lang_var}_SOURCES}
)
set(api "c")
set(c_standard C_STANDARD 90)
set(cxx_standard CXX_STANDARD 98)
if("${_CONNEXT_LANG}" STREQUAL "C++"
OR "${_CONNEXT_LANG}" STREQUAL "C++98"
)
set(api "cpp")
elseif("${_CONNEXT_LANG}" STREQUAL "C++03")
set(api "cpp2")
elseif("${_CONNEXT_LANG}" STREQUAL "C++11")
set(api "cpp2")
set(cxx_standard CXX_STANDARD 11)
endif()
target_compile_definitions(
${obj_library}
PRIVATE
$<TARGET_PROPERTY:RTIConnextDDS::${api}_api,INTERFACE_COMPILE_DEFINITIONS>)
target_include_directories(
${obj_library}
PRIVATE
$<TARGET_PROPERTY:RTIConnextDDS::${api}_api,INTERFACE_INCLUDE_DIRECTORIES>)
set_target_properties(
${obj_library}
PROPERTIES
${c_standard}
${cxx_standard}
)
add_dependencies(${obj_library}
${_CONNEXT_PREFIX}_${lang_var}_sources
)
endfunction()
function(connextdds_copy_qos_profile)
set(optional_args)
set(single_value_args TARGET_PREFIX DEPENDANT_TARGET FILENAME)
set(multi_value_args)
cmake_parse_arguments(_EXAMPLE_QOS
"${optional_args}"
"${single_value_args}"
"${multi_value_args}"
${ARGN}
)
if(_EXAMPLE_QOS_FILENAME)
set(user_qos_profile_name ${_EXAMPLE_QOS_FILENAME})
else()
set(user_qos_profile_name "USER_QOS_PROFILES.xml")
endif()
set(qos_file "${CMAKE_CURRENT_SOURCE_DIR}/${user_qos_profile_name}")
if(NOT EXISTS ${qos_file})
get_filename_component(user_qos_profile_directory "${qos_file}" DIRECTORY)
message(
FATAL_ERROR "The ${user_qos_profile_name} was not found in"
" ${user_qos_profile_directory}"
)
endif()
set(output_qos "${CMAKE_CURRENT_BINARY_DIR}/${user_qos_profile_name}")
set(target_qos "${_EXAMPLE_QOS_TARGET_PREFIX}qos")
if(NOT TARGET ${target_qos})
# We created a target and it depends of the output file
add_custom_target(${target_qos}
DEPENDS
${output_qos}
)
# Add the command to copy the USER_QOS_PROFILES.xml
add_custom_command(
OUTPUT
${output_qos}
COMMAND
${CMAKE_COMMAND} -E copy_if_different
${qos_file}
"${CMAKE_CURRENT_BINARY_DIR}"
COMMENT "Copying ${user_qos_profile_name}"
DEPENDS
${qos_file}
VERBATIM
)
endif()
add_dependencies(${_EXAMPLE_QOS_DEPENDANT_TARGET}
${target_qos}
)
endfunction()
function(connextdds_add_application)
set(optional_args NO_REQUIRE_QOS)
set(single_value_args TARGET LANG PREFIX OUTPUT_NAME QOS_FILENAME)
set(multi_value_args SOURCES DEPENDENCIES)
cmake_parse_arguments(_CONNEXT
"${optional_args}"
"${single_value_args}"
"${multi_value_args}"
${ARGN}
)
connextdds_check_required_arguments(
_CONNEXT_TARGET
_CONNEXT_LANG
_CONNEXT_SOURCES
)
set(api "c")
set(c_standard C_STANDARD 90)
set(cxx_standard CXX_STANDARD 98)
if("${_CONNEXT_LANG}" STREQUAL "C++"
OR "${_CONNEXT_LANG}" STREQUAL "C++98"
)
set(api "cpp")
elseif("${_CONNEXT_LANG}" STREQUAL "C++03")
set(api "cpp2")
elseif("${_CONNEXT_LANG}" STREQUAL "C++11")
set(api "cpp2")
set(cxx_standard CXX_STANDARD 11)
endif()
if(_CONNEXT_PREFIX)
set(target_name "${_CONNEXT_PREFIX}_${_CONNEXT_TARGET}_${api}")
set(qos_target "${_CONNEXT_PREFIX}_qos_${api}")
set(qos_prefix "${_CONNEXT_PREFIX}_${api}")
else()
set(target_name "${_CONNEXT_TARGET}_${api}")
set(qos_target "qos_${api}")
set(qos_prefix "${api}")
endif()
# Create the target
add_executable(${target_name} ${_CONNEXT_SOURCES})
# Link all the dependencies and the RTI libraries for the API language
target_link_libraries(${target_name}
PRIVATE
${_CONNEXT_DEPENDENCIES}
RTIConnextDDS::${api}_api
)
# Add the include directories
target_include_directories(${target_name}
PRIVATE
"${CMAKE_CURRENT_BINARY_DIR}/src"
)
# Set output name for the binary
set_target_properties(${target_name}
PROPERTIES
OUTPUT_NAME "${_CONNEXT_OUTPUT_NAME}"
${c_standard}
${cxx_standard}
)
if(NOT _CONNEXT_NO_REQUIRE_QOS)
if (_CONNEXT_QOS_FILENAME)
connextdds_copy_qos_profile(
TARGET_PREFIX "${qos_prefix}_"
DEPENDANT_TARGET "${target_name}"
FILENAME ${_CONNEXT_QOS_FILENAME})
else()
connextdds_copy_qos_profile(
TARGET_PREFIX "${qos_prefix}_"
DEPENDANT_TARGET "${target_name}")
endif()
endif()
endfunction()