summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2019-03-07 11:06:23 +0100
committerTobias Hunger <tobias.hunger@qt.io>2019-03-11 14:52:09 +0000
commit4b105d77c24fb09fc65f1b1e622a47c69dabccaf (patch)
treee9f10c344b3273f74a736eb6fc8407aec37924a5
parentaf8413af152212a7513b6fa71259ec58a6e7868f (diff)
CMake: pro2cmake.py: Remove .qrc files!
Remove qrc files from CMake. Use add_qt_resource function instead. Change-Id: I64cdbd9498f97d23cd8e03f34ab5ae4a52dba5af Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
-rwxr-xr-xutil/cmake/pro2cmake.py107
1 files changed, 91 insertions, 16 deletions
diff --git a/util/cmake/pro2cmake.py b/util/cmake/pro2cmake.py
index 7c00afad1c..7abb8f5a1c 100755
--- a/util/cmake/pro2cmake.py
+++ b/util/cmake/pro2cmake.py
@@ -32,6 +32,7 @@ from __future__ import annotations
from argparse import ArgumentParser
import copy
+import xml.etree.ElementTree as ET
from itertools import chain
import os.path
import re
@@ -72,6 +73,61 @@ def _parse_commandline():
return parser.parse_args()
+def process_qrc_file(target: str, filepath: str, base_dir: str = '') -> str:
+ assert(target)
+ resource_name = os.path.splitext(os.path.basename(filepath))[0]
+ base_dir = os.path.join('' if base_dir == '.' else base_dir, os.path.dirname(filepath))
+
+ tree = ET.parse(filepath)
+ root = tree.getroot()
+ assert(root.tag == 'RCC')
+
+ output = ''
+
+ resource_count = 0
+ for resource in root:
+ assert(resource.tag == 'qresource')
+ lang = resource.get('lang', '')
+ prefix = resource.get('prefix', '')
+
+ full_resource_name = resource_name + (str(resource_count) if resource_count > 0 else '')
+
+ files: Dict[str, str] = {}
+ for file in resource:
+ path = file.text
+ assert path
+
+ # Get alias:
+ alias = file.get('alias', '')
+ files[path] = alias
+
+ sorted_files = sorted(files.keys())
+
+ assert(sorted_files)
+
+ for source in sorted_files:
+ alias = files[source]
+ if alias:
+ full_source = os.path.join(base_dir, source)
+ output += 'set_source_files_properties("{}"\n' \
+ ' PROPERTIES alias "{}")\n'.format(full_source, alias)
+
+ params = ''
+ if lang:
+ params += ' LANG "{}"'.format(lang)
+ if prefix:
+ params += ' PREFIX "{}"'.format(prefix)
+ if base_dir:
+ params += ' BASE "{}"'.format(base_dir)
+ output += 'add_qt_resource({} "{}"{} FILES\n {})\n'.format(target, full_resource_name,
+ params,
+ '\n '.join(sorted_files))
+
+ resource_count += 1
+
+ return output
+
+
def fixup_linecontinuation(contents: str) -> str:
contents = re.sub(r'([^\t ])\\[ \t]*\n', '\\1 \\\n', contents)
contents = re.sub(r'\\[ \t]*\n', '\\\n', contents)
@@ -778,28 +834,19 @@ def write_sources_section(cm_fh: typing.IO[str], scope: Scope, *,
ind = spaces(indent)
scope.reset_visited_keys()
+ # mark RESOURCES as visited:
+ scope.get('RESOURCES', '')
+
plugin_type = scope.get('PLUGIN_TYPE')
if plugin_type:
cm_fh.write('{} TYPE {}\n'.format(ind, plugin_type[0]))
+ vpath = scope.expand('VPATH')
+
sources = scope.expand('SOURCES') + scope.expand('HEADERS') \
+ scope.expand('OBJECTIVE_SOURCES') + scope.expand('NO_PCH_SOURCES') \
+ scope.expand('FORMS')
- resources = scope.expand('RESOURCES')
- if resources:
- qrc_only = True
- for r in resources:
- if not r.endswith('.qrc'):
- qrc_only = False
- break
-
- if not qrc_only:
- print(' XXXX Ignoring non-QRC file resources.')
- else:
- sources += resources
-
- vpath = scope.expand('VPATH')
sources = [map_source_to_cmake(s, scope.basedir, vpath) for s in sources]
if sources:
@@ -1078,6 +1125,31 @@ def map_to_cmake_condition(condition: str) -> str:
return condition
+def write_resources(cm_fh: typing.IO[str], target: str, scope: Scope, indent: int = 0):
+ vpath = scope.expand('VPATH')
+
+ # Handle QRC files by turning them into add_qt_resource:
+ resources = scope.expand('RESOURCES')
+ qrc_output = ''
+ if resources:
+ qrc_only = True
+ for r in resources:
+ if r.endswith('.qrc'):
+ qrc_output += process_qrc_file(target,
+ map_source_to_cmake(r, scope.basedir, vpath),
+ scope.basedir)
+ else:
+ qrc_only = False
+
+ if not qrc_only:
+ print(' XXXX Ignoring non-QRC file resources.')
+
+ if qrc_output:
+ cm_fh.write('\n# Resources:\n')
+ for line in qrc_output.split('\n'):
+ cm_fh.write(' ' * indent + line + '\n')
+
+
def write_extend_target(cm_fh: typing.IO[str], target: str,
scope: Scope, indent: int = 0):
extend_qt_io_string = io.StringIO()
@@ -1106,6 +1178,8 @@ def write_extend_target(cm_fh: typing.IO[str], target: str,
cm_fh.write(extend_scope)
+ write_resources(cm_fh, target, scope, indent)
+
def flatten_scopes(scope: Scope) -> typing.List[Scope]:
result = [scope] # type: typing.List[Scope]
@@ -1137,8 +1211,7 @@ def merge_scopes(scopes: typing.List[Scope]) -> typing.List[Scope]:
def write_main_part(cm_fh: typing.IO[str], name: str, typename: str,
cmake_function: str, scope: Scope, *,
extra_lines: typing.List[str] = [],
- indent: int = 0,
- **kwargs: typing.Any):
+ indent: int = 0, **kwargs: typing.Any):
# Evaluate total condition of all scopes:
recursive_evaluate_scope(scope)
@@ -1168,6 +1241,8 @@ def write_main_part(cm_fh: typing.IO[str], name: str, typename: str,
# Footer:
cm_fh.write('{})\n'.format(spaces(indent)))
+ write_resources(cm_fh, name, scope, indent)
+
# Scopes:
if len(scopes) == 1:
return