summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2020-11-25 17:54:53 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-11-30 22:19:40 +0000
commit62ee1c8504ec620f5e4b36b0d5db47382e13d1eb (patch)
tree9de2c02bbbab4de90c50cc2e6440c56ab55a4217 /cmake
parent1f443c36f2282510f01446ea0b76b820be2d4295 (diff)
CMake: Fix resource object file paths in prl files for prefix builds
Before this change, the prl files always assumed that resource object files are installed into $qt_prefix/lib when doing a prefix build. That was true for qt_internal_add_resource calls, but not for qt6_add_qml_module and qt6_target_qml_files. Change qt_internal_record_rcc_object_files to take a new required INSTALL_LOCATION argument. The argument takes a path relative to CMAKE_INSTALL_PREFIX. Modify __qt_propagate_generated_resource to save the relative path of the generated resource source file, which will be used in the computation of the final resource object file location. This is needed because the Qml resource functions place the source files in a different directory layout, e.g. .rcc vs .qmlcache Modify qt_generate_prl_file to prepend $$[QT_INSTALL_PREFIX]/ instead of $$[QT_INSTALL_LIBS]/ for the resource install paths. A follow up patch is done in qtdeclarative to pass the new INSTALL_LOCATION argument from the Qml CMake functions. Amends f9dcade5e795a631b9a2d93c855aa8198d58e24e Task-number: QTBUG-87702 Task-number: QTBUG-88425 Change-Id: Id17bb517b4cb5d00911bfd10a728ba4e0d44871b Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> (cherry picked from commit 54d0ca93bca78f8fd31b6761f078e7a96283f183) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'cmake')
-rw-r--r--cmake/QtPrlHelpers.cmake2
-rw-r--r--cmake/QtResourceHelpers.cmake52
2 files changed, 46 insertions, 8 deletions
diff --git a/cmake/QtPrlHelpers.cmake b/cmake/QtPrlHelpers.cmake
index 709dfb6edf..566d311e74 100644
--- a/cmake/QtPrlHelpers.cmake
+++ b/cmake/QtPrlHelpers.cmake
@@ -283,7 +283,7 @@ function(qt_generate_prl_file target install_dir)
endif()
if(rcc_objects AND QT_WILL_INSTALL)
- list(TRANSFORM rcc_objects PREPEND "$$[QT_INSTALL_LIBS]/")
+ list(TRANSFORM rcc_objects PREPEND "$$[QT_INSTALL_PREFIX]/")
endif()
# Generate a preliminary .prl file that contains absolute paths to all libraries
diff --git a/cmake/QtResourceHelpers.cmake b/cmake/QtResourceHelpers.cmake
index ff4f234306..9715873d9c 100644
--- a/cmake/QtResourceHelpers.cmake
+++ b/cmake/QtResourceHelpers.cmake
@@ -19,26 +19,64 @@ function(qt_internal_add_resource target resourceName)
if (out_targets)
qt_install(TARGETS ${out_targets}
EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets"
- DESTINATION ${INSTALL_LIBDIR}
+ DESTINATION "${INSTALL_LIBDIR}"
)
- qt_internal_record_rcc_object_files("${target}" "${out_targets}")
+ qt_internal_record_rcc_object_files("${target}" "${out_targets}"
+ INSTALL_LOCATION "${INSTALL_LIBDIR}")
endif()
endfunction()
function(qt_internal_record_rcc_object_files target resource_targets)
+ set(args_optional "")
+ set(args_single INSTALL_LOCATION)
+ 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 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}")
+ # Compute the install location of a resource object file in a prefix build.
+ # It's comprised of thee following path parts:
+ #
+ # part (1) INSTALL_LOCATION.
+ # 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} .rcc "${object_file_name}")
+ "objects-$<CONFIG>" ${out_target} "${object_file_name}")
+ if(arg_INSTALL_LOCATION)
+ qt_path_join(rcc_object_file_path
+ "${arg_INSTALL_LOCATION}" "${rcc_object_file_path}")
+ else()
+ message(FATAL_ERROR "No install location given for object files to be installed"
+ " for the following resource target: '${out_target}'")
+ endif()
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}>>)