diff options
Diffstat (limited to 'cmake/QtResourceHelpers.cmake')
-rw-r--r-- | cmake/QtResourceHelpers.cmake | 131 |
1 files changed, 108 insertions, 23 deletions
diff --git a/cmake/QtResourceHelpers.cmake b/cmake/QtResourceHelpers.cmake index 7274186301..2df1fed50f 100644 --- a/cmake/QtResourceHelpers.cmake +++ b/cmake/QtResourceHelpers.cmake @@ -1,4 +1,19 @@ -function(qt_add_resource target resourceName) +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +function(qt_internal_add_resource target resourceName) + if(NOT TARGET "${target}") + message(FATAL_ERROR "${target} is not a target.") + endif() + qt_internal_is_skipped_test(skipped ${target}) + if(skipped) + return() + endif() + qt_internal_is_in_test_batch(in_batch ${target}) + if(in_batch) + _qt_internal_test_batch_target_name(target) + endif() + # Don't try to add resources when cross compiling, and the target is actually a host target # (like a tool). qt_is_imported_target("${target}" is_imported) @@ -6,9 +21,13 @@ function(qt_add_resource target resourceName) return() endif() - qt_parse_all_arguments(arg "qt_add_resource" "" "PREFIX;LANG;BASE" "FILES" ${ARGN}) + cmake_parse_arguments(PARSE_ARGV 2 arg + "" + "PREFIX;LANG;BASE;OUTPUT_TARGETS" + "FILES") + _qt_internal_validate_all_args_are_parsed(arg) - QT6_PROCESS_RESOURCE(${target} ${resourceName} + _qt_internal_process_resource(${target} ${resourceName} PREFIX "${arg_PREFIX}" LANG "${arg_LANG}" BASE "${arg_BASE}" @@ -19,30 +38,96 @@ function(qt_add_resource target resourceName) if (out_targets) qt_install(TARGETS ${out_targets} EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" - DESTINATION ${INSTALL_LIBDIR} + DESTINATION "${INSTALL_LIBDIR}" ) - foreach(out_target ${out_targets}) - get_target_property(resource_name ${out_target} QT_RESOURCE_NAME) - if(NOT resource_name) - continue() - endif() - if(QT_WILL_INSTALL) - # Compute the install location of the rcc object file. - # This is the relative path below the install destination (install_prefix/lib). - # See CMake's computeInstallObjectDir function. - set(object_file_name "qrc_${resource_name}.cpp${CMAKE_CXX_OUTPUT_EXTENSION}") + qt_internal_add_targets_to_additional_targets_export_file( + TARGETS ${out_targets} + EXPORT_NAME_PREFIX "${INSTALL_CMAKE_NAMESPACE}${target}" + ) + + qt_internal_install_resource_pdb_files("${out_targets}") + qt_internal_record_rcc_object_files("${target}" "${out_targets}" + INSTALL_DIRECTORY "${INSTALL_LIBDIR}") + endif() + + if (arg_OUTPUT_TARGETS) + set(${arg_OUTPUT_TARGETS} "${out_targets}" PARENT_SCOPE) + endif() +endfunction() + +function(qt_internal_record_rcc_object_files target resource_targets) + set(args_optional "") + set(args_single INSTALL_DIRECTORY) + set(args_multi "") + + cmake_parse_arguments(arg + "${args_optional}" + "${args_single}" + "${args_multi}" + ${ARGN} + ) + + foreach(out_target ${resource_targets}) + get_target_property(resource_name ${out_target} _qt_resource_name) + if(NOT resource_name) + continue() + endif() + if(QT_WILL_INSTALL) + # Compute the install location of a resource object file in a prefix build. + # It's comprised of thee following path parts: + # + # part (1) INSTALL_DIRECTORY. + # A usual value is '${INSTALL_LIBDIR}/' for libraries + # and '${INSTALL_QMLDIR}/foo/bar/' for qml plugin resources. + # + # part (2) the value computed by CMake's computeInstallObjectDir comprised of an + # objects-<CONFIG> dir and the target name of the object library. + # Example: objects-$<CONFIG>/Gui_resources_qpdf + # + # part (3) path to the object file, relative to it's build directory. + # Example: .rcc/qrc_qpdf.cpp.o + # + # The final path is relative to CMAKE_INSTALL_PREFIX aka $qt_install_prefix. + # + # The relative path will be transformed into an absolute path when generating .prl + # files, by prepending $$[QT_INSTALL_PREFIX]/. + get_target_property(generated_cpp_file_relative_path + ${out_target} + _qt_resource_generated_cpp_relative_path) + + set(object_file_name "${generated_cpp_file_relative_path}${CMAKE_CXX_OUTPUT_EXTENSION}") + qt_path_join(rcc_object_file_path + "objects-$<CONFIG>" ${out_target} "${object_file_name}") + if(arg_INSTALL_DIRECTORY) qt_path_join(rcc_object_file_path - "objects-$<CONFIG>" ${out_target} .rcc "${object_file_name}") + "${arg_INSTALL_DIRECTORY}" "${rcc_object_file_path}") else() - # In a non-prefix build we use the object file paths right away. - set(rcc_object_file_path $<TARGET_OBJECTS:$<TARGET_NAME:${out_target}>>) + message(FATAL_ERROR "No install location given for object files to be installed" + " for the following resource target: '${out_target}'") endif() - set_property(TARGET ${target} APPEND PROPERTY QT_RCC_OBJECTS "${rcc_object_file_path}") + else() + # In a non-prefix build we use the object file paths right away. + set(rcc_object_file_path $<TARGET_OBJECTS:$<TARGET_NAME:${out_target}>>) + endif() + set_property(TARGET ${target} APPEND PROPERTY _qt_rcc_objects "${rcc_object_file_path}") - # Make sure that the target cpp files are compiled with the regular Qt internal compile - # flags, needed for building iOS apps with qmake where bitcode is involved. - target_link_libraries("${out_target}" PRIVATE Qt::PlatformModuleInternal) - endforeach() - endif() + qt_internal_link_internal_platform_for_object_library("${out_target}") + endforeach() +endfunction() + +function(qt_internal_install_resource_pdb_files objlib_targets) + if(NOT MSVC OR NOT QT_WILL_INSTALL) + return() + endif() + + foreach(target IN LISTS objlib_targets) + qt_internal_set_compile_pdb_names(${target}) + get_target_property(generated_cpp_file_relative_path + ${target} + _qt_resource_generated_cpp_relative_path) + get_filename_component(rel_obj_file_dir "${generated_cpp_file_relative_path}" DIRECTORY) + qt_internal_install_pdb_files(${target} + "${INSTALL_LIBDIR}/objects-$<CONFIG>/${target}/${rel_obj_file_dir}") + endforeach() endfunction() |