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>
This commit is contained in:
Tobias Hunger 2019-03-07 11:06:23 +01:00
parent af8413af15
commit 4b105d77c2

View File

@ -32,6 +32,7 @@ from __future__ import annotations
from argparse import ArgumentParser from argparse import ArgumentParser
import copy import copy
import xml.etree.ElementTree as ET
from itertools import chain from itertools import chain
import os.path import os.path
import re import re
@ -72,6 +73,61 @@ def _parse_commandline():
return parser.parse_args() 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: def fixup_linecontinuation(contents: str) -> str:
contents = re.sub(r'([^\t ])\\[ \t]*\n', '\\1 \\\n', contents) contents = re.sub(r'([^\t ])\\[ \t]*\n', '\\1 \\\n', contents)
contents = re.sub(r'\\[ \t]*\n', '\\\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) ind = spaces(indent)
scope.reset_visited_keys() scope.reset_visited_keys()
# mark RESOURCES as visited:
scope.get('RESOURCES', '')
plugin_type = scope.get('PLUGIN_TYPE') plugin_type = scope.get('PLUGIN_TYPE')
if plugin_type: if plugin_type:
cm_fh.write('{} TYPE {}\n'.format(ind, plugin_type[0])) cm_fh.write('{} TYPE {}\n'.format(ind, plugin_type[0]))
vpath = scope.expand('VPATH')
sources = scope.expand('SOURCES') + scope.expand('HEADERS') \ sources = scope.expand('SOURCES') + scope.expand('HEADERS') \
+ scope.expand('OBJECTIVE_SOURCES') + scope.expand('NO_PCH_SOURCES') \ + scope.expand('OBJECTIVE_SOURCES') + scope.expand('NO_PCH_SOURCES') \
+ scope.expand('FORMS') + 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] sources = [map_source_to_cmake(s, scope.basedir, vpath) for s in sources]
if sources: if sources:
@ -1078,6 +1125,31 @@ def map_to_cmake_condition(condition: str) -> str:
return condition 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, def write_extend_target(cm_fh: typing.IO[str], target: str,
scope: Scope, indent: int = 0): scope: Scope, indent: int = 0):
extend_qt_io_string = io.StringIO() 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) cm_fh.write(extend_scope)
write_resources(cm_fh, target, scope, indent)
def flatten_scopes(scope: Scope) -> typing.List[Scope]: def flatten_scopes(scope: Scope) -> typing.List[Scope]:
result = [scope] # type: 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, def write_main_part(cm_fh: typing.IO[str], name: str, typename: str,
cmake_function: str, scope: Scope, *, cmake_function: str, scope: Scope, *,
extra_lines: typing.List[str] = [], extra_lines: typing.List[str] = [],
indent: int = 0, indent: int = 0, **kwargs: typing.Any):
**kwargs: typing.Any):
# Evaluate total condition of all scopes: # Evaluate total condition of all scopes:
recursive_evaluate_scope(scope) recursive_evaluate_scope(scope)
@ -1168,6 +1241,8 @@ def write_main_part(cm_fh: typing.IO[str], name: str, typename: str,
# Footer: # Footer:
cm_fh.write('{})\n'.format(spaces(indent))) cm_fh.write('{})\n'.format(spaces(indent)))
write_resources(cm_fh, name, scope, indent)
# Scopes: # Scopes:
if len(scopes) == 1: if len(scopes) == 1:
return return