From 4ab54320817ebbb465af343514d21139a654aed3 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 16 Jun 2020 10:39:01 +0200 Subject: CMake: Write object libs of Qt resources to .prl files Since commit e343affd634 we're creating object libraries for Qt resources in static libraries. Those must be reflected in the generated .prl files for static builds of Qt. In qt_add_resource, we now calculate the install locations of the object files of rcc-generated C++ files and save them in the target property QT_RCC_OBJECTS. This property is then passed to QtFinishPrlFile to write the object file paths to the .prl file. Change-Id: Ic383892d723d02fc91f712bc2dbcbc90babad074 Reviewed-by: Simon Hausmann Reviewed-by: Alexandru Croitor --- cmake/QtBuild.cmake | 30 +++++++++++++++++++++++++++++- cmake/QtFinishPrlFile.cmake | 7 ++++++- 2 files changed, 35 insertions(+), 2 deletions(-) (limited to 'cmake') diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index 3ab3e80e0d..036a291725 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -2918,6 +2918,15 @@ function(qt_generate_prl_file target install_dir) return() endif() + get_target_property(rcc_objects ${target} QT_RCC_OBJECTS) + if(rcc_objects) + if(QT_WILL_INSTALL) + list(TRANSFORM rcc_objects PREPEND "$$[QT_INSTALL_LIBS]/") + endif() + else() + unset(rcc_objects) + endif() + unset(prl_libs) qt_collect_libs(${target} prl_libs) @@ -2940,7 +2949,8 @@ function(qt_generate_prl_file target install_dir) file(GENERATE OUTPUT "${prl_file_name}" CONTENT - "QMAKE_PRL_BUILD_DIR = ${CMAKE_CURRENT_BINARY_DIR} + "RCC_OBJECTS = ${rcc_objects} +QMAKE_PRL_BUILD_DIR = ${CMAKE_CURRENT_BINARY_DIR} QMAKE_PRL_TARGET = $ QMAKE_PRL_CONFIG = ${prl_config} QMAKE_PRL_VERSION = ${PROJECT_VERSION} @@ -3483,6 +3493,24 @@ function(qt_add_resource target resourceName) EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" 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_path_join(rcc_object_file_path + "objects-$" ${out_target} .rcc "${object_file_name}") + else() + # In a non-prefix build we use the object file paths right away. + set(rcc_object_file_path $>) + endif() + set_property(TARGET ${target} APPEND PROPERTY QT_RCC_OBJECTS "${rcc_object_file_path}") + endforeach() endif() endfunction() diff --git a/cmake/QtFinishPrlFile.cmake b/cmake/QtFinishPrlFile.cmake index c7c913d4ae..4927761674 100644 --- a/cmake/QtFinishPrlFile.cmake +++ b/cmake/QtFinishPrlFile.cmake @@ -26,7 +26,9 @@ endfunction() file(STRINGS "${IN_FILE}" lines) set(content "") foreach(line ${lines}) - if(line MATCHES "^QMAKE_PRL_LIBS_FOR_CMAKE = (.*)") + if(line MATCHES "^RCC_OBJECTS = (.*)") + set(rcc_objects ${CMAKE_MATCH_1}) + elseif(line MATCHES "^QMAKE_PRL_LIBS_FOR_CMAKE = (.*)") unset(adjusted_libs) foreach(lib ${CMAKE_MATCH_1}) if("${lib}" STREQUAL "") @@ -47,6 +49,9 @@ foreach(line ${lines}) list(APPEND adjusted_libs "${lib}") endif() endforeach() + if(rcc_objects) + list(APPEND adjusted_libs ${rcc_objects}) + endif() list(JOIN adjusted_libs " " adjusted_libs_for_qmake) string(APPEND content "QMAKE_PRL_LIBS = ${adjusted_libs_for_qmake}\n") string(APPEND content "QMAKE_PRL_LIBS_FOR_CMAKE = ${adjusted_libs}\n") -- cgit v1.2.3