Revision control
Copy as Markdown
# Copyright (C) 2019 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# framework style includes like #include <QtCore/qobject.h>
# Extract the location of the Qt frameworks by querying the imported location of QtRemoteObjects
# framework parent directory.
function(_qt_internal_get_remote_objects_framework_path out_var)
set(value "")
if(APPLE AND QT_FEATURE_framework)
get_target_property(ro_path ${QT_CMAKE_EXPORT_NAMESPACE}::RemoteObjects IMPORTED_LOCATION)
string(REGEX REPLACE "(.*)/Qt[^/]+\\.framework.*" "\\1" ro_fw_path "${ro_path}")
if(ro_fw_path)
set(value "${ro_fw_path}")
endif()
endif()
set(${out_var} "${value}" PARENT_SCOPE)
endfunction()
function(_qt_internal_get_remote_objects_framework_path_moc_options out_var)
_qt_internal_get_remote_objects_framework_path(ro_fw_path)
if(ro_fw_path)
set(${out_var} "OPTIONS" "-F${ro_fw_path}" PARENT_SCOPE)
else()
set(${out_var} "" PARENT_SCOPE)
endif()
endfunction()
function(_qt_internal_add_repc_files type target)
set(options)
set(oneValueArgs)
set(multiValueArgs SOURCES)
cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(outfiles)
if(QT_REPC_DEBUG_MODE)
set(debug "-d")
else()
set(debug "")
endif()
set(repc_incpath) ########### TODO
_qt_internal_get_remote_objects_framework_path_moc_options(extra_moc_options)
_qt_internal_get_tool_wrapper_script_path(tool_wrapper)
set(repc_command
COMMAND
"${tool_wrapper}"
"$<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::repc>"
)
foreach(it ${ARGS_SOURCES})
get_filename_component(outfilename ${it} NAME_WE)
get_filename_component(extension ${it} EXT)
if ("${extension}" STREQUAL ".h" OR "${extension}" STREQUAL ".hpp")
# This calls moc on an existing header file to extract metatypes json information
# which is then passed to the tool to generate another header.
qt6_wrap_cpp(qtro_moc_files "${it}"
__QT_INTERNAL_OUTPUT_MOC_JSON_FILES json_list
TARGET "${target}"
${extra_moc_options})
# Pass the generated metatypes .json file to the tool.
set(infile ${json_list})
set_source_files_properties(${qtro_moc_files} PROPERTIES HEADER_FILE_ONLY ON)
list(APPEND outfiles ${qtro_moc_files})
else()
# Pass the .rep file to the tool.
get_filename_component(infile ${it} ABSOLUTE)
endif()
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/rep_${outfilename}_${type}.h)
add_custom_command(
OUTPUT ${outfile}
${repc_command} ${debug} -o ${type} ${repc_incpath} ${infile} ${outfile}
MAIN_DEPENDENCY ${infile}
DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::repc
VERBATIM
)
list(APPEND outfiles ${outfile})
# The generated header file needs to be manually moc'ed (without using AUTOMOC) and then
# added as source to compile into the target.
qt6_wrap_cpp(qtro_moc_files "${outfile}" TARGET "${target}" ${extra_moc_options})
list(APPEND outfiles ${qtro_moc_files})
endforeach()
_qt_internal_set_source_file_generated(
SOURCES ${outfiles}
SKIP_AUTOGEN
)
target_sources(${target} PRIVATE ${outfiles})
endfunction()
# Add .rep source files to a target to generate source header files
function(qt6_add_repc_sources target)
list(POP_FRONT ARGV)
_qt_internal_add_repc_files(source ${target} SOURCES ${ARGV})
endfunction()
# Add .rep source files to a target to generate replica header files
function(qt6_add_repc_replicas target)
list(POP_FRONT ARGV)
_qt_internal_add_repc_files(replica ${target} SOURCES ${ARGV})
endfunction()
# Add .rep source files to a target to generate combined (source and replica) header files
function(qt6_add_repc_merged target)
list(POP_FRONT ARGV)
_qt_internal_add_repc_files(merged ${target} SOURCES ${ARGV})
endfunction()
# Create .rep interface file from QObject header
function(qt6_reps_from_headers target)
list(POP_FRONT ARGV)
_qt_internal_get_remote_objects_framework_path_moc_options(extra_moc_options)
_qt_internal_get_tool_wrapper_script_path(tool_wrapper)
set(repc_command
COMMAND
"${tool_wrapper}"
"$<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::repc>"
)
foreach(it ${ARGV})
get_filename_component(outfilename ${it} NAME_WE)
get_source_file_property(skip_automoc "${it}" SKIP_AUTOMOC)
# This calls moc on an existing header file to extract metatypes json information
# which is then passed to the tool to generate a .rep file.
qt6_wrap_cpp(qtro_moc_files "${it}"
__QT_INTERNAL_OUTPUT_MOC_JSON_FILES json_list
TARGET "${target}"
${extra_moc_options})
# The moc output is only used for the json file and is not compiled, so let AUTOMOC
# still handle the header for the target that contains the class.
if(NOT skip_automoc)
set_source_files_properties("${it}" PROPERTIES SKIP_AUTOMOC OFF)
endif()
set(infile ${json_list})
set_source_files_properties(${qtro_moc_files} PROPERTIES HEADER_FILE_ONLY ON)
list(APPEND outfiles ${qtro_moc_files})
set(outfile ${CMAKE_CURRENT_BINARY_DIR}/${outfilename}.rep)
add_custom_command(OUTPUT ${outfile}
${repc_command} -o rep ${infile} ${outfile}
MAIN_DEPENDENCY ${infile}
DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::repc
VERBATIM)
list(APPEND outfiles ${outfile})
endforeach()
target_sources(${target} PRIVATE ${outfiles})
endfunction()
if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS)
function(qt_add_repc_sources)
if(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
qt6_add_repc_sources(${ARGN})
else()
message(FATAL_ERROR "qt_add_repc_sources() is only available in Qt 6. "
"Please check the repc documentation for alternatives.")
endif()
endfunction()
function(qt_add_repc_replicas)
if(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
qt6_add_repc_replicas(${ARGN})
else()
message(FATAL_ERROR "qt_add_repc_replicas() is only available in Qt 6. "
"Please check the repc documentation for alternatives.")
endif()
endfunction()
function(qt_add_repc_merged)
if(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
qt6_add_repc_merged(${ARGN})
else()
message(FATAL_ERROR "qt_add_repc_merged() is only available in Qt 6. "
"Please check the repc documentation for alternatives.")
endif()
endfunction()
function(qt_reps_from_headers)
if(QT_DEFAULT_MAJOR_VERSION EQUAL 6)
qt6_reps_from_headers(${ARGN})
else()
message(FATAL_ERROR "qt_reps_from_headers() is only available in Qt 6. "
"Please check the repc documentation for alternatives.")
endif()
endfunction()
endif()