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 <hausmann@gmail.com>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Joerg Bornemann 2020-06-16 10:39:01 +02:00
parent bd2a14ff98
commit 4ab5432081
3 changed files with 36 additions and 2 deletions

View File

@ -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 = $<TARGET_FILE_NAME:${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-$<CONFIG>" ${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 $<TARGET_OBJECTS:$<TARGET_NAME:${out_target}>>)
endif()
set_property(TARGET ${target} APPEND PROPERTY QT_RCC_OBJECTS "${rcc_object_file_path}")
endforeach()
endif()
endfunction()

View File

@ -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")

View File

@ -1042,6 +1042,7 @@ function(__qt_propagate_generated_resource target resource_name generated_source
if(type STREQUAL STATIC_LIBRARY)
set(resource_target "${target}_resources_${resourceName}")
add_library("${resource_target}" OBJECT "${generated_source_code}")
set_property(TARGET ${resource_target} APPEND PROPERTY QT_RESOURCE_NAME ${resourceName})
# Use TARGET_NAME genex to map to the correct prefixed target name when it is exported
# via qt_install(EXPORT), so that the consumers of the target can find the object library