From 8630c5ac7ef9db033f96adbd5dec363f9f2796b9 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Mon, 12 Aug 2019 16:31:30 +0200 Subject: [PATCH] Add support for QtQuikCompiler retained resources Support translating the QTQUICK_COMPILER_RETAINED_RESOURCES variable. Fix missing PROPERTIES keyword for set_source_files_properties() commands. Apply source file properties to standalone source files as they appear in the project as it was possible for them to inherit values that were not meant for them. When creating resource lists, prefix them with the resource name to avoid collisions. Change-Id: I69ef85ea9414c0e7c07b1ebfb76d24bd878ce70f Reviewed-by: Qt CMake Build Bot Reviewed-by: Simon Hausmann --- cmake/QtBuild.cmake | 21 +++++++++++++++++++++ util/cmake/pro2cmake.py | 39 +++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index 78991df7202..8392ab46c79 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -2413,11 +2413,13 @@ function(qt_quick_compiler_process_resources target resource_name) set(qml_files) set(resource_files) + set(retained_files) # scan for qml files foreach(file IN LISTS arg_FILES) # check whether this resource should not be processed by the qt quick # compiler get_source_file_property(skip_compiler_check ${file} QT_SKIP_QUICKCOMPILER) + get_source_file_property(retain_compiler_check ${file} QT_RETAIN_QUICKCOMPILER) if (skip_compiler_check) list(APPEND resource_files ${file}) continue() @@ -2427,6 +2429,10 @@ function(qt_quick_compiler_process_resources target resource_name) OR ${file} MATCHES "\.mjs$" OR ${file} MATCHES "\.qml$") list(APPEND qml_files ${file}) + if (retain_compiler_check) + list(APPEND retained_files ${file}) + list(APPEND resource_files ${file}) + endif() else() list(APPEND resource_files ${file}) endif() @@ -2435,6 +2441,7 @@ function(qt_quick_compiler_process_resources target resource_name) message(WARNING "add_qt_resource: Qml files were detected but the qmlcachgen target is not defined. Consider adding QmlTools to your find_package command.") endif() + set(retained_resource_paths) if (TARGET ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen AND qml_files) # Enable qt quick compiler support set(qml_resource_file "${CMAKE_CURRENT_BINARY_DIR}/${resource_name}.qrc") @@ -2452,6 +2459,9 @@ function(qt_quick_compiler_process_resources target resource_name) else() set(file_resource_path "${arg_PREFIX}/${file_resource_path}") endif() + if (file IN_LIST retained_files) + list(APPEND retained_resource_paths ${file_resource_path}) + endif() file(TO_CMAKE_PATH ${file_resource_path} file_resource_path) list(APPEND file_resource_paths ${file_resource_path}) string(REGEX REPLACE "\.js$" "_js" compiled_file ${file_relative}) @@ -2481,11 +2491,22 @@ function(qt_quick_compiler_process_resources target resource_name) if (chained_resource_name) set(resource_name_arg "${resource_name_arg}=${chained_resource_name}") endif() + + if (retained_resource_paths) + set(retained_loader_list "${CMAKE_CURRENT_BINARY_DIR}/qmlcache/${resource_name}/retained_file_list.rsp") + file(GENERATE + OUTPUT ${retained_loader_list} + CONTENT "$" + ) + set(retained_args "--retain" "@${retained_loader_list}") + endif() + add_custom_command( OUTPUT ${qmlcache_loader_file} DEPENDS ${qmlcache_loader_list} COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen + ${retained_args} --resource-name "${resource_name_arg}" -o ${qmlcache_loader_file} "@${qmlcache_loader_list}" diff --git a/util/cmake/pro2cmake.py b/util/cmake/pro2cmake.py index 591bb84aa4c..b57a4beb1f1 100755 --- a/util/cmake/pro2cmake.py +++ b/util/cmake/pro2cmake.py @@ -115,7 +115,8 @@ def find_qmake_conf(project_file_path: str = '') -> typing.Optional[str]: return None -def process_qrc_file(target: str, filepath: str, base_dir: str = '', project_file_path: str = '', skip_qtquick_compiler: bool = False) -> str: +def process_qrc_file(target: str, filepath: str, base_dir: str = '', project_file_path: str = '', skip_qtquick_compiler: bool = False, + retain_qtquick_compiler: bool = False) -> str: assert(target) # Hack to handle QT_SOURCE_TREE. Assume currently that it's the same @@ -172,13 +173,14 @@ def process_qrc_file(target: str, filepath: str, base_dir: str = '', project_fil alias = path files[path] = alias - output += write_add_qt_resource_call(target, full_resource_name, prefix, base_dir, lang, files, skip_qtquick_compiler) + output += write_add_qt_resource_call(target, full_resource_name, prefix, base_dir, lang, files, skip_qtquick_compiler, retain_qtquick_compiler) resource_count += 1 return output -def write_add_qt_resource_call(target: str, resource_name: str, prefix: typing.Optional[str], base_dir: typing.Optional[str], lang: typing.Optional[str], files: typing.Dict[str, str], skip_qtquick_compiler: bool) -> str: +def write_add_qt_resource_call(target: str, resource_name: str, prefix: typing.Optional[str], base_dir: typing.Optional[str], + lang: typing.Optional[str], files: typing.Dict[str, str], skip_qtquick_compiler: bool, retain_qtquick_compiler: bool) -> str: output = '' sorted_files = sorted(files.keys()) @@ -195,13 +197,14 @@ def write_add_qt_resource_call(target: str, resource_name: str, prefix: typing.O # Quote file paths in case there are spaces. sorted_files = ['"{}"'.format(f) for f in sorted_files] + file_list = '\n '.join(sorted_files) + output += 'set({}_resource_files\n {}\n)\n\n'.format(resource_name, file_list) + file_list = "${{{}_resource_files}}".format(resource_name) if skip_qtquick_compiler: - file_list = '\n '.join(sorted_files) - output += 'set(resource_files\n {}\n)\n\n'.format(file_list) - file_list = "${resource_files}" - output += 'set_source_files_properties(${resource_files} QT_SKIP_QUICKCOMPILER 1)\n\n' - else: - file_list = '\n '.join(sorted_files) + output += 'set_source_files_properties(${{{}_resource_files}} PROPERTIES QT_SKIP_QUICKCOMPILER 1)\n\n'.format(resource_name) + + if retain_qtquick_compiler: + output += 'set_source_files_properties(${{{}_resource_files}} PROPERTIES QT_RETAIN_QUICKCOMPILER 1)\n\n'.format(resource_name) params = '' if lang: @@ -1688,13 +1691,16 @@ def write_resources(cm_fh: typing.IO[str], target: str, scope: Scope, indent: in # Handle QRC files by turning them into add_qt_resource: resources = scope.get_files('RESOURCES') qtquickcompiler_skipped = scope.get_files('QTQUICK_COMPILER_SKIPPED_RESOURCES') + qtquickcompiler_retained = scope.get_files('QTQUICK_COMPILER_RETAINED_RESOURCES') qrc_output = '' if resources: standalone_files: typing.List[str] = [] for r in resources: skip_qtquick_compiler = r in qtquickcompiler_skipped + retain_qtquick_compiler = r in qtquickcompiler_retained if r.endswith('.qrc'): - qrc_output += process_qrc_file(target, r, scope.basedir, scope.file_absolute_path, skip_qtquick_compiler) + qrc_output += process_qrc_file(target, r, scope.basedir, scope.file_absolute_path, + skip_qtquick_compiler, retain_qtquick_compiler) else: immediate_files = {f:"" for f in scope.get_files(r + ".files")} if immediate_files: @@ -1706,8 +1712,16 @@ def write_resources(cm_fh: typing.IO[str], target: str, scope: Scope, indent: in immediate_base = scope.get(r + ".base") immediate_lang = None immediate_name = "qmake_" + r - qrc_output += write_add_qt_resource_call(target, immediate_name, immediate_prefix, immediate_base, immediate_lang, immediate_files, skip_qtquick_compiler) + qrc_output += write_add_qt_resource_call(target, immediate_name, immediate_prefix, immediate_base, immediate_lang, + immediate_files, skip_qtquick_compiler, retain_qtquick_compiler) else: + # stadalone source file properties need to be set as they + # are parsed. + if skip_qtquick_compiler: + output += 'set_source_files_properties("{}" PROPERTIES QT_SKIP_QUICKCOMPILER 1)\n\n'.format(r) + + if retain_qtquick_compiler: + output += 'set_source_files_properties("{}" PROPERTIES QT_RETAIN_QUICKCOMPILER 1)\n\n'.format(r) standalone_files.append(r) if standalone_files: @@ -1717,7 +1731,8 @@ def write_resources(cm_fh: typing.IO[str], target: str, scope: Scope, indent: in lang = None files = {f:"" for f in standalone_files} skip_qtquick_compiler = False - qrc_output += write_add_qt_resource_call(target, name, prefix, base, lang, files, skip_qtquick_compiler) + qrc_output += write_add_qt_resource_call(target, name, prefix, base, lang, files, + skip_qtquick_compiler = False, retain_qtquick_compiler = False) if qrc_output: