From 096780070509eeaecd71c6bba72cd1974865e1f6 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 3 Apr 2021 20:57:40 +0300 Subject: [PATCH 01/13] Start refactoring the xcode backend by creating proper classes for pbx primitives. --- mesonbuild/backend/xcodebackend.py | 97 ++++++++++++++++++++++++++++-- 1 file changed, 92 insertions(+), 5 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index d87188e02..e44d08563 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -1,4 +1,4 @@ -# Copyright 2014-2016 The Meson development team +# Copyright 2014-2021 The Meson development team # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -23,6 +23,78 @@ import typing as T from ..mesonlib import MesonException from ..interpreter import Interpreter +INDENT = '\t' + +class PbxItem: + def __init__(self, value, comment = ''): + self.value = value + self.comment = comment + +class PbxArray: + def __init__(self): + self.items = [] + +class PbxComment: + def __init__(self, text): + assert('/*' not in text) + self.text = f'/* {text} */' + + def write(self, ofile, indent_level): + ofile.write(f'\n{self.text}\n') + +class PbxDictItem: + def __init__(self, key, value, comment = ''): + self.key = key + self.value = value + if comment: + if '/*' in comment: + self.comment = comment + else: + self.comment = f'/* {comment} */' + else: + self.comment = comment + +class PbxDict: + def __init__(self): + # This class is a bit weird, becaucse we want to write PBX dicts in + # defined order _and_ we want to write intermediate comments also in order. + self.keys = set() + self.items = [] + + def add_item(self, item): + key = item.key + assert(key not in self.keys) + self.keys.add(key) + self.items.append(item) + + def add_comment(self, comment): + self.items.append(comment) + + def write(self, ofile, indent_level): + ofile.write('{\n') + indent_level += 1 + for i in self.items: + if isinstance(i, PbxComment): + i.write(indent_level) + elif isinstance(i, PbxDictItem): + if isinstance(i.value, (str, int)): + ofile.write(indent_level*INDENT + f'{i.key} = {i.value} {i.comment};\n') + elif isinstance(i.value, PbxDict): + ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + i.value.write(ofile, indent_level) + else: + raise RuntimeError('missing code') + else: + print(i) + raise RuntimeError('missing code2') + + indent_level -= 1 + ofile.write(indent_level*INDENT + '}') + if indent_level == 0: + ofile.write('\n') + else: + ofile.write(';\n') + class XCodeBackend(backends.Backend): def __init__(self, build: T.Optional[build.Build], interpreter: T.Optional[Interpreter]): super().__init__(build, interpreter) @@ -56,6 +128,13 @@ class XCodeBackend(backends.Backend): self.test_id = self.gen_id() self.test_command_id = self.gen_id() self.test_buildconf_id = self.gen_id() + self.top_level_dict = PbxDict() + + def write_pbxfile(self, top_level_dict, ofilename): + with open(ofilename, 'w') as ofile: + ofile.write('// !$*UTF8*$!\n') + top_level_dict.write(ofile, 0) + assert(self.indent_level == 0) def gen_id(self): return str(uuid.uuid4()).upper().replace('-', '')[:24] @@ -97,7 +176,7 @@ class XCodeBackend(backends.Backend): os.makedirs(self.proj_dir, exist_ok=True) self.proj_file = os.path.join(self.proj_dir, 'project.pbxproj') with open(self.proj_file, 'w') as self.ofile: - self.generate_prefix() + self.generate_prefix(self.top_level_dict) self.generate_pbx_aggregate_target() self.generate_pbx_build_file() self.generate_pbx_build_style() @@ -112,7 +191,8 @@ class XCodeBackend(backends.Backend): self.generate_pbx_target_dependency() self.generate_xc_build_configuration() self.generate_xc_configurationList() - self.generate_suffix() + self.generate_suffix(self.top_level_dict) + self.write_pbxfile(self.top_level_dict, "temporary.pbxproj") def get_xcodetype(self, fname): xcodetype = self.xcodetypemap.get(fname.split('.')[-1].lower()) @@ -908,19 +988,26 @@ class XCodeBackend(backends.Backend): if explicit: self.write_line('%s = "";' % flag_name) - def generate_prefix(self): + def generate_prefix(self, pbxdict): self.ofile.write('// !$*UTF8*$!\n{\n') self.indent_level += 1 self.write_line('archiveVersion = 1;\n') + pbxdict.add_item(PbxDictItem('archiveVersion', '1')) self.write_line('classes = {\n') self.write_line('};\n') + pbxdict.add_item(PbxDictItem('classes', PbxDict())) self.write_line('objectVersion = 46;\n') + pbxdict.add_item(PbxDictItem('objectVersion', '46')) self.write_line('objects = {\n') + objects_dict = PbxDictItem('objects', PbxDict()) + pbxdict.add_item(objects_dict) self.indent_level += 1 + return objects_dict - def generate_suffix(self): + def generate_suffix(self, pbxdict): self.indent_level -= 1 self.write_line('};\n') self.write_line('rootObject = ' + self.project_uid + ' /* Project object */;') + pbxdict.add_item(PbxDictItem('rootObject', self.project_uid, 'Project object')) self.indent_level -= 1 self.write_line('}\n') From 18f718299c92f6905f7cc899701ba8b5dc14ff1d Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 3 Apr 2021 23:33:08 +0300 Subject: [PATCH 02/13] Convert one more object type and some scaffolding. --- mesonbuild/backend/xcodebackend.py | 79 +++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index e44d08563..cfbe42ec6 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -34,6 +34,29 @@ class PbxArray: def __init__(self): self.items = [] + def add_item(self, item): + assert(isinstance(item, PbxArrayItem)) + self.items.append(item) + + def write(self, ofile, indent_level): + ofile.write('(\n') + indent_level += 1 + for i in self.items: + ofile.write(indent_level*INDENT + f'{i.value} {i.comment} ,\n') + indent_level -= 1 + ofile.write(indent_level*INDENT + ');\n') + +class PbxArrayItem: + def __init__(self, value, comment = ''): + self.value = value + if comment: + if '/*' in comment: + self.comment = comment + else: + self.comment = f'/* {comment} */' + else: + self.comment = comment + class PbxComment: def __init__(self, text): assert('/*' not in text) @@ -75,13 +98,16 @@ class PbxDict: indent_level += 1 for i in self.items: if isinstance(i, PbxComment): - i.write(indent_level) + i.write(ofile, indent_level) elif isinstance(i, PbxDictItem): if isinstance(i.value, (str, int)): ofile.write(indent_level*INDENT + f'{i.key} = {i.value} {i.comment};\n') elif isinstance(i.value, PbxDict): ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') i.value.write(ofile, indent_level) + elif isinstance(i.value, PbxArray): + ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + i.value.write(ofile, indent_level) else: raise RuntimeError('missing code') else: @@ -176,21 +202,49 @@ class XCodeBackend(backends.Backend): os.makedirs(self.proj_dir, exist_ok=True) self.proj_file = os.path.join(self.proj_dir, 'project.pbxproj') with open(self.proj_file, 'w') as self.ofile: - self.generate_prefix(self.top_level_dict) - self.generate_pbx_aggregate_target() + objects_dict = self.generate_prefix(self.top_level_dict) + objects_dict.add_comment(PbxComment('Begin PBXAggregateTarget section')) + self.generate_pbx_aggregate_target(objects_dict) + objects_dict.add_comment(PbxComment('End PBXAggregateTarget section')) + objects_dict.add_comment(PbxComment('Begin PBXBuildFile section')) self.generate_pbx_build_file() + objects_dict.add_comment(PbxComment('End PBXBuildFile section')) + objects_dict.add_comment(PbxComment('Begin PBXBuildStyle section')) self.generate_pbx_build_style() + objects_dict.add_comment(PbxComment('End PBXBuildStyle section')) + objects_dict.add_comment(PbxComment('Begin PBXContainerItemProxy section')) self.generate_pbx_container_item_proxy() + objects_dict.add_comment(PbxComment('End PBXContainerItemProxy section')) + objects_dict.add_comment(PbxComment('Begin PBXFileReference section')) self.generate_pbx_file_reference() + objects_dict.add_comment(PbxComment('End PBXFileReference section')) + objects_dict.add_comment(PbxComment('Begin PBXFrameworksBuildPhase section')) self.generate_pbx_frameworks_buildphase() + objects_dict.add_comment(PbxComment('End PBXFrameworksBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXGroup section')) self.generate_pbx_group() + objects_dict.add_comment(PbxComment('End PBXGroup section')) + objects_dict.add_comment(PbxComment('Begin PBXNativeTarget section')) self.generate_pbx_native_target() + objects_dict.add_comment(PbxComment('End PBXNativeTarget section')) + objects_dict.add_comment(PbxComment('Begin PBXProject section')) self.generate_pbx_project() + objects_dict.add_comment(PbxComment('End PBXProject section')) + objects_dict.add_comment(PbxComment('Begin PBXShellScriptBuildPhase section')) self.generate_pbx_shell_build_phase(test_data) + objects_dict.add_comment(PbxComment('End PBXShellScriptBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXSourcesBuildPhase section')) self.generate_pbx_sources_build_phase() + objects_dict.add_comment(PbxComment('End PBXSourcesBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXTargetDependency section')) self.generate_pbx_target_dependency() + objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) + objects_dict.add_comment(PbxComment('Begin XCBuildPConfiguration section')) self.generate_xc_build_configuration() + objects_dict.add_comment(PbxComment('End XCBuildPConfiguration section')) + objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) self.generate_xc_configurationList() + objects_dict.add_comment(PbxComment('End XCConfigurationList section')) self.generate_suffix(self.top_level_dict) self.write_pbxfile(self.top_level_dict, "temporary.pbxproj") @@ -295,7 +349,7 @@ class XCodeBackend(backends.Backend): for t in self.build.get_build_targets(): self.source_phase[t] = self.gen_id() - def generate_pbx_aggregate_target(self): + def generate_pbx_aggregate_target(self, objects_dict): target_dependencies = list(map(lambda t: self.pbx_dep_map[t], self.build.get_build_targets())) aggregated_targets = [] aggregated_targets.append((self.all_id, 'ALL_BUILD', self.all_buildconf_id, [], target_dependencies)) @@ -304,6 +358,7 @@ class XCodeBackend(backends.Backend): sorted_aggregated_targets = sorted(aggregated_targets, key=operator.itemgetter(0)) self.ofile.write('\n/* Begin PBXAggregateTarget section */\n') for t in sorted_aggregated_targets: + agt_dict = PbxDict() name = t[1] buildconf_id = t[2] build_phases = t[3] @@ -311,23 +366,34 @@ class XCodeBackend(backends.Backend): self.write_line('{} /* {} */ = {{'.format(t[0], name)) self.indent_level += 1 self.write_line('isa = PBXAggregateTarget;') + agt_dict.add_item(PbxDictItem('isa', 'PBXAggregateTarget')) self.write_line(f'buildConfigurationList = {buildconf_id} /* Build configuration list for PBXAggregateTarget "{name}" */;') + agt_dict.add_item(PbxDictItem('buildConfigurationList', buildconf_id)) self.write_line('buildPhases = (') + bp_arr = PbxArray() + agt_dict.add_item(PbxDictItem('buildPhases', bp_arr)) self.indent_level += 1 for bp in build_phases: self.write_line('%s /* ShellScript */,' % bp) + bp_arr.add_item(PbxArrayItem(bp, 'ShellScript')) self.indent_level -= 1 self.write_line(');') self.write_line('dependencies = (') + dep_arr = PbxArray() + agt_dict.add_item(PbxDictItem('dependencies', dep_arr)) self.indent_level += 1 for td in dependencies: self.write_line('%s /* PBXTargetDependency */,' % td) + dep_arr.add_item(PbxArrayItem(td, 'PBXTargetDependency')) self.indent_level -= 1 self.write_line(');') self.write_line('name = %s;' % name) + agt_dict.add_item(PbxDictItem('name', name)) self.write_line('productName = %s;' % name) + agt_dict.add_item(PbxDictItem('productname', name)) self.indent_level -= 1 self.write_line('};') + objects_dict.add_item(PbxDictItem(t[0], agt_dict, name)) self.ofile.write('/* End PBXAggregateTarget section */\n') def generate_pbx_build_file(self): @@ -999,8 +1065,9 @@ class XCodeBackend(backends.Backend): self.write_line('objectVersion = 46;\n') pbxdict.add_item(PbxDictItem('objectVersion', '46')) self.write_line('objects = {\n') - objects_dict = PbxDictItem('objects', PbxDict()) - pbxdict.add_item(objects_dict) + objects_dict = PbxDict() + pbxdict.add_item(PbxDictItem('objects', objects_dict)) + self.indent_level += 1 return objects_dict From 87f1007ba76be2e59690c6c144ae64c268b0193a Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 3 Apr 2021 23:47:35 +0300 Subject: [PATCH 03/13] Reduce verbosity. --- mesonbuild/backend/xcodebackend.py | 48 +++++++++++++++++------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index cfbe42ec6..a9ffb3905 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -34,9 +34,11 @@ class PbxArray: def __init__(self): self.items = [] - def add_item(self, item): - assert(isinstance(item, PbxArrayItem)) - self.items.append(item) + def add_item(self, item, comment=''): + if isinstance(item, PbxArrayItem): + self.items.append(item) + else: + self.items.append(PbxArrayItem(item, comment)) def write(self, ofile, indent_level): ofile.write('(\n') @@ -79,19 +81,23 @@ class PbxDictItem: class PbxDict: def __init__(self): - # This class is a bit weird, becaucse we want to write PBX dicts in + # This class is a bit weird, because we want to write PBX dicts in # defined order _and_ we want to write intermediate comments also in order. self.keys = set() self.items = [] - def add_item(self, item): - key = item.key + def add_item(self, key, value, comment=''): + item = PbxDictItem(key, value, comment) assert(key not in self.keys) self.keys.add(key) self.items.append(item) def add_comment(self, comment): - self.items.append(comment) + if isinstance(comment, str): + self.items.append(PbxComment(str)) + else: + assert(isinstance(comment, PbxComment)) + self.items.append(comment) def write(self, ofile, indent_level): ofile.write('{\n') @@ -366,34 +372,34 @@ class XCodeBackend(backends.Backend): self.write_line('{} /* {} */ = {{'.format(t[0], name)) self.indent_level += 1 self.write_line('isa = PBXAggregateTarget;') - agt_dict.add_item(PbxDictItem('isa', 'PBXAggregateTarget')) + agt_dict.add_item('isa', 'PBXAggregateTarget') self.write_line(f'buildConfigurationList = {buildconf_id} /* Build configuration list for PBXAggregateTarget "{name}" */;') - agt_dict.add_item(PbxDictItem('buildConfigurationList', buildconf_id)) + agt_dict.add_item('buildConfigurationList', buildconf_id) self.write_line('buildPhases = (') bp_arr = PbxArray() - agt_dict.add_item(PbxDictItem('buildPhases', bp_arr)) + agt_dict.add_item('buildPhases', bp_arr) self.indent_level += 1 for bp in build_phases: self.write_line('%s /* ShellScript */,' % bp) - bp_arr.add_item(PbxArrayItem(bp, 'ShellScript')) + bp_arr.add_item(bp, 'ShellScript') self.indent_level -= 1 self.write_line(');') self.write_line('dependencies = (') dep_arr = PbxArray() - agt_dict.add_item(PbxDictItem('dependencies', dep_arr)) + agt_dict.add_item('dependencies', dep_arr) self.indent_level += 1 for td in dependencies: self.write_line('%s /* PBXTargetDependency */,' % td) - dep_arr.add_item(PbxArrayItem(td, 'PBXTargetDependency')) + dep_arr.add_item(td, 'PBXTargetDependency') self.indent_level -= 1 self.write_line(');') self.write_line('name = %s;' % name) - agt_dict.add_item(PbxDictItem('name', name)) + agt_dict.add_item('name', name) self.write_line('productName = %s;' % name) - agt_dict.add_item(PbxDictItem('productname', name)) + agt_dict.add_item('productname', name) self.indent_level -= 1 self.write_line('};') - objects_dict.add_item(PbxDictItem(t[0], agt_dict, name)) + objects_dict.add_item(t[0], agt_dict, name) self.ofile.write('/* End PBXAggregateTarget section */\n') def generate_pbx_build_file(self): @@ -1058,15 +1064,15 @@ class XCodeBackend(backends.Backend): self.ofile.write('// !$*UTF8*$!\n{\n') self.indent_level += 1 self.write_line('archiveVersion = 1;\n') - pbxdict.add_item(PbxDictItem('archiveVersion', '1')) + pbxdict.add_item('archiveVersion', '1') self.write_line('classes = {\n') self.write_line('};\n') - pbxdict.add_item(PbxDictItem('classes', PbxDict())) + pbxdict.add_item('classes', PbxDict()) self.write_line('objectVersion = 46;\n') - pbxdict.add_item(PbxDictItem('objectVersion', '46')) + pbxdict.add_item('objectVersion', '46') self.write_line('objects = {\n') objects_dict = PbxDict() - pbxdict.add_item(PbxDictItem('objects', objects_dict)) + pbxdict.add_item('objects', objects_dict) self.indent_level += 1 return objects_dict @@ -1075,6 +1081,6 @@ class XCodeBackend(backends.Backend): self.indent_level -= 1 self.write_line('};\n') self.write_line('rootObject = ' + self.project_uid + ' /* Project object */;') - pbxdict.add_item(PbxDictItem('rootObject', self.project_uid, 'Project object')) + pbxdict.add_item('rootObject', self.project_uid, 'Project object') self.indent_level -= 1 self.write_line('}\n') From d78dba08a731af7ebbad1c15c7715afd028d7345 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 00:32:03 +0300 Subject: [PATCH 04/13] Convert a few more. --- mesonbuild/backend/xcodebackend.py | 61 +++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 10 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index a9ffb3905..98c6be180 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -213,16 +213,16 @@ class XCodeBackend(backends.Backend): self.generate_pbx_aggregate_target(objects_dict) objects_dict.add_comment(PbxComment('End PBXAggregateTarget section')) objects_dict.add_comment(PbxComment('Begin PBXBuildFile section')) - self.generate_pbx_build_file() + self.generate_pbx_build_file(objects_dict) objects_dict.add_comment(PbxComment('End PBXBuildFile section')) objects_dict.add_comment(PbxComment('Begin PBXBuildStyle section')) - self.generate_pbx_build_style() + self.generate_pbx_build_style(objects_dict) objects_dict.add_comment(PbxComment('End PBXBuildStyle section')) objects_dict.add_comment(PbxComment('Begin PBXContainerItemProxy section')) - self.generate_pbx_container_item_proxy() + self.generate_pbx_container_item_proxy(objects_dict) objects_dict.add_comment(PbxComment('End PBXContainerItemProxy section')) objects_dict.add_comment(PbxComment('Begin PBXFileReference section')) - self.generate_pbx_file_reference() + self.generate_pbx_file_reference(objects_dict) objects_dict.add_comment(PbxComment('End PBXFileReference section')) objects_dict.add_comment(PbxComment('Begin PBXFrameworksBuildPhase section')) self.generate_pbx_frameworks_buildphase() @@ -402,31 +402,42 @@ class XCodeBackend(backends.Backend): objects_dict.add_item(t[0], agt_dict, name) self.ofile.write('/* End PBXAggregateTarget section */\n') - def generate_pbx_build_file(self): + def generate_pbx_build_file(self, objects_dict): self.ofile.write('\n/* Begin PBXBuildFile section */\n') templ = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */; settings = { COMPILER_FLAGS = "%s"; }; };\n' otempl = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */;};\n' + ftempl = '{} /* {}.framework in Frameworks */ = {{isa = PBXBuildFile; fileRef = {} /* {}.framework */; }};\n' for t in self.build.get_build_targets().values(): - for dep in t.get_external_deps(): + # FIXME not ported if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: - self.write_line('{} /* {}.framework in Frameworks */ = {{isa = PBXBuildFile; fileRef = {} /* {}.framework */; }};\n'.format(self.native_frameworks[f], f, self.native_frameworks_fileref[f], f)) + self.write_line(ftempl.format(self.native_frameworks[f], f, self.native_frameworks_fileref[f], f)) for s in t.sources: + sdict = PbxDict() if isinstance(s, mesonlib.File): s = os.path.join(s.subdir, s.fname) if isinstance(s, str): s = os.path.join(t.subdir, s) + sdict = PbxDict() idval = self.buildmap[s] fullpath = os.path.join(self.environment.get_source_dir(), s) fileref = self.filemap[s] fullpath2 = fullpath compiler_args = '' self.write_line(templ % (idval, fullpath, fileref, fullpath2, compiler_args)) + sdict.add_item('isa', 'PBXBuildFile') + sdict.add_item('fileRef', fileref, fullpath2) + settingdict = PbxDict() + settingdict.add_item('COMPILER_FLAGS', '"' + compiler_args + '"') + sdict.add_item('settings', settingdict) + objects_dict.add_item(idval, sdict) + for o in t.objects: + # FIXME, not ported o = os.path.join(t.subdir, o) idval = self.buildmap[o] fileref = self.filemap[o] @@ -435,53 +446,78 @@ class XCodeBackend(backends.Backend): self.write_line(otempl % (idval, fullpath, fileref, fullpath2)) self.ofile.write('/* End PBXBuildFile section */\n') - def generate_pbx_build_style(self): + def generate_pbx_build_style(self, objects_dict): # FIXME: Xcode 9 and later does not uses PBXBuildStyle and it gets removed. Maybe we can remove this part. self.ofile.write('\n/* Begin PBXBuildStyle section */\n') for name, idval in self.buildstylemap.items(): + styledict = PbxDict() self.write_line(f'{idval} /* {name} */ = {{\n') + objects_dict.add_item(idval, styledict, name) self.indent_level += 1 self.write_line('isa = PBXBuildStyle;\n') + styledict.add_item('isa', 'PBXBuildStyle') + settings_dict = PbxDict() self.write_line('buildSettings = {\n') + styledict.add_item('buildSettings', settings_dict) self.indent_level += 1 self.write_line('COPY_PHASE_STRIP = NO;\n') + settings_dict.add_item('COPY_PHASE_STRIP', 'NO') self.indent_level -= 1 self.write_line('};\n') self.write_line('name = "%s";\n' % name) + styledict.add_item('name', name) self.indent_level -= 1 self.write_line('};\n') self.ofile.write('/* End PBXBuildStyle section */\n') - def generate_pbx_container_item_proxy(self): + def generate_pbx_container_item_proxy(self, objects_dict): self.ofile.write('\n/* Begin PBXContainerItemProxy section */\n') for t in self.build.get_build_targets(): + proxy_dict = PbxDict() self.write_line('%s /* PBXContainerItemProxy */ = {' % self.containerproxy_map[t]) + objects_dict.add_item(self.containerproxy_map[t], proxy_dict, 'PBXContainerItemProxy') self.indent_level += 1 self.write_line('isa = PBXContainerItemProxy;') + proxy_dict.add_item('isa', 'PBXContainerItemProxy') self.write_line('containerPortal = %s /* Project object */;' % self.project_uid) + proxy_dict.add_item('containerPortal', self.project_uid, 'Project object') self.write_line('proxyType = 1;') + proxy_dict.add_item('proxyType', '1') self.write_line('remoteGlobalIDString = %s;' % self.native_targets[t]) + proxy_dict.add_item('remoteGlobalIDString', self.native_targets[t]) self.write_line('remoteInfo = "%s";' % t) + proxy_dict.add_item('remoteInfo', '"' + t + '"') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXContainerItemProxy section */\n') - def generate_pbx_file_reference(self): + def generate_pbx_file_reference(self, objects_dict): self.ofile.write('\n/* Begin PBXFileReference section */\n') for t in self.build.get_build_targets().values(): for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: + # FIXME not ported self.write_line('{} /* {}.framework */ = {{isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = {}.framework; path = System/Library/Frameworks/{}.framework; sourceTree = SDKROOT; }};\n'.format(self.native_frameworks_fileref[f], f, f, f)) src_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; fileEncoding = 4; name = "%s"; path = "%s"; sourceTree = SOURCE_ROOT; };\n' for fname, idval in self.filemap.items(): + src_dict = PbxDict() fullpath = os.path.join(self.environment.get_source_dir(), fname) xcodetype = self.get_xcodetype(fname) name = os.path.basename(fname) path = fname + objects_dict.add_item(idval, src_dict, fullpath) self.write_line(src_templ % (idval, fullpath, xcodetype, name, path)) + src_dict.add_item('isa', 'PBXFileReference') + src_dict.add_item('explicitFileType', '"' + xcodetype + '"') + src_dict.add_item('fileEncoding', '4') + src_dict.add_item('name', '"' + name + '"') + src_dict.add_item('path', '"' + path + '"') + src_dict.add_item('sourceTree', 'SOURCE_ROOT') target_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; path = %s; refType = %d; sourceTree = BUILT_PRODUCTS_DIR; };\n' for tname, idval in self.target_filemap.items(): + target_dict = PbxDict() + objects_dict.add_item(idval, target_dict, tname) t = self.build.get_build_targets()[tname] fname = t.get_filename() reftype = 0 @@ -495,6 +531,11 @@ class XCodeBackend(backends.Backend): typestr = self.get_xcodetype(fname) path = '"%s"' % t.get_filename() self.write_line(target_templ % (idval, tname, typestr, path, reftype)) + target_dict.add_item('isa', 'PBXFileReference') + target_dict.add_item('explicitFileType', '"' + typestr + '"') + target_dict.add_item('path', path) + target_dict.add_item('refType', reftype) + target_dict.add_item('sourceTree', 'BUILT_PRODUCTS_DIR') self.ofile.write('/* End PBXFileReference section */\n') def generate_pbx_frameworks_buildphase(self): From 7a3fdf70cc5a3696005913b139c6514d3d058311 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 13:40:54 +0300 Subject: [PATCH 05/13] Convert PBXGroup. --- mesonbuild/backend/xcodebackend.py | 77 ++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 98c6be180..b7a444976 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -225,10 +225,10 @@ class XCodeBackend(backends.Backend): self.generate_pbx_file_reference(objects_dict) objects_dict.add_comment(PbxComment('End PBXFileReference section')) objects_dict.add_comment(PbxComment('Begin PBXFrameworksBuildPhase section')) - self.generate_pbx_frameworks_buildphase() + self.generate_pbx_frameworks_buildphase(objects_dict) objects_dict.add_comment(PbxComment('End PBXFrameworksBuildPhase section')) objects_dict.add_comment(PbxComment('Begin PBXGroup section')) - self.generate_pbx_group() + self.generate_pbx_group(objects_dict) objects_dict.add_comment(PbxComment('End PBXGroup section')) objects_dict.add_comment(PbxComment('Begin PBXNativeTarget section')) self.generate_pbx_native_target() @@ -538,27 +538,35 @@ class XCodeBackend(backends.Backend): target_dict.add_item('sourceTree', 'BUILT_PRODUCTS_DIR') self.ofile.write('/* End PBXFileReference section */\n') - def generate_pbx_frameworks_buildphase(self): + def generate_pbx_frameworks_buildphase(self, objects_dict): for t in self.build.get_build_targets().values(): + bt_dict = PbxDict() self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n') self.write_line('{} /* {} */ = {{\n'.format(t.buildphasemap['Frameworks'], 'Frameworks')) + objects_dict.add_item(t.buildphasemap['Frameworks'], bt_dict, 'Frameworks') self.indent_level += 1 self.write_line('isa = PBXFrameworksBuildPhase;\n') + bt_dict.add_item('isa', 'PBXFrameworksBuildPhase') self.write_line('buildActionMask = %s;\n' % (2147483647)) + bt_dict.add_item('buildActionMask', 2147483647) self.write_line('files = (\n') + file_list = PbxArray() + bt_dict.add_item('files', file_list) self.indent_level += 1 for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: self.write_line('{} /* {}.framework in Frameworks */,\n'.format(self.native_frameworks[f], f)) + file_list.add_item(self.native_frameworks[f], f'{f}.framework in Frameworks') self.indent_level -= 1 self.write_line(');\n') self.write_line('runOnlyForDeploymentPostprocessing = 0;\n') + bt_dict.add_item('runOnlyForDeploymentPostprocessing', 0) self.indent_level -= 1 self.write_line('};\n') self.ofile.write('/* End PBXFrameworksBuildPhase section */\n') - def generate_pbx_group(self): + def generate_pbx_group(self, objects_dict): groupmap = {} target_src_map = {} for t in self.build.get_build_targets(): @@ -568,50 +576,81 @@ class XCodeBackend(backends.Backend): sources_id = self.gen_id() resources_id = self.gen_id() products_id = self.gen_id() - frameworks_id = self.gen_id() + frameworks_id = self.gen_id() self.write_line('%s = {' % self.maingroup_id) + main_dict = PbxDict() + objects_dict.add_item(self.maingroup_id, main_dict) self.indent_level += 1 self.write_line('isa = PBXGroup;') + main_dict.add_item('isa', 'PBXGroup') + main_children = PbxArray() self.write_line('children = (') + main_dict.add_item('children', main_children) self.indent_level += 1 self.write_line('%s /* Sources */,' % sources_id) + main_children.add_item(sources_id, 'Sources') self.write_line('%s /* Resources */,' % resources_id) + main_children.add_item(resources_id, 'Resources') self.write_line('%s /* Products */,' % products_id) + main_children.add_item('products_id', 'Products') self.write_line('%s /* Frameworks */,' % frameworks_id) + main_children.add_item(frameworks_id, 'Frameworks') self.indent_level -= 1 self.write_line(');') self.write_line('sourceTree = "";') + main_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') # Sources + source_dict = PbxDict() self.write_line('%s /* Sources */ = {' % sources_id) + objects_dict.add_item(sources_id, source_dict, 'Sources') self.indent_level += 1 self.write_line('isa = PBXGroup;') + source_dict.add_item('isa', 'PBXGroup') + source_children = PbxArray() self.write_line('children = (') + source_dict.add_item('children', source_children) self.indent_level += 1 for t in self.build.get_build_targets(): self.write_line('{} /* {} */,'.format(groupmap[t], t)) + source_children.add_item(groupmap[t], t) self.indent_level -= 1 self.write_line(');') self.write_line('name = Sources;') + source_dict.add_item('name', 'Sources') self.write_line('sourceTree = "";') + source_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') + + resource_dict = PbxDict() self.write_line('%s /* Resources */ = {' % resources_id) + objects_dict.add_item(resources_id, resource_dict, 'Resources') self.indent_level += 1 self.write_line('isa = PBXGroup;') + resource_dict.add_item('isa', 'PBXGroup') + resource_children = PbxArray() self.write_line('children = (') + resource_dict.add_item('children', resource_children) self.write_line(');') self.write_line('name = Resources;') + resource_dict.add_item('name', 'Resources') self.write_line('sourceTree = "";') + resource_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') + frameworks_dict = PbxDict() self.write_line('%s /* Frameworks */ = {' % frameworks_id) + objects_dict.add_item(frameworks_id, frameworks_dict, 'Frameworks') self.indent_level += 1 self.write_line('isa = PBXGroup;') + frameworks_dict.add_item('isa', 'PBXGroup') + frameworks_children = PbxArray() + frameworks_dict.add_item('children', frameworks_children) self.write_line('children = (') # write frameworks self.indent_level += 1 @@ -621,59 +660,87 @@ class XCodeBackend(backends.Backend): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: self.write_line('{} /* {}.framework */,\n'.format(self.native_frameworks_fileref[f], f)) + frameworks_children.add_item(self.native_frameworks_fileref[f], f) self.indent_level -= 1 self.write_line(');') self.write_line('name = Frameworks;') + frameworks_dict.add_item('name', 'Frameworks') self.write_line('sourceTree = "";') + frameworks_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') # Targets for t in self.build.get_build_targets(): + target_dict = PbxDict() self.write_line('{} /* {} */ = {{'.format(groupmap[t], t)) + objects_dict.add_item(groupmap[t], target_dict, t) self.indent_level += 1 self.write_line('isa = PBXGroup;') + target_dict.add_item('isa', 'PBXGroup') + target_children = PbxArray() + target_dict.add_item('children', target_children) self.write_line('children = (') self.indent_level += 1 self.write_line('%s /* Source files */,' % target_src_map[t]) + target_children.add_item(target_src_map[t], 'Source files') self.indent_level -= 1 self.write_line(');') self.write_line('name = "%s";' % t) + target_dict.add_item('name', f'"{t}"') self.write_line('sourceTree = "";') + target_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') + source_files_dict = PbxDict() self.write_line('%s /* Source files */ = {' % target_src_map[t]) + objects_dict.add_item(target_src_map[t], source_files_dict, 'Source files') self.indent_level += 1 self.write_line('isa = PBXGroup;') + source_files_dict.add_item('isa', 'PBXGroup') + source_file_children = PbxArray() self.write_line('children = (') + source_files_dict.add_item('children', source_file_children) self.indent_level += 1 for s in self.build.get_build_targets()[t].sources: s = os.path.join(s.subdir, s.fname) if isinstance(s, str): self.write_line('{} /* {} */,'.format(self.filemap[s], s)) + source_file_children.add_item(self.filemap[s], s) for o in self.build.get_build_targets()[t].objects: o = os.path.join(self.build.get_build_targets()[t].subdir, o) self.write_line('{} /* {} */,'.format(self.filemap[o], o)) + source_file_children.add_item(self.filemap[o], o) self.indent_level -= 1 self.write_line(');') self.write_line('name = "Source files";') + source_files_dict.add_item('name', '"Source files"') self.write_line('sourceTree = "";') + source_files_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') # And finally products + product_dict = PbxDict() self.write_line('%s /* Products */ = {' % products_id) + objects_dict.add_item(products_id, product_dict, 'Products') self.indent_level += 1 self.write_line('isa = PBXGroup;') + product_dict.add_item('isa', 'PBXGroup') self.write_line('children = (') + product_children = PbxArray() + product_dict.add_item('children', product_children) self.indent_level += 1 for t in self.build.get_build_targets(): self.write_line('{} /* {} */,'.format(self.target_filemap[t], t)) + product_children.add_item(self.target_filemap[t], t) self.indent_level -= 1 self.write_line(');') self.write_line('name = Products;') + product_dict.add_item('name', 'Products') self.write_line('sourceTree = "";') + product_dict.add_item('sourceTree', '""') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXGroup section */\n') From a02621314585a1a2c0053a96eee8b920e5c38fbe Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 15:50:47 +0300 Subject: [PATCH 06/13] Convert a few more. --- mesonbuild/backend/xcodebackend.py | 82 ++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 11 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index b7a444976..37cc2775e 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -231,19 +231,19 @@ class XCodeBackend(backends.Backend): self.generate_pbx_group(objects_dict) objects_dict.add_comment(PbxComment('End PBXGroup section')) objects_dict.add_comment(PbxComment('Begin PBXNativeTarget section')) - self.generate_pbx_native_target() + self.generate_pbx_native_target(objects_dict) objects_dict.add_comment(PbxComment('End PBXNativeTarget section')) objects_dict.add_comment(PbxComment('Begin PBXProject section')) - self.generate_pbx_project() + self.generate_pbx_project(objects_dict) objects_dict.add_comment(PbxComment('End PBXProject section')) objects_dict.add_comment(PbxComment('Begin PBXShellScriptBuildPhase section')) - self.generate_pbx_shell_build_phase(test_data) + self.generate_pbx_shell_build_phase(objects_dict, test_data) objects_dict.add_comment(PbxComment('End PBXShellScriptBuildPhase section')) objects_dict.add_comment(PbxComment('Begin PBXSourcesBuildPhase section')) - self.generate_pbx_sources_build_phase() + self.generate_pbx_sources_build_phase(objects_dict) objects_dict.add_comment(PbxComment('End PBXSourcesBuildPhase section')) objects_dict.add_comment(PbxComment('Begin PBXTargetDependency section')) - self.generate_pbx_target_dependency() + self.generate_pbx_target_dependency(objects_dict) objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) objects_dict.add_comment(PbxComment('Begin XCBuildPConfiguration section')) self.generate_xc_build_configuration() @@ -745,35 +745,49 @@ class XCodeBackend(backends.Backend): self.write_line('};') self.ofile.write('/* End PBXGroup section */\n') - def generate_pbx_native_target(self): + def generate_pbx_native_target(self, objects_dict): self.ofile.write('\n/* Begin PBXNativeTarget section */\n') for tname, idval in self.native_targets.items(): + ntarget_dict = PbxDict() t = self.build.get_build_targets()[tname] self.write_line(f'{idval} /* {tname} */ = {{') + objects_dict.add_item(idval, ntarget_dict, tname) self.indent_level += 1 self.write_line('isa = PBXNativeTarget;') + ntarget_dict.add_item('isa', 'PBXNativeTarget') self.write_line('buildConfigurationList = %s /* Build configuration list for PBXNativeTarget "%s" */;' % (self.buildconflistmap[tname], tname)) + ntarget_dict.add_item('buildConfigurationList', self.buildconflistmap[tname], f'Build configuration list for PBXNativeTarget "{tname}"') + buildphases_array = PbxArray() self.write_line('buildPhases = (') + ntarget_dict.add_item('buildPhases', buildphases_array) self.indent_level += 1 for bpname, bpval in t.buildphasemap.items(): self.write_line(f'{bpval} /* {bpname} yyy */,') + buildphases_array.add_item(bpval, f'{bpname} yyy') self.indent_level -= 1 self.write_line(');') self.write_line('buildRules = (') self.write_line(');') + ntarget_dict.add_item('buildRules', PbxArray()) + dep_array = PbxArray() self.write_line('dependencies = (') + ntarget_dict.add_item('dependencies', dep_array) self.indent_level += 1 for lt in self.build.get_build_targets()[tname].link_targets: # NOT DOCUMENTED, may need to make different links # to same target have different targetdependency item. idval = self.pbx_dep_map[lt.get_id()] self.write_line('%s /* PBXTargetDependency */,' % idval) + dep_array.add_item(idval, 'PBXTargetDependency') self.indent_level -= 1 self.write_line(");") self.write_line('name = "%s";' % tname) + ntarget_dict.add_item('name', f'"{tname}"') self.write_line('productName = "%s";' % tname) + ntarget_dict.add_item('productName', f'"{tname}"') self.write_line('productReference = {} /* {} */;'.format(self.target_filemap[tname], tname)) + ntarget_dict.add_item('productReference', self.target_filemap[tname], tname) if isinstance(t, build.Executable): typestr = 'com.apple.product-type.tool' elif isinstance(t, build.StaticLibrary): @@ -783,91 +797,132 @@ class XCodeBackend(backends.Backend): else: raise MesonException('Unknown target type for %s' % tname) self.write_line('productType = "%s";' % typestr) + ntarget_dict.add_item('productType', f'"{typestr}"') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXNativeTarget section */\n') - def generate_pbx_project(self): + def generate_pbx_project(self, objects_dict): + project_dict = PbxDict() self.ofile.write('\n/* Begin PBXProject section */\n') self.write_line('%s /* Project object */ = {' % self.project_uid) + objects_dict.add_item(self.project_uid, project_dict, 'Project object') self.indent_level += 1 self.write_line('isa = PBXProject;') + project_dict.add_item('isa', 'PBXProject') + attr_dict = PbxDict() self.write_line('attributes = {') + project_dict.add_item('attributes', attr_dict) self.indent_level += 1 self.write_line('BuildIndependentTargetsInParallel = YES;') + attr_dict.add_item('BuildIndependentTargetsInParallel', 'YES') self.indent_level -= 1 self.write_line('};') conftempl = 'buildConfigurationList = %s /* Build configuration list for PBXProject "%s" */;' self.write_line(conftempl % (self.project_conflist, self.build.project_name)) + project_dict.add_item('buildConfigurationList', self.project_conflist, f'Build configuration list for PBXProject "{self.build.project_name}') self.write_line('buildSettings = {') self.write_line('};') + project_dict.add_item('buildSettings', PbxDict()) + style_arr = PbxArray() self.write_line('buildStyles = (') + project_dict.add_item('buildStyles', style_arr) self.indent_level += 1 for name, idval in self.buildstylemap.items(): self.write_line(f'{idval} /* {name} */,') + style_arr.add_item(idval, name) self.indent_level -= 1 self.write_line(');') self.write_line('compatibilityVersion = "Xcode 3.2";') + project_dict.add_item('compatibilityVersion', '"Xcode 3.2"') self.write_line('hasScannedForEncodings = 0;') + project_dict.add_item('hasScannedforEncodings', 0) self.write_line('mainGroup = %s;' % self.maingroup_id) + project_dict.add_item('mainGrouå', self.maingroup_id) self.write_line('projectDirPath = "%s";' % self.build_to_src) + project_dict.add_item('projectDirPath', f'"{self.build_to_src}"') self.write_line('projectRoot = "";') + project_dict.add_item('projectRoot', '""') + targets_arr = PbxArray() self.write_line('targets = (') + project_dict.add_item('targets', targets_arr) self.indent_level += 1 self.write_line('%s /* ALL_BUILD */,' % self.all_id) + targets_arr.add_item(self.all_id, 'ALL_BUILD') self.write_line('%s /* RUN_TESTS */,' % self.test_id) + targets_arr.add_item(self.test_id, 'RUN_TESTS') for t in self.build.get_build_targets(): self.write_line('{} /* {} */,'.format(self.native_targets[t], t)) + targets_arr.add_item(self.native_targets[t], t) self.indent_level -= 1 self.write_line(');') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXProject section */\n') - def generate_pbx_shell_build_phase(self, test_data): + def generate_pbx_shell_build_phase(self, objects_dict, test_data): self.ofile.write('\n/* Begin PBXShellScriptBuildPhase section */\n') + shell_dict = PbxDict() self.write_line('%s /* ShellScript */ = {' % self.test_command_id) + objects_dict.add_item(self.test_command_id, shell_dict, 'ShellScript') self.indent_level += 1 self.write_line('isa = PBXShellScriptBuildPhase;') + shell_dict.add_item('isa', 'PBXShellScriptBuildPhase') self.write_line('buildActionMask = 2147483647;') + shell_dict.add_item('buildActinMask', 2147483647) self.write_line('files = (') self.write_line(');') + shell_dict.add_item('files', PbxArray()) self.write_line('inputPaths = (') self.write_line(');') + shell_dict.add_item('inputPaths', PbxArray()) self.write_line('outputPaths = (') + shell_dict.add_item('outputPaths', PbxArray()) self.write_line(');') self.write_line('runOnlyForDeploymentPostprocessing = 0;') + shell_dict.add_item('runOnlyForDeploymentPostprocessing', 0) self.write_line('shellPath = /bin/sh;') - cmd = mesonlib.get_meson_command() + ['test', test_data, '-C', self.environment.get_build_dir()] + shell_dict.add_item('shellPath', '/bin/sh') + cmd = mesonlib.get_meson_command() + ['test', '-C', self.environment.get_build_dir()] cmdstr = ' '.join(["'%s'" % i for i in cmd]) self.write_line('shellScript = "%s";' % cmdstr) + shell_dict.add_item('shellScript', f'"{cmdstr}"') self.write_line('showEnvVarsInLog = 0;') + shell_dict.add_item('showEvnVarsInLog', 0) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXShellScriptBuildPhase section */\n') - def generate_pbx_sources_build_phase(self): + def generate_pbx_sources_build_phase(self, objects_dict): self.ofile.write('\n/* Begin PBXSourcesBuildPhase section */\n') for name in self.source_phase.keys(): + phase_dict = PbxDict() t = self.build.get_build_targets()[name] self.write_line('%s /* Sources */ = {' % (t.buildphasemap[name])) + objects_dict.add_item(t.buildphasemap[name], phase_dict, 'Sources') self.indent_level += 1 self.write_line('isa = PBXSourcesBuildPhase;') + phase_dict.add_item('isa', 'PBXSourcesBuildPhase') self.write_line('buildActionMask = 2147483647;') + phase_dict.add_item('buildActionMask', 2147483647) + file_arr = PbxArray() self.write_line('files = (') + phase_dict.add_item('files', file_arr) self.indent_level += 1 for s in self.build.get_build_targets()[name].sources: s = os.path.join(s.subdir, s.fname) if not self.environment.is_header(s): self.write_line('{} /* {} */,'.format(self.buildmap[s], os.path.join(self.environment.get_source_dir(), s))) + file_arr.add_item(self.buildmap[s], os.path.join(self.environment.get_source_dir(), s)) self.indent_level -= 1 self.write_line(');') self.write_line('runOnlyForDeploymentPostprocessing = 0;') + phase_dict.add_item('runOnlyForDeploymentPostprocessing', 0) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXSourcesBuildPhase section */\n') - def generate_pbx_target_dependency(self): + def generate_pbx_target_dependency(self, objects_dict): targets = [] for t in self.build.get_build_targets(): idval = self.pbx_dep_map[t] # VERIFY: is this correct? @@ -877,11 +932,16 @@ class XCodeBackend(backends.Backend): sorted_targets = sorted(targets, key=operator.itemgetter(0)) self.ofile.write('\n/* Begin PBXTargetDependency section */\n') for t in sorted_targets: + t_dict = PbxDict() self.write_line('%s /* PBXTargetDependency */ = {' % t[0]) + objects_dict.add_item(t[0], t_dict, 'PBXTargetDependency') self.indent_level += 1 self.write_line('isa = PBXTargetDependency;') + t_dict.add_item('isa', 'PBXTargetDependency') self.write_line('target = {} /* {} */;'.format(t[1], t[2])) + t_dict.add_item('target', t[1], t[2]) self.write_line('targetProxy = %s /* PBXContainerItemProxy */;' % t[3]) + t_dict.add_item('targetProx', t[3], 'PBXContainerItemProxy') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXTargetDependency section */\n') From 3ce0ce86c9662d4b3b6858c7eda46c7ab79a40b2 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 17:20:22 +0300 Subject: [PATCH 07/13] Convert build configuration. --- mesonbuild/backend/xcodebackend.py | 100 ++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 37cc2775e..c420b05db 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -246,7 +246,7 @@ class XCodeBackend(backends.Backend): self.generate_pbx_target_dependency(objects_dict) objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) objects_dict.add_comment(PbxComment('Begin XCBuildPConfiguration section')) - self.generate_xc_build_configuration() + self.generate_xc_build_configuration(objects_dict) objects_dict.add_comment(PbxComment('End XCBuildPConfiguration section')) objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) self.generate_xc_configurationList() @@ -946,78 +946,139 @@ class XCodeBackend(backends.Backend): self.write_line('};') self.ofile.write('/* End PBXTargetDependency section */\n') - def generate_xc_build_configuration(self): + def generate_xc_build_configuration(self, objects_dict): self.ofile.write('\n/* Begin XCBuildConfiguration section */\n') # First the setup for the toplevel project. for buildtype in self.buildtypes: + bt_dict = PbxDict() self.write_line('{} /* {} */ = {{'.format(self.project_configurations[buildtype], buildtype)) + objects_dict.add_item(self.project_configurations[buildtype], bt_dict, buildtype) self.indent_level += 1 self.write_line('isa = XCBuildConfiguration;') + bt_dict.add_item('isa', 'XCBuildConfiguration') + settings_dict = PbxDict() self.write_line('buildSettings = {') + bt_dict.add_item('buildSettings', settings_dict) self.indent_level += 1 self.write_line('ARCHS = "$(ARCHS_STANDARD_64_BIT)";') + bt_dict.add_item('ARCHS', '"$(ARCHS_STANDARD_64_BIT)"') self.write_line('ONLY_ACTIVE_ARCH = YES;') + bt_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') self.write_line('SDKROOT = "macosx";') + bt_dict.add_item('SDKROOT', '"macosx"') self.write_line('SYMROOT = "%s/build";' % self.environment.get_build_dir()) + bt_dict.add_item('SYMROOT', '"%s/build"' % self.environment.get_build_dir()) self.indent_level -= 1 self.write_line('};') self.write_line('name = "%s";' % buildtype) + bt_dict.add_item('name', f'"{buildtype}"') self.indent_level -= 1 self.write_line('};') # Then the all target. for buildtype in self.buildtypes: + bt_dict = PbxDict() self.write_line('{} /* {} */ = {{'.format(self.buildall_configurations[buildtype], buildtype)) + objects_dict.add_item(self.buildall_configurations[buildtype], bt_dict, buildtype) self.indent_level += 1 self.write_line('isa = XCBuildConfiguration;') + bt_dict.add_item('isa', 'XCBuildConfiguration') self.write_line('buildSettings = {') + settings_dict = PbxDict() + bt_dict.add_item('buildSettings', settings_dict) self.indent_level += 1 self.write_line('COMBINE_HIDPI_IMAGES = YES;') + settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = NO;') + settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') + settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') + settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') self.write_line('INSTALL_PATH = "";') + settings_dict.add_item('INSTALL_PATH', '""') self.write_line('OTHER_CFLAGS = " ";') + settings_dict.add_item('OTHER_CFLAGS', '" "') self.write_line('OTHER_LDFLAGS = " ";') + settings_dict.add_item('OTHER_LDFLAGS', '" "') self.write_line('OTHER_REZFLAGS = "";') + settings_dict.add_item('OTHER_REZFLAGS', '""') self.write_line('PRODUCT_NAME = ALL_BUILD;') + settings_dict.add_item('PRODUCT_NAME', 'ALL_BUILD') self.write_line('SECTORDER_FLAGS = "";') + settings_dict.add_item('SECTORDER_FLAGS', '""') self.write_line('SYMROOT = "%s";' % self.environment.get_build_dir()) + settings_dict.add_item('SYMROOT', '"%s"' % self.environment.get_build_dir()) self.write_line('USE_HEADERMAP = NO;') + settings_dict.add_item('USE_HEADERMAP', 'NO') self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) + warn_array = PbxArray() + settings_dict.add_item('WARNING_CFLAGS', warn_array) + warn_array.add_item('"-Wmost"') + warn_array.add_item('"-Wno-four-char-constants"') + warn_array.add_item('"-Wno-unknown-pragmas"') + self.indent_level -= 1 self.write_line('};') self.write_line('name = "%s";' % buildtype) + bt_dict.add_item('name', f'"{buildtype}"') self.indent_level -= 1 self.write_line('};') # Then the test target. for buildtype in self.buildtypes: + bt_dict = PbxDict() self.write_line('{} /* {} */ = {{'.format(self.test_configurations[buildtype], buildtype)) + objects_dict.add_item(self.test_configurations[buildtype], bt_dict, buildtype) self.indent_level += 1 self.write_line('isa = XCBuildConfiguration;') + bt_dict.add_item('isa', 'XCBuildConfiguration') + settings_dict = PbxDict() self.write_line('buildSettings = {') + bt_dict.add_item('buildSettings', settings_dict) self.indent_level += 1 self.write_line('COMBINE_HIDPI_IMAGES = YES;') + settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = NO;') + settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') + settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') + settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', "") self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') self.write_line('INSTALL_PATH = "";') + settings_dict.add_item('INSTALL_PATH', '""') self.write_line('OTHER_CFLAGS = " ";') + settings_dict.add_item('OTHER_CFLAGS', '" "') self.write_line('OTHER_LDFLAGS = " ";') + settings_dict.add_item('OTHER_LDFLAGS', '" "') self.write_line('OTHER_REZFLAGS = "";') + settings_dict.add_item('OTHER_REZFLAGS', '""') self.write_line('PRODUCT_NAME = RUN_TESTS;') + settings_dict.add_item('PRODUCT_NAME', 'RUN_TESTS') self.write_line('SECTORDER_FLAGS = "";') + settings_dict.add_item('SECTORDER_FLAGS', '""') self.write_line('SYMROOT = "%s";' % self.environment.get_build_dir()) + settings_dict.add_item('SYMROOt', '"%s"' % self.environment.get_build_dir()) self.write_line('USE_HEADERMAP = NO;') + settings_dict.add_item('USE_HEADERMAP', 'NO') self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) + warn_array = PbxArray() + settings_dict.add_item('WARNING_CFLAGS', warn_array) + warn_array.add_item('"-Wmost"') + warn_array.add_item('"-Wno-four-char-constants"') + warn_array.add_item('"-Wno-unknown-pragmas"') self.indent_level -= 1 self.write_line('};') self.write_line('name = "%s";' % buildtype) + bt_dict.add_item('name', f'"{buildtype}"') self.indent_level -= 1 self.write_line('};') @@ -1083,23 +1144,35 @@ class XCodeBackend(backends.Backend): langargs[langname] = args langargs[langname] += lang_cargs symroot = os.path.join(self.environment.get_build_dir(), target.subdir) + bt_dict = PbxDict() self.write_line(f'{valid} /* {buildtype} */ = {{') + objects_dict.add_item('valid', bt_dict, buildtype) self.indent_level += 1 self.write_line('isa = XCBuildConfiguration;') + bt_dict.add_item('isa', 'XCBuildConfiguration') + settings_dict = PbxDict() self.write_line('buildSettings = {') + bt_dict.add_item('buildSettings', settings_dict) self.indent_level += 1 self.write_line('COMBINE_HIDPI_IMAGES = YES;') + settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') if dylib_version is not None: self.write_line('DYLIB_CURRENT_VERSION = "%s";' % dylib_version) + settings_dict.add_item('DYLIB_CURRENT_VERSION', f'"{dylib_version}') self.write_line('EXECUTABLE_PREFIX = "%s";' % target.prefix) + settings_dict.add_item('EXECUTABLE_PREFIX', f'"{target.prefix}"') if target.suffix == '': suffix = '' else: suffix = '.' + target.suffix self.write_line('EXECUTABLE_SUFFIX = "%s";' % suffix) + settings_dict.add_item('EXECUTABLE_SUFFIX', f'"{suffix}"') self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = YES;') + settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES') self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCCL_INLINES_ARE_PRIVATE_EXTERN', 'NO') self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') + settings_dict.add_item('GCC_OPIMIZATION_LEVEL', 0) if target.has_pch: # Xcode uses GCC_PREFIX_HEADER which only allows one file per target/executable. Precompiling various header files and # applying a particular pch to each source file will require custom scripts (as a build phase) and build flags per each @@ -1112,29 +1185,50 @@ class XCodeBackend(backends.Backend): mlog.warning('Unsupported Xcode configuration: More than 1 precompiled header found "{}". Target "{}" might not compile correctly.'.format(str(pchs), target.name)) relative_pch_path = os.path.join(target.get_subdir(), pchs[0]) # Path relative to target so it can be used with "$(PROJECT_DIR)" self.write_line('GCC_PRECOMPILE_PREFIX_HEADER = YES;') + settings_dict.add_item('GCC_PRECOMPILE_PREFIX_HEADER', 'YES') self.write_line('GCC_PREFIX_HEADER = "$(PROJECT_DIR)/%s";' % relative_pch_path) + settings_dict.add_item('GCC_PREFIX_HEADER', f'"$(PROJECT_DIR)/{relative_pch_path}"') self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') + settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') + settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') if headerdirs: quotedh = ','.join(['"\\"%s\\""' % i for i in headerdirs]) self.write_line('HEADER_SEARCH_PATHS=(%s);' % quotedh) + settings_dict.add_item('HEADER_SEARCH_PATHS', f'({quotedh}') self.write_line('INSTALL_PATH = "%s";' % install_path) + settings_dict.add_item('INSTALL_PATH', f'"{install_path}”') self.write_line('LIBRARY_SEARCH_PATHS = "";') + settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""') if isinstance(target, build.SharedLibrary): self.write_line('LIBRARY_STYLE = DYNAMIC;') + settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC') for langname, args in langargs.items(): self.write_build_setting_line('OTHER_%sFLAGS' % langname, args) + settings_dict.add_item(f'OTHER_{langname}FLAGS', args) self.write_line('OTHER_LDFLAGS = "%s";' % ldstr) + settings_dict.add_item('OTHER_LDFLAGS', f'"{ldstr}"') self.write_line('OTHER_REZFLAGS = "";') + settings_dict.add_item('OTHER_REZFLAGS', '""') self.write_line('PRODUCT_NAME = %s;' % product_name) + settings_dict.add_item('PRODUCT_NAME', product_name) self.write_line('SECTORDER_FLAGS = "";') + settings_dict.add_item('SECTORDER_FLAGS', '""') self.write_line('SYMROOT = "%s";' % symroot) + settings_dict.add_item('SYMROOT', f'"{symroot}"') self.write_build_setting_line('SYSTEM_HEADER_SEARCH_PATHS', [self.environment.get_build_dir()]) - self.write_line('USE_HEADERMAP = NO;') + settings_dict.add_item('SYSTEM_HEADER_SEARCH_PATHS', '"%s"'.format(self.environment.get_build_dir())) + self.write_line('USE_HEADERMAP = NO;'), self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) + warn_array = PbxArray() + settings_dict.add_item('WARNING_CFLAGS', warn_array) + warn_array.add_item('"-Wmost"') + warn_array.add_item('"-Wno-four-char-constants"') + warn_array.add_item('"-Wno-unknown-pragmas"') self.indent_level -= 1 self.write_line('};') self.write_line('name = %s;' % buildtype) + bt_dict.add_item('name', f'"{buildtype}"') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End XCBuildConfiguration section */\n') From dc9e2d6269cc0965004f10373196ea1d419e0264 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 17:48:03 +0300 Subject: [PATCH 08/13] Converted the last bit. --- mesonbuild/backend/xcodebackend.py | 38 +++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index c420b05db..4ecd83a0c 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -249,7 +249,7 @@ class XCodeBackend(backends.Backend): self.generate_xc_build_configuration(objects_dict) objects_dict.add_comment(PbxComment('End XCBuildPConfiguration section')) objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) - self.generate_xc_configurationList() + self.generate_xc_configurationList(objects_dict) objects_dict.add_comment(PbxComment('End XCConfigurationList section')) self.generate_suffix(self.top_level_dict) self.write_pbxfile(self.top_level_dict, "temporary.pbxproj") @@ -1233,67 +1233,99 @@ class XCodeBackend(backends.Backend): self.write_line('};') self.ofile.write('/* End XCBuildConfiguration section */\n') - def generate_xc_configurationList(self): + def generate_xc_configurationList(self, objects_dict): # FIXME: sort items self.ofile.write('\n/* Begin XCConfigurationList section */\n') + conf_dict = PbxDict() self.write_line(f'{self.project_conflist} /* Build configuration list for PBXProject "{self.build.project_name}" */ = {{') + objects_dict.add_item(self.project_conflist, conf_dict, f'Build configuration list for PBXProject "{self.build.project_name}"') self.indent_level += 1 self.write_line('isa = XCConfigurationList;') + conf_dict.add_item('isa', 'CXConfigurationList') + confs_arr = PbxArray() self.write_line('buildConfigurations = (') + conf_dict.add_item('buildConfigurations', confs_arr) self.indent_level += 1 for buildtype in self.buildtypes: self.write_line('{} /* {} */,'.format(self.project_configurations[buildtype], buildtype)) + confs_arr.add_item(self.project_configurations[buildtype], buildtype) self.indent_level -= 1 self.write_line(');') self.write_line('defaultConfigurationIsVisible = 0;') + conf_dict.add_item('defaultConfigurationIsVisible', 0) self.write_line('defaultConfigurationName = debug;') + conf_dict.add_item('defaultConfigurationName', 'debug') self.indent_level -= 1 self.write_line('};') # Now the all target + all_dict = PbxDict() self.write_line('%s /* Build configuration list for PBXAggregateTarget "ALL_BUILD" */ = {' % self.all_buildconf_id) + objects_dict.add_item(self.all_buildconf_id, all_dict, 'Build configuration list for PBXAggregateTarget "ALL_BUILD"') self.indent_level += 1 self.write_line('isa = XCConfigurationList;') + all_dict.add_item('isa', 'XCConfigurationList') + conf_arr = PbxArray() self.write_line('buildConfigurations = (') + all_dict.add_item('buildConfigurations', conf_arr) self.indent_level += 1 for buildtype in self.buildtypes: self.write_line('{} /* {} */,'.format(self.buildall_configurations[buildtype], buildtype)) + conf_arr.add_item(self.buildall_configurations[buildtype], buildtype) self.indent_level -= 1 self.write_line(');') self.write_line('defaultConfigurationIsVisible = 0;') + all_dict.add_item('defaultConfigurationIsVisible', 0) self.write_line('defaultConfigurationName = debug;') + all_dict.add_item('defaultConfigurationName', 'debug') self.indent_level -= 1 self.write_line('};') # Test target - self.write_line('%s /* Build configuration list for PBXAggregateTarget "ALL_BUILD" */ = {' % self.test_buildconf_id) + test_dict = PbxDict() + self.write_line('%s /* Build configuration list for PBXAggregateTarget "RUN_TEST" */ = {' % self.test_buildconf_id) + objects_dict.add_item(self.test_buildconf_id, test_dict, 'Build configuration list for PBXAggregateTarget "RUN_TEST"') self.indent_level += 1 self.write_line('isa = XCConfigurationList;') + test_dict.add_item('isa', 'XCConfigurationList') + conf_arr = PbxArray() self.write_line('buildConfigurations = (') + test_dict.add_item('buildConfigurations', conf_arr) self.indent_level += 1 for buildtype in self.buildtypes: self.write_line('{} /* {} */,'.format(self.test_configurations[buildtype], buildtype)) + conf_arr.add_item(self.test_configurations[buildtype], buildtype) self.indent_level -= 1 self.write_line(');') self.write_line('defaultConfigurationIsVisible = 0;') + test_dict.add_item('defaultConfigurationIsVisible', 0) self.write_line('defaultConfigurationName = debug;') + test_dict.add_item('defaultConfigurationName', 'debug') self.indent_level -= 1 self.write_line('};') for target_name in self.build.get_build_targets(): + t_dict = PbxDict() listid = self.buildconflistmap[target_name] self.write_line(f'{listid} /* Build configuration list for PBXNativeTarget "{target_name}" */ = {{') + objects_dict.add_item(listid, t_dict, f'Build configuration list for PBXNativeTarget "{target_name}"') self.indent_level += 1 self.write_line('isa = XCConfigurationList;') + t_dict.add_item('isa', 'XCConfigurationList') + conf_arr = PbxArray() self.write_line('buildConfigurations = (') + t_dict.add_item('buildConfigurations', conf_arr) self.indent_level += 1 typestr = 'debug' idval = self.buildconfmap[target_name][typestr] self.write_line(f'{idval} /* {typestr} */,') + conf_arr.add_item(idval, typestr) self.indent_level -= 1 self.write_line(');') self.write_line('defaultConfigurationIsVisible = 0;') + t_dict.add_item('defaultConfigurationIsVisible', 0) self.write_line('defaultConfigurationName = %s;' % typestr) + t_dict.add_item('defaultConfiguratoinName', typestr) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End XCConfigurationList section */\n') From fb70490bd3bba24e83b38b1f93c039fc71325fd8 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 18:51:36 +0300 Subject: [PATCH 09/13] Fix all the minor things that got broken. --- mesonbuild/backend/xcodebackend.py | 83 +++++++++++++++++------------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 4ecd83a0c..ab4f8dd79 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -44,7 +44,10 @@ class PbxArray: ofile.write('(\n') indent_level += 1 for i in self.items: - ofile.write(indent_level*INDENT + f'{i.value} {i.comment} ,\n') + if i.comment: + ofile.write(indent_level*INDENT + f'{i.value} {i.comment},\n') + else: + ofile.write(indent_level*INDENT + f'{i.value},\n') indent_level -= 1 ofile.write(indent_level*INDENT + ');\n') @@ -107,12 +110,21 @@ class PbxDict: i.write(ofile, indent_level) elif isinstance(i, PbxDictItem): if isinstance(i.value, (str, int)): - ofile.write(indent_level*INDENT + f'{i.key} = {i.value} {i.comment};\n') + if i.comment: + ofile.write(indent_level*INDENT + f'{i.key} = {i.value} {i.comment};\n') + else: + ofile.write(indent_level*INDENT + f'{i.key} = {i.value};\n') elif isinstance(i.value, PbxDict): - ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + if i.comment: + ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + else: + ofile.write(indent_level*INDENT + f'{i.key} = ') i.value.write(ofile, indent_level) elif isinstance(i.value, PbxArray): - ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + if i.comment: + ofile.write(indent_level*INDENT + f'{i.key} {i.comment} = ') + else: + ofile.write(indent_level*INDENT + f'{i.key} = ') i.value.write(ofile, indent_level) else: raise RuntimeError('missing code') @@ -245,9 +257,9 @@ class XCodeBackend(backends.Backend): objects_dict.add_comment(PbxComment('Begin PBXTargetDependency section')) self.generate_pbx_target_dependency(objects_dict) objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) - objects_dict.add_comment(PbxComment('Begin XCBuildPConfiguration section')) + objects_dict.add_comment(PbxComment('Begin XCBuildConfiguration section')) self.generate_xc_build_configuration(objects_dict) - objects_dict.add_comment(PbxComment('End XCBuildPConfiguration section')) + objects_dict.add_comment(PbxComment('End XCBuildConfiguration section')) objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) self.generate_xc_configurationList(objects_dict) objects_dict.add_comment(PbxComment('End XCConfigurationList section')) @@ -374,7 +386,7 @@ class XCodeBackend(backends.Backend): self.write_line('isa = PBXAggregateTarget;') agt_dict.add_item('isa', 'PBXAggregateTarget') self.write_line(f'buildConfigurationList = {buildconf_id} /* Build configuration list for PBXAggregateTarget "{name}" */;') - agt_dict.add_item('buildConfigurationList', buildconf_id) + agt_dict.add_item('buildConfigurationList', buildconf_id, f'Build configuration list for PBXAggregateTarget "{name}"') self.write_line('buildPhases = (') bp_arr = PbxArray() agt_dict.add_item('buildPhases', bp_arr) @@ -396,7 +408,7 @@ class XCodeBackend(backends.Backend): self.write_line('name = %s;' % name) agt_dict.add_item('name', name) self.write_line('productName = %s;' % name) - agt_dict.add_item('productname', name) + agt_dict.add_item('productName', name) self.indent_level -= 1 self.write_line('};') objects_dict.add_item(t[0], agt_dict, name) @@ -465,7 +477,7 @@ class XCodeBackend(backends.Backend): self.indent_level -= 1 self.write_line('};\n') self.write_line('name = "%s";\n' % name) - styledict.add_item('name', name) + styledict.add_item('name', f'"{name}"') self.indent_level -= 1 self.write_line('};\n') self.ofile.write('/* End PBXBuildStyle section */\n') @@ -592,7 +604,7 @@ class XCodeBackend(backends.Backend): self.write_line('%s /* Resources */,' % resources_id) main_children.add_item(resources_id, 'Resources') self.write_line('%s /* Products */,' % products_id) - main_children.add_item('products_id', 'Products') + main_children.add_item(products_id, 'Products') self.write_line('%s /* Frameworks */,' % frameworks_id) main_children.add_item(frameworks_id, 'Frameworks') self.indent_level -= 1 @@ -820,7 +832,7 @@ class XCodeBackend(backends.Backend): self.write_line('};') conftempl = 'buildConfigurationList = %s /* Build configuration list for PBXProject "%s" */;' self.write_line(conftempl % (self.project_conflist, self.build.project_name)) - project_dict.add_item('buildConfigurationList', self.project_conflist, f'Build configuration list for PBXProject "{self.build.project_name}') + project_dict.add_item('buildConfigurationList', self.project_conflist, f'Build configuration list for PBXProject "{self.build.project_name}"') self.write_line('buildSettings = {') self.write_line('};') project_dict.add_item('buildSettings', PbxDict()) @@ -836,9 +848,9 @@ class XCodeBackend(backends.Backend): self.write_line('compatibilityVersion = "Xcode 3.2";') project_dict.add_item('compatibilityVersion', '"Xcode 3.2"') self.write_line('hasScannedForEncodings = 0;') - project_dict.add_item('hasScannedforEncodings', 0) + project_dict.add_item('hasScannedForEncodings', 0) self.write_line('mainGroup = %s;' % self.maingroup_id) - project_dict.add_item('mainGrouå', self.maingroup_id) + project_dict.add_item('mainGroup', self.maingroup_id) self.write_line('projectDirPath = "%s";' % self.build_to_src) project_dict.add_item('projectDirPath', f'"{self.build_to_src}"') self.write_line('projectRoot = "";') @@ -869,7 +881,7 @@ class XCodeBackend(backends.Backend): self.write_line('isa = PBXShellScriptBuildPhase;') shell_dict.add_item('isa', 'PBXShellScriptBuildPhase') self.write_line('buildActionMask = 2147483647;') - shell_dict.add_item('buildActinMask', 2147483647) + shell_dict.add_item('buildActionMask', 2147483647) self.write_line('files = (') self.write_line(');') shell_dict.add_item('files', PbxArray()) @@ -883,12 +895,12 @@ class XCodeBackend(backends.Backend): shell_dict.add_item('runOnlyForDeploymentPostprocessing', 0) self.write_line('shellPath = /bin/sh;') shell_dict.add_item('shellPath', '/bin/sh') - cmd = mesonlib.get_meson_command() + ['test', '-C', self.environment.get_build_dir()] + cmd = mesonlib.get_meson_command() + ['test', '--no-rebuild', '-C', self.environment.get_build_dir()] cmdstr = ' '.join(["'%s'" % i for i in cmd]) self.write_line('shellScript = "%s";' % cmdstr) shell_dict.add_item('shellScript', f'"{cmdstr}"') self.write_line('showEnvVarsInLog = 0;') - shell_dict.add_item('showEvnVarsInLog', 0) + shell_dict.add_item('showEnvVarsInLog', 0) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXShellScriptBuildPhase section */\n') @@ -941,7 +953,7 @@ class XCodeBackend(backends.Backend): self.write_line('target = {} /* {} */;'.format(t[1], t[2])) t_dict.add_item('target', t[1], t[2]) self.write_line('targetProxy = %s /* PBXContainerItemProxy */;' % t[3]) - t_dict.add_item('targetProx', t[3], 'PBXContainerItemProxy') + t_dict.add_item('targetProxy', t[3], 'PBXContainerItemProxy') self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End PBXTargetDependency section */\n') @@ -960,14 +972,14 @@ class XCodeBackend(backends.Backend): self.write_line('buildSettings = {') bt_dict.add_item('buildSettings', settings_dict) self.indent_level += 1 - self.write_line('ARCHS = "$(ARCHS_STANDARD_64_BIT)";') - bt_dict.add_item('ARCHS', '"$(ARCHS_STANDARD_64_BIT)"') + self.write_line('ARCHS = "$(NATIVE_ARCH_ACTUAL)";') + settings_dict.add_item('ARCHS', '"$(NATIVE_ARCH_ACTUAL)"') self.write_line('ONLY_ACTIVE_ARCH = YES;') - bt_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') + settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') self.write_line('SDKROOT = "macosx";') - bt_dict.add_item('SDKROOT', '"macosx"') + settings_dict.add_item('SDKROOT', '"macosx"') self.write_line('SYMROOT = "%s/build";' % self.environment.get_build_dir()) - bt_dict.add_item('SYMROOT', '"%s/build"' % self.environment.get_build_dir()) + settings_dict.add_item('SYMROOT', '"%s/build"' % self.environment.get_build_dir()) self.indent_level -= 1 self.write_line('};') self.write_line('name = "%s";' % buildtype) @@ -1001,7 +1013,7 @@ class XCodeBackend(backends.Backend): settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') self.write_line('INSTALL_PATH = "";') settings_dict.add_item('INSTALL_PATH', '""') - self.write_line('OTHER_CFLAGS = " ";') + self.write_line('OTHER_CFLAGS = " ";') settings_dict.add_item('OTHER_CFLAGS', '" "') self.write_line('OTHER_LDFLAGS = " ";') settings_dict.add_item('OTHER_LDFLAGS', '" "') @@ -1050,12 +1062,12 @@ class XCodeBackend(backends.Backend): self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') - settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', "") + settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') self.write_line('INSTALL_PATH = "";') settings_dict.add_item('INSTALL_PATH', '""') - self.write_line('OTHER_CFLAGS = " ";') + self.write_line('OTHER_CFLAGS = " ";') settings_dict.add_item('OTHER_CFLAGS', '" "') self.write_line('OTHER_LDFLAGS = " ";') settings_dict.add_item('OTHER_LDFLAGS', '" "') @@ -1066,7 +1078,7 @@ class XCodeBackend(backends.Backend): self.write_line('SECTORDER_FLAGS = "";') settings_dict.add_item('SECTORDER_FLAGS', '""') self.write_line('SYMROOT = "%s";' % self.environment.get_build_dir()) - settings_dict.add_item('SYMROOt', '"%s"' % self.environment.get_build_dir()) + settings_dict.add_item('SYMROOT', '"%s"' % self.environment.get_build_dir()) self.write_line('USE_HEADERMAP = NO;') settings_dict.add_item('USE_HEADERMAP', 'NO') self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) @@ -1146,7 +1158,7 @@ class XCodeBackend(backends.Backend): symroot = os.path.join(self.environment.get_build_dir(), target.subdir) bt_dict = PbxDict() self.write_line(f'{valid} /* {buildtype} */ = {{') - objects_dict.add_item('valid', bt_dict, buildtype) + objects_dict.add_item(valid, bt_dict, buildtype) self.indent_level += 1 self.write_line('isa = XCBuildConfiguration;') bt_dict.add_item('isa', 'XCBuildConfiguration') @@ -1170,9 +1182,9 @@ class XCodeBackend(backends.Backend): self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = YES;') settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES') self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') - settings_dict.add_item('GCCL_INLINES_ARE_PRIVATE_EXTERN', 'NO') + settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') - settings_dict.add_item('GCC_OPIMIZATION_LEVEL', 0) + settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) if target.has_pch: # Xcode uses GCC_PREFIX_HEADER which only allows one file per target/executable. Precompiling various header files and # applying a particular pch to each source file will require custom scripts (as a build phase) and build flags per each @@ -1197,7 +1209,7 @@ class XCodeBackend(backends.Backend): self.write_line('HEADER_SEARCH_PATHS=(%s);' % quotedh) settings_dict.add_item('HEADER_SEARCH_PATHS', f'({quotedh}') self.write_line('INSTALL_PATH = "%s";' % install_path) - settings_dict.add_item('INSTALL_PATH', f'"{install_path}”') + settings_dict.add_item('INSTALL_PATH', f'"{install_path}"') self.write_line('LIBRARY_SEARCH_PATHS = "";') settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""') if isinstance(target, build.SharedLibrary): @@ -1217,8 +1229,9 @@ class XCodeBackend(backends.Backend): self.write_line('SYMROOT = "%s";' % symroot) settings_dict.add_item('SYMROOT', f'"{symroot}"') self.write_build_setting_line('SYSTEM_HEADER_SEARCH_PATHS', [self.environment.get_build_dir()]) - settings_dict.add_item('SYSTEM_HEADER_SEARCH_PATHS', '"%s"'.format(self.environment.get_build_dir())) - self.write_line('USE_HEADERMAP = NO;'), + settings_dict.add_item('SYSTEM_HEADER_SEARCH_PATHS', '"{}"'.format(self.environment.get_build_dir())) + self.write_line('USE_HEADERMAP = NO;') + settings_dict.add_item('USE_HEADERMAP', 'NO') self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) warn_array = PbxArray() settings_dict.add_item('WARNING_CFLAGS', warn_array) @@ -1228,7 +1241,7 @@ class XCodeBackend(backends.Backend): self.indent_level -= 1 self.write_line('};') self.write_line('name = %s;' % buildtype) - bt_dict.add_item('name', f'"{buildtype}"') + bt_dict.add_item('name', buildtype) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End XCBuildConfiguration section */\n') @@ -1241,7 +1254,7 @@ class XCodeBackend(backends.Backend): objects_dict.add_item(self.project_conflist, conf_dict, f'Build configuration list for PBXProject "{self.build.project_name}"') self.indent_level += 1 self.write_line('isa = XCConfigurationList;') - conf_dict.add_item('isa', 'CXConfigurationList') + conf_dict.add_item('isa', 'XCConfigurationList') confs_arr = PbxArray() self.write_line('buildConfigurations = (') conf_dict.add_item('buildConfigurations', confs_arr) @@ -1325,7 +1338,7 @@ class XCodeBackend(backends.Backend): self.write_line('defaultConfigurationIsVisible = 0;') t_dict.add_item('defaultConfigurationIsVisible', 0) self.write_line('defaultConfigurationName = %s;' % typestr) - t_dict.add_item('defaultConfiguratoinName', typestr) + t_dict.add_item('defaultConfigurationName', typestr) self.indent_level -= 1 self.write_line('};') self.ofile.write('/* End XCConfigurationList section */\n') From c43007408c653e4477c9d261aa0e5d048c168569 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 19:05:29 +0300 Subject: [PATCH 10/13] Add last few things we skipped. --- mesonbuild/backend/xcodebackend.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index ab4f8dd79..91fd0a020 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -422,10 +422,13 @@ class XCodeBackend(backends.Backend): for t in self.build.get_build_targets().values(): for dep in t.get_external_deps(): - # FIXME not ported if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: + fw_dict = PbxDict() + objects_dict.add:item(self.native_frameworks[f], fw_dict, f'{f}.framework in Frameworks') self.write_line(ftempl.format(self.native_frameworks[f], f, self.native_frameworks_fileref[f], f)) + fw_dict.add_item('isa', 'PBXBuildFile') + fw_dict.add_item('fileRef', self.native_frameworks_fileref[f], f) for s in t.sources: sdict = PbxDict() @@ -449,13 +452,16 @@ class XCodeBackend(backends.Backend): objects_dict.add_item(idval, sdict) for o in t.objects: - # FIXME, not ported o = os.path.join(t.subdir, o) idval = self.buildmap[o] fileref = self.filemap[o] fullpath = os.path.join(self.environment.get_source_dir(), o) fullpath2 = fullpath + o_dict = PbxDict() + objects_dict.add_item(idval, o_dict, fullpath) self.write_line(otempl % (idval, fullpath, fileref, fullpath2)) + o_dict.add_item('isa', 'PBXBuildFile') + o_dict.add_item('fileRef', fileref, fullpath2) self.ofile.write('/* End PBXBuildFile section */\n') def generate_pbx_build_style(self, objects_dict): @@ -510,7 +516,14 @@ class XCodeBackend(backends.Backend): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: # FIXME not ported + fw_dict = PbxDict() + objects_dict.add_item(self.native_frameworks_fileref[f], fw_dict, f) self.write_line('{} /* {}.framework */ = {{isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = {}.framework; path = System/Library/Frameworks/{}.framework; sourceTree = SDKROOT; }};\n'.format(self.native_frameworks_fileref[f], f, f, f)) + fw_dict.add_item('isa', 'PBXFileReference') + fw_dict.add_item('lastKnownFileType', 'wrapper.framework') + fw_dict.add_item('name', f'{f}.framework') + fw_dict.add_item('path', f'System/Library/Frameworks/{f}.framework') + fw_dict.add_item('sourceTree', 'SDKROOT') src_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; fileEncoding = 4; name = "%s"; path = "%s"; sourceTree = SOURCE_ROOT; };\n' for fname, idval in self.filemap.items(): src_dict = PbxDict() From bf08bba3718e8109da2ea6d235976f53c5aa8a3e Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 19:26:54 +0300 Subject: [PATCH 11/13] Delete old implementation. --- mesonbuild/backend/xcodebackend.py | 543 +++-------------------------- 1 file changed, 46 insertions(+), 497 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 91fd0a020..b189429eb 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -145,8 +145,6 @@ class XCodeBackend(backends.Backend): self.name = 'xcode' self.project_uid = self.environment.coredata.lang_guids['default'].replace('-', '')[:24] self.project_conflist = self.gen_id() - self.indent = '\t' # Recent versions of Xcode uses tabs - self.indent_level = 0 self.xcodetypemap = {'c': 'sourcecode.c.c', 'a': 'archive.ar', 'cc': 'sourcecode.cpp.cpp', @@ -178,8 +176,7 @@ class XCodeBackend(backends.Backend): with open(ofilename, 'w') as ofile: ofile.write('// !$*UTF8*$!\n') top_level_dict.write(ofile, 0) - assert(self.indent_level == 0) - + def gen_id(self): return str(uuid.uuid4()).upper().replace('-', '')[:24] @@ -194,11 +191,6 @@ class XCodeBackend(backends.Backend): directories = os.path.normpath(self.get_target_dir(target)).split(os.sep) return os.sep.join(['..'] * len(directories)) - def write_line(self, text): - self.ofile.write(self.indent * self.indent_level + text) - if not text.endswith('\n'): - self.ofile.write('\n') - def generate(self): test_data = self.serialize_tests()[0] self.generate_filemap() @@ -219,52 +211,51 @@ class XCodeBackend(backends.Backend): self.proj_dir = os.path.join(self.environment.get_build_dir(), self.build.project_name + '.xcodeproj') os.makedirs(self.proj_dir, exist_ok=True) self.proj_file = os.path.join(self.proj_dir, 'project.pbxproj') - with open(self.proj_file, 'w') as self.ofile: - objects_dict = self.generate_prefix(self.top_level_dict) - objects_dict.add_comment(PbxComment('Begin PBXAggregateTarget section')) - self.generate_pbx_aggregate_target(objects_dict) - objects_dict.add_comment(PbxComment('End PBXAggregateTarget section')) - objects_dict.add_comment(PbxComment('Begin PBXBuildFile section')) - self.generate_pbx_build_file(objects_dict) - objects_dict.add_comment(PbxComment('End PBXBuildFile section')) - objects_dict.add_comment(PbxComment('Begin PBXBuildStyle section')) - self.generate_pbx_build_style(objects_dict) - objects_dict.add_comment(PbxComment('End PBXBuildStyle section')) - objects_dict.add_comment(PbxComment('Begin PBXContainerItemProxy section')) - self.generate_pbx_container_item_proxy(objects_dict) - objects_dict.add_comment(PbxComment('End PBXContainerItemProxy section')) - objects_dict.add_comment(PbxComment('Begin PBXFileReference section')) - self.generate_pbx_file_reference(objects_dict) - objects_dict.add_comment(PbxComment('End PBXFileReference section')) - objects_dict.add_comment(PbxComment('Begin PBXFrameworksBuildPhase section')) - self.generate_pbx_frameworks_buildphase(objects_dict) - objects_dict.add_comment(PbxComment('End PBXFrameworksBuildPhase section')) - objects_dict.add_comment(PbxComment('Begin PBXGroup section')) - self.generate_pbx_group(objects_dict) - objects_dict.add_comment(PbxComment('End PBXGroup section')) - objects_dict.add_comment(PbxComment('Begin PBXNativeTarget section')) - self.generate_pbx_native_target(objects_dict) - objects_dict.add_comment(PbxComment('End PBXNativeTarget section')) - objects_dict.add_comment(PbxComment('Begin PBXProject section')) - self.generate_pbx_project(objects_dict) - objects_dict.add_comment(PbxComment('End PBXProject section')) - objects_dict.add_comment(PbxComment('Begin PBXShellScriptBuildPhase section')) - self.generate_pbx_shell_build_phase(objects_dict, test_data) - objects_dict.add_comment(PbxComment('End PBXShellScriptBuildPhase section')) - objects_dict.add_comment(PbxComment('Begin PBXSourcesBuildPhase section')) - self.generate_pbx_sources_build_phase(objects_dict) - objects_dict.add_comment(PbxComment('End PBXSourcesBuildPhase section')) - objects_dict.add_comment(PbxComment('Begin PBXTargetDependency section')) - self.generate_pbx_target_dependency(objects_dict) - objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) - objects_dict.add_comment(PbxComment('Begin XCBuildConfiguration section')) - self.generate_xc_build_configuration(objects_dict) - objects_dict.add_comment(PbxComment('End XCBuildConfiguration section')) - objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) - self.generate_xc_configurationList(objects_dict) - objects_dict.add_comment(PbxComment('End XCConfigurationList section')) - self.generate_suffix(self.top_level_dict) - self.write_pbxfile(self.top_level_dict, "temporary.pbxproj") + objects_dict = self.generate_prefix(self.top_level_dict) + objects_dict.add_comment(PbxComment('Begin PBXAggregateTarget section')) + self.generate_pbx_aggregate_target(objects_dict) + objects_dict.add_comment(PbxComment('End PBXAggregateTarget section')) + objects_dict.add_comment(PbxComment('Begin PBXBuildFile section')) + self.generate_pbx_build_file(objects_dict) + objects_dict.add_comment(PbxComment('End PBXBuildFile section')) + objects_dict.add_comment(PbxComment('Begin PBXBuildStyle section')) + self.generate_pbx_build_style(objects_dict) + objects_dict.add_comment(PbxComment('End PBXBuildStyle section')) + objects_dict.add_comment(PbxComment('Begin PBXContainerItemProxy section')) + self.generate_pbx_container_item_proxy(objects_dict) + objects_dict.add_comment(PbxComment('End PBXContainerItemProxy section')) + objects_dict.add_comment(PbxComment('Begin PBXFileReference section')) + self.generate_pbx_file_reference(objects_dict) + objects_dict.add_comment(PbxComment('End PBXFileReference section')) + objects_dict.add_comment(PbxComment('Begin PBXFrameworksBuildPhase section')) + self.generate_pbx_frameworks_buildphase(objects_dict) + objects_dict.add_comment(PbxComment('End PBXFrameworksBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXGroup section')) + self.generate_pbx_group(objects_dict) + objects_dict.add_comment(PbxComment('End PBXGroup section')) + objects_dict.add_comment(PbxComment('Begin PBXNativeTarget section')) + self.generate_pbx_native_target(objects_dict) + objects_dict.add_comment(PbxComment('End PBXNativeTarget section')) + objects_dict.add_comment(PbxComment('Begin PBXProject section')) + self.generate_pbx_project(objects_dict) + objects_dict.add_comment(PbxComment('End PBXProject section')) + objects_dict.add_comment(PbxComment('Begin PBXShellScriptBuildPhase section')) + self.generate_pbx_shell_build_phase(objects_dict, test_data) + objects_dict.add_comment(PbxComment('End PBXShellScriptBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXSourcesBuildPhase section')) + self.generate_pbx_sources_build_phase(objects_dict) + objects_dict.add_comment(PbxComment('End PBXSourcesBuildPhase section')) + objects_dict.add_comment(PbxComment('Begin PBXTargetDependency section')) + self.generate_pbx_target_dependency(objects_dict) + objects_dict.add_comment(PbxComment('End PBXTargetDependency section')) + objects_dict.add_comment(PbxComment('Begin XCBuildConfiguration section')) + self.generate_xc_build_configuration(objects_dict) + objects_dict.add_comment(PbxComment('End XCBuildConfiguration section')) + objects_dict.add_comment(PbxComment('Begin XCConfigurationList section')) + self.generate_xc_configurationList(objects_dict) + objects_dict.add_comment(PbxComment('End XCConfigurationList section')) + self.generate_suffix(self.top_level_dict) + self.write_pbxfile(self.top_level_dict, self.proj_file) def get_xcodetype(self, fname): xcodetype = self.xcodetypemap.get(fname.split('.')[-1].lower()) @@ -374,59 +365,33 @@ class XCodeBackend(backends.Backend): aggregated_targets.append((self.test_id, 'RUN_TESTS', self.test_buildconf_id, [self.test_command_id], [])) # Sort objects by ID before writing sorted_aggregated_targets = sorted(aggregated_targets, key=operator.itemgetter(0)) - self.ofile.write('\n/* Begin PBXAggregateTarget section */\n') for t in sorted_aggregated_targets: agt_dict = PbxDict() name = t[1] buildconf_id = t[2] build_phases = t[3] dependencies = t[4] - self.write_line('{} /* {} */ = {{'.format(t[0], name)) - self.indent_level += 1 - self.write_line('isa = PBXAggregateTarget;') agt_dict.add_item('isa', 'PBXAggregateTarget') - self.write_line(f'buildConfigurationList = {buildconf_id} /* Build configuration list for PBXAggregateTarget "{name}" */;') agt_dict.add_item('buildConfigurationList', buildconf_id, f'Build configuration list for PBXAggregateTarget "{name}"') - self.write_line('buildPhases = (') bp_arr = PbxArray() agt_dict.add_item('buildPhases', bp_arr) - self.indent_level += 1 for bp in build_phases: - self.write_line('%s /* ShellScript */,' % bp) bp_arr.add_item(bp, 'ShellScript') - self.indent_level -= 1 - self.write_line(');') - self.write_line('dependencies = (') dep_arr = PbxArray() agt_dict.add_item('dependencies', dep_arr) - self.indent_level += 1 for td in dependencies: - self.write_line('%s /* PBXTargetDependency */,' % td) dep_arr.add_item(td, 'PBXTargetDependency') - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = %s;' % name) agt_dict.add_item('name', name) - self.write_line('productName = %s;' % name) agt_dict.add_item('productName', name) - self.indent_level -= 1 - self.write_line('};') objects_dict.add_item(t[0], agt_dict, name) - self.ofile.write('/* End PBXAggregateTarget section */\n') def generate_pbx_build_file(self, objects_dict): - self.ofile.write('\n/* Begin PBXBuildFile section */\n') - templ = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */; settings = { COMPILER_FLAGS = "%s"; }; };\n' - otempl = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */;};\n' - ftempl = '{} /* {}.framework in Frameworks */ = {{isa = PBXBuildFile; fileRef = {} /* {}.framework */; }};\n' - for t in self.build.get_build_targets().values(): for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: fw_dict = PbxDict() objects_dict.add:item(self.native_frameworks[f], fw_dict, f'{f}.framework in Frameworks') - self.write_line(ftempl.format(self.native_frameworks[f], f, self.native_frameworks_fileref[f], f)) fw_dict.add_item('isa', 'PBXBuildFile') fw_dict.add_item('fileRef', self.native_frameworks_fileref[f], f) @@ -443,7 +408,6 @@ class XCodeBackend(backends.Backend): fileref = self.filemap[s] fullpath2 = fullpath compiler_args = '' - self.write_line(templ % (idval, fullpath, fileref, fullpath2, compiler_args)) sdict.add_item('isa', 'PBXBuildFile') sdict.add_item('fileRef', fileref, fullpath2) settingdict = PbxDict() @@ -459,58 +423,31 @@ class XCodeBackend(backends.Backend): fullpath2 = fullpath o_dict = PbxDict() objects_dict.add_item(idval, o_dict, fullpath) - self.write_line(otempl % (idval, fullpath, fileref, fullpath2)) o_dict.add_item('isa', 'PBXBuildFile') o_dict.add_item('fileRef', fileref, fullpath2) - self.ofile.write('/* End PBXBuildFile section */\n') def generate_pbx_build_style(self, objects_dict): # FIXME: Xcode 9 and later does not uses PBXBuildStyle and it gets removed. Maybe we can remove this part. - self.ofile.write('\n/* Begin PBXBuildStyle section */\n') for name, idval in self.buildstylemap.items(): styledict = PbxDict() - self.write_line(f'{idval} /* {name} */ = {{\n') objects_dict.add_item(idval, styledict, name) - self.indent_level += 1 - self.write_line('isa = PBXBuildStyle;\n') styledict.add_item('isa', 'PBXBuildStyle') settings_dict = PbxDict() - self.write_line('buildSettings = {\n') styledict.add_item('buildSettings', settings_dict) - self.indent_level += 1 - self.write_line('COPY_PHASE_STRIP = NO;\n') settings_dict.add_item('COPY_PHASE_STRIP', 'NO') - self.indent_level -= 1 - self.write_line('};\n') - self.write_line('name = "%s";\n' % name) styledict.add_item('name', f'"{name}"') - self.indent_level -= 1 - self.write_line('};\n') - self.ofile.write('/* End PBXBuildStyle section */\n') def generate_pbx_container_item_proxy(self, objects_dict): - self.ofile.write('\n/* Begin PBXContainerItemProxy section */\n') for t in self.build.get_build_targets(): proxy_dict = PbxDict() - self.write_line('%s /* PBXContainerItemProxy */ = {' % self.containerproxy_map[t]) objects_dict.add_item(self.containerproxy_map[t], proxy_dict, 'PBXContainerItemProxy') - self.indent_level += 1 - self.write_line('isa = PBXContainerItemProxy;') proxy_dict.add_item('isa', 'PBXContainerItemProxy') - self.write_line('containerPortal = %s /* Project object */;' % self.project_uid) proxy_dict.add_item('containerPortal', self.project_uid, 'Project object') - self.write_line('proxyType = 1;') proxy_dict.add_item('proxyType', '1') - self.write_line('remoteGlobalIDString = %s;' % self.native_targets[t]) proxy_dict.add_item('remoteGlobalIDString', self.native_targets[t]) - self.write_line('remoteInfo = "%s";' % t) proxy_dict.add_item('remoteInfo', '"' + t + '"') - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXContainerItemProxy section */\n') def generate_pbx_file_reference(self, objects_dict): - self.ofile.write('\n/* Begin PBXFileReference section */\n') for t in self.build.get_build_targets().values(): for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): @@ -518,7 +455,6 @@ class XCodeBackend(backends.Backend): # FIXME not ported fw_dict = PbxDict() objects_dict.add_item(self.native_frameworks_fileref[f], fw_dict, f) - self.write_line('{} /* {}.framework */ = {{isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = {}.framework; path = System/Library/Frameworks/{}.framework; sourceTree = SDKROOT; }};\n'.format(self.native_frameworks_fileref[f], f, f, f)) fw_dict.add_item('isa', 'PBXFileReference') fw_dict.add_item('lastKnownFileType', 'wrapper.framework') fw_dict.add_item('name', f'{f}.framework') @@ -532,7 +468,6 @@ class XCodeBackend(backends.Backend): name = os.path.basename(fname) path = fname objects_dict.add_item(idval, src_dict, fullpath) - self.write_line(src_templ % (idval, fullpath, xcodetype, name, path)) src_dict.add_item('isa', 'PBXFileReference') src_dict.add_item('explicitFileType', '"' + xcodetype + '"') src_dict.add_item('fileEncoding', '4') @@ -555,41 +490,25 @@ class XCodeBackend(backends.Backend): else: typestr = self.get_xcodetype(fname) path = '"%s"' % t.get_filename() - self.write_line(target_templ % (idval, tname, typestr, path, reftype)) target_dict.add_item('isa', 'PBXFileReference') target_dict.add_item('explicitFileType', '"' + typestr + '"') target_dict.add_item('path', path) target_dict.add_item('refType', reftype) target_dict.add_item('sourceTree', 'BUILT_PRODUCTS_DIR') - self.ofile.write('/* End PBXFileReference section */\n') def generate_pbx_frameworks_buildphase(self, objects_dict): for t in self.build.get_build_targets().values(): bt_dict = PbxDict() - self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n') - self.write_line('{} /* {} */ = {{\n'.format(t.buildphasemap['Frameworks'], 'Frameworks')) objects_dict.add_item(t.buildphasemap['Frameworks'], bt_dict, 'Frameworks') - self.indent_level += 1 - self.write_line('isa = PBXFrameworksBuildPhase;\n') bt_dict.add_item('isa', 'PBXFrameworksBuildPhase') - self.write_line('buildActionMask = %s;\n' % (2147483647)) bt_dict.add_item('buildActionMask', 2147483647) - self.write_line('files = (\n') file_list = PbxArray() bt_dict.add_item('files', file_list) - self.indent_level += 1 for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: - self.write_line('{} /* {}.framework in Frameworks */,\n'.format(self.native_frameworks[f], f)) file_list.add_item(self.native_frameworks[f], f'{f}.framework in Frameworks') - self.indent_level -= 1 - self.write_line(');\n') - self.write_line('runOnlyForDeploymentPostprocessing = 0;\n') bt_dict.add_item('runOnlyForDeploymentPostprocessing', 0) - self.indent_level -= 1 - self.write_line('};\n') - self.ofile.write('/* End PBXFrameworksBuildPhase section */\n') def generate_pbx_group(self, objects_dict): groupmap = {} @@ -597,221 +516,114 @@ class XCodeBackend(backends.Backend): for t in self.build.get_build_targets(): groupmap[t] = self.gen_id() target_src_map[t] = self.gen_id() - self.ofile.write('\n/* Begin PBXGroup section */\n') sources_id = self.gen_id() resources_id = self.gen_id() products_id = self.gen_id() frameworks_id = self.gen_id() - self.write_line('%s = {' % self.maingroup_id) main_dict = PbxDict() objects_dict.add_item(self.maingroup_id, main_dict) - self.indent_level += 1 - self.write_line('isa = PBXGroup;') main_dict.add_item('isa', 'PBXGroup') main_children = PbxArray() - self.write_line('children = (') main_dict.add_item('children', main_children) - self.indent_level += 1 - self.write_line('%s /* Sources */,' % sources_id) main_children.add_item(sources_id, 'Sources') - self.write_line('%s /* Resources */,' % resources_id) main_children.add_item(resources_id, 'Resources') - self.write_line('%s /* Products */,' % products_id) main_children.add_item(products_id, 'Products') - self.write_line('%s /* Frameworks */,' % frameworks_id) main_children.add_item(frameworks_id, 'Frameworks') - self.indent_level -= 1 - self.write_line(');') - self.write_line('sourceTree = "";') main_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') # Sources source_dict = PbxDict() - self.write_line('%s /* Sources */ = {' % sources_id) objects_dict.add_item(sources_id, source_dict, 'Sources') - self.indent_level += 1 - self.write_line('isa = PBXGroup;') source_dict.add_item('isa', 'PBXGroup') source_children = PbxArray() - self.write_line('children = (') source_dict.add_item('children', source_children) - self.indent_level += 1 for t in self.build.get_build_targets(): - self.write_line('{} /* {} */,'.format(groupmap[t], t)) source_children.add_item(groupmap[t], t) - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = Sources;') source_dict.add_item('name', 'Sources') - self.write_line('sourceTree = "";') source_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') resource_dict = PbxDict() - self.write_line('%s /* Resources */ = {' % resources_id) objects_dict.add_item(resources_id, resource_dict, 'Resources') - self.indent_level += 1 - self.write_line('isa = PBXGroup;') resource_dict.add_item('isa', 'PBXGroup') resource_children = PbxArray() - self.write_line('children = (') resource_dict.add_item('children', resource_children) - self.write_line(');') - self.write_line('name = Resources;') resource_dict.add_item('name', 'Resources') - self.write_line('sourceTree = "";') resource_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') frameworks_dict = PbxDict() - self.write_line('%s /* Frameworks */ = {' % frameworks_id) objects_dict.add_item(frameworks_id, frameworks_dict, 'Frameworks') - self.indent_level += 1 - self.write_line('isa = PBXGroup;') frameworks_dict.add_item('isa', 'PBXGroup') frameworks_children = PbxArray() frameworks_dict.add_item('children', frameworks_children) - self.write_line('children = (') # write frameworks - self.indent_level += 1 for t in self.build.get_build_targets().values(): for dep in t.get_external_deps(): if isinstance(dep, dependencies.AppleFrameworks): for f in dep.frameworks: - self.write_line('{} /* {}.framework */,\n'.format(self.native_frameworks_fileref[f], f)) frameworks_children.add_item(self.native_frameworks_fileref[f], f) - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = Frameworks;') frameworks_dict.add_item('name', 'Frameworks') - self.write_line('sourceTree = "";') frameworks_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') # Targets for t in self.build.get_build_targets(): target_dict = PbxDict() - self.write_line('{} /* {} */ = {{'.format(groupmap[t], t)) objects_dict.add_item(groupmap[t], target_dict, t) - self.indent_level += 1 - self.write_line('isa = PBXGroup;') target_dict.add_item('isa', 'PBXGroup') target_children = PbxArray() target_dict.add_item('children', target_children) - self.write_line('children = (') - self.indent_level += 1 - self.write_line('%s /* Source files */,' % target_src_map[t]) target_children.add_item(target_src_map[t], 'Source files') - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = "%s";' % t) target_dict.add_item('name', f'"{t}"') - self.write_line('sourceTree = "";') target_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') source_files_dict = PbxDict() - self.write_line('%s /* Source files */ = {' % target_src_map[t]) objects_dict.add_item(target_src_map[t], source_files_dict, 'Source files') - self.indent_level += 1 - self.write_line('isa = PBXGroup;') source_files_dict.add_item('isa', 'PBXGroup') source_file_children = PbxArray() - self.write_line('children = (') source_files_dict.add_item('children', source_file_children) - self.indent_level += 1 for s in self.build.get_build_targets()[t].sources: s = os.path.join(s.subdir, s.fname) if isinstance(s, str): - self.write_line('{} /* {} */,'.format(self.filemap[s], s)) source_file_children.add_item(self.filemap[s], s) for o in self.build.get_build_targets()[t].objects: o = os.path.join(self.build.get_build_targets()[t].subdir, o) - self.write_line('{} /* {} */,'.format(self.filemap[o], o)) source_file_children.add_item(self.filemap[o], o) - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = "Source files";') source_files_dict.add_item('name', '"Source files"') - self.write_line('sourceTree = "";') source_files_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') # And finally products product_dict = PbxDict() - self.write_line('%s /* Products */ = {' % products_id) objects_dict.add_item(products_id, product_dict, 'Products') - self.indent_level += 1 - self.write_line('isa = PBXGroup;') product_dict.add_item('isa', 'PBXGroup') - self.write_line('children = (') product_children = PbxArray() product_dict.add_item('children', product_children) - self.indent_level += 1 for t in self.build.get_build_targets(): - self.write_line('{} /* {} */,'.format(self.target_filemap[t], t)) product_children.add_item(self.target_filemap[t], t) - self.indent_level -= 1 - self.write_line(');') - self.write_line('name = Products;') product_dict.add_item('name', 'Products') - self.write_line('sourceTree = "";') product_dict.add_item('sourceTree', '""') - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXGroup section */\n') def generate_pbx_native_target(self, objects_dict): - self.ofile.write('\n/* Begin PBXNativeTarget section */\n') for tname, idval in self.native_targets.items(): ntarget_dict = PbxDict() t = self.build.get_build_targets()[tname] - self.write_line(f'{idval} /* {tname} */ = {{') objects_dict.add_item(idval, ntarget_dict, tname) - self.indent_level += 1 - self.write_line('isa = PBXNativeTarget;') ntarget_dict.add_item('isa', 'PBXNativeTarget') - self.write_line('buildConfigurationList = %s /* Build configuration list for PBXNativeTarget "%s" */;' - % (self.buildconflistmap[tname], tname)) ntarget_dict.add_item('buildConfigurationList', self.buildconflistmap[tname], f'Build configuration list for PBXNativeTarget "{tname}"') buildphases_array = PbxArray() - self.write_line('buildPhases = (') ntarget_dict.add_item('buildPhases', buildphases_array) - self.indent_level += 1 for bpname, bpval in t.buildphasemap.items(): - self.write_line(f'{bpval} /* {bpname} yyy */,') buildphases_array.add_item(bpval, f'{bpname} yyy') - self.indent_level -= 1 - self.write_line(');') - self.write_line('buildRules = (') - self.write_line(');') ntarget_dict.add_item('buildRules', PbxArray()) dep_array = PbxArray() - self.write_line('dependencies = (') ntarget_dict.add_item('dependencies', dep_array) - self.indent_level += 1 for lt in self.build.get_build_targets()[tname].link_targets: # NOT DOCUMENTED, may need to make different links # to same target have different targetdependency item. idval = self.pbx_dep_map[lt.get_id()] - self.write_line('%s /* PBXTargetDependency */,' % idval) dep_array.add_item(idval, 'PBXTargetDependency') - self.indent_level -= 1 - self.write_line(");") - self.write_line('name = "%s";' % tname) ntarget_dict.add_item('name', f'"{tname}"') - self.write_line('productName = "%s";' % tname) ntarget_dict.add_item('productName', f'"{tname}"') - self.write_line('productReference = {} /* {} */;'.format(self.target_filemap[tname], tname)) ntarget_dict.add_item('productReference', self.target_filemap[tname], tname) if isinstance(t, build.Executable): typestr = 'com.apple.product-type.tool' @@ -821,131 +633,63 @@ class XCodeBackend(backends.Backend): typestr = 'com.apple.product-type.library.dynamic' else: raise MesonException('Unknown target type for %s' % tname) - self.write_line('productType = "%s";' % typestr) ntarget_dict.add_item('productType', f'"{typestr}"') - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXNativeTarget section */\n') def generate_pbx_project(self, objects_dict): project_dict = PbxDict() - self.ofile.write('\n/* Begin PBXProject section */\n') - self.write_line('%s /* Project object */ = {' % self.project_uid) objects_dict.add_item(self.project_uid, project_dict, 'Project object') - self.indent_level += 1 - self.write_line('isa = PBXProject;') project_dict.add_item('isa', 'PBXProject') attr_dict = PbxDict() - self.write_line('attributes = {') project_dict.add_item('attributes', attr_dict) - self.indent_level += 1 - self.write_line('BuildIndependentTargetsInParallel = YES;') attr_dict.add_item('BuildIndependentTargetsInParallel', 'YES') - self.indent_level -= 1 - self.write_line('};') conftempl = 'buildConfigurationList = %s /* Build configuration list for PBXProject "%s" */;' - self.write_line(conftempl % (self.project_conflist, self.build.project_name)) project_dict.add_item('buildConfigurationList', self.project_conflist, f'Build configuration list for PBXProject "{self.build.project_name}"') - self.write_line('buildSettings = {') - self.write_line('};') project_dict.add_item('buildSettings', PbxDict()) style_arr = PbxArray() - self.write_line('buildStyles = (') project_dict.add_item('buildStyles', style_arr) - self.indent_level += 1 for name, idval in self.buildstylemap.items(): - self.write_line(f'{idval} /* {name} */,') style_arr.add_item(idval, name) - self.indent_level -= 1 - self.write_line(');') - self.write_line('compatibilityVersion = "Xcode 3.2";') project_dict.add_item('compatibilityVersion', '"Xcode 3.2"') - self.write_line('hasScannedForEncodings = 0;') project_dict.add_item('hasScannedForEncodings', 0) - self.write_line('mainGroup = %s;' % self.maingroup_id) project_dict.add_item('mainGroup', self.maingroup_id) - self.write_line('projectDirPath = "%s";' % self.build_to_src) project_dict.add_item('projectDirPath', f'"{self.build_to_src}"') - self.write_line('projectRoot = "";') project_dict.add_item('projectRoot', '""') targets_arr = PbxArray() - self.write_line('targets = (') project_dict.add_item('targets', targets_arr) - self.indent_level += 1 - self.write_line('%s /* ALL_BUILD */,' % self.all_id) targets_arr.add_item(self.all_id, 'ALL_BUILD') - self.write_line('%s /* RUN_TESTS */,' % self.test_id) targets_arr.add_item(self.test_id, 'RUN_TESTS') for t in self.build.get_build_targets(): - self.write_line('{} /* {} */,'.format(self.native_targets[t], t)) targets_arr.add_item(self.native_targets[t], t) - self.indent_level -= 1 - self.write_line(');') - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXProject section */\n') def generate_pbx_shell_build_phase(self, objects_dict, test_data): - self.ofile.write('\n/* Begin PBXShellScriptBuildPhase section */\n') shell_dict = PbxDict() - self.write_line('%s /* ShellScript */ = {' % self.test_command_id) objects_dict.add_item(self.test_command_id, shell_dict, 'ShellScript') - self.indent_level += 1 - self.write_line('isa = PBXShellScriptBuildPhase;') shell_dict.add_item('isa', 'PBXShellScriptBuildPhase') - self.write_line('buildActionMask = 2147483647;') shell_dict.add_item('buildActionMask', 2147483647) - self.write_line('files = (') - self.write_line(');') shell_dict.add_item('files', PbxArray()) - self.write_line('inputPaths = (') - self.write_line(');') shell_dict.add_item('inputPaths', PbxArray()) - self.write_line('outputPaths = (') shell_dict.add_item('outputPaths', PbxArray()) - self.write_line(');') - self.write_line('runOnlyForDeploymentPostprocessing = 0;') shell_dict.add_item('runOnlyForDeploymentPostprocessing', 0) - self.write_line('shellPath = /bin/sh;') shell_dict.add_item('shellPath', '/bin/sh') cmd = mesonlib.get_meson_command() + ['test', '--no-rebuild', '-C', self.environment.get_build_dir()] cmdstr = ' '.join(["'%s'" % i for i in cmd]) - self.write_line('shellScript = "%s";' % cmdstr) shell_dict.add_item('shellScript', f'"{cmdstr}"') - self.write_line('showEnvVarsInLog = 0;') shell_dict.add_item('showEnvVarsInLog', 0) - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXShellScriptBuildPhase section */\n') def generate_pbx_sources_build_phase(self, objects_dict): - self.ofile.write('\n/* Begin PBXSourcesBuildPhase section */\n') for name in self.source_phase.keys(): phase_dict = PbxDict() t = self.build.get_build_targets()[name] - self.write_line('%s /* Sources */ = {' % (t.buildphasemap[name])) objects_dict.add_item(t.buildphasemap[name], phase_dict, 'Sources') - self.indent_level += 1 - self.write_line('isa = PBXSourcesBuildPhase;') phase_dict.add_item('isa', 'PBXSourcesBuildPhase') - self.write_line('buildActionMask = 2147483647;') phase_dict.add_item('buildActionMask', 2147483647) file_arr = PbxArray() - self.write_line('files = (') phase_dict.add_item('files', file_arr) - self.indent_level += 1 for s in self.build.get_build_targets()[name].sources: s = os.path.join(s.subdir, s.fname) if not self.environment.is_header(s): - self.write_line('{} /* {} */,'.format(self.buildmap[s], os.path.join(self.environment.get_source_dir(), s))) file_arr.add_item(self.buildmap[s], os.path.join(self.environment.get_source_dir(), s)) - self.indent_level -= 1 - self.write_line(');') - self.write_line('runOnlyForDeploymentPostprocessing = 0;') phase_dict.add_item('runOnlyForDeploymentPostprocessing', 0) - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXSourcesBuildPhase section */\n') def generate_pbx_target_dependency(self, objects_dict): targets = [] @@ -955,157 +699,83 @@ class XCodeBackend(backends.Backend): # Sort object by ID sorted_targets = sorted(targets, key=operator.itemgetter(0)) - self.ofile.write('\n/* Begin PBXTargetDependency section */\n') for t in sorted_targets: t_dict = PbxDict() - self.write_line('%s /* PBXTargetDependency */ = {' % t[0]) objects_dict.add_item(t[0], t_dict, 'PBXTargetDependency') - self.indent_level += 1 - self.write_line('isa = PBXTargetDependency;') t_dict.add_item('isa', 'PBXTargetDependency') - self.write_line('target = {} /* {} */;'.format(t[1], t[2])) t_dict.add_item('target', t[1], t[2]) - self.write_line('targetProxy = %s /* PBXContainerItemProxy */;' % t[3]) t_dict.add_item('targetProxy', t[3], 'PBXContainerItemProxy') - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End PBXTargetDependency section */\n') def generate_xc_build_configuration(self, objects_dict): - self.ofile.write('\n/* Begin XCBuildConfiguration section */\n') # First the setup for the toplevel project. for buildtype in self.buildtypes: bt_dict = PbxDict() - self.write_line('{} /* {} */ = {{'.format(self.project_configurations[buildtype], buildtype)) objects_dict.add_item(self.project_configurations[buildtype], bt_dict, buildtype) - self.indent_level += 1 - self.write_line('isa = XCBuildConfiguration;') bt_dict.add_item('isa', 'XCBuildConfiguration') settings_dict = PbxDict() - self.write_line('buildSettings = {') bt_dict.add_item('buildSettings', settings_dict) - self.indent_level += 1 - self.write_line('ARCHS = "$(NATIVE_ARCH_ACTUAL)";') settings_dict.add_item('ARCHS', '"$(NATIVE_ARCH_ACTUAL)"') - self.write_line('ONLY_ACTIVE_ARCH = YES;') settings_dict.add_item('ONLY_ACTIVE_ARCH', 'YES') - self.write_line('SDKROOT = "macosx";') settings_dict.add_item('SDKROOT', '"macosx"') - self.write_line('SYMROOT = "%s/build";' % self.environment.get_build_dir()) settings_dict.add_item('SYMROOT', '"%s/build"' % self.environment.get_build_dir()) - self.indent_level -= 1 - self.write_line('};') - self.write_line('name = "%s";' % buildtype) bt_dict.add_item('name', f'"{buildtype}"') - self.indent_level -= 1 - self.write_line('};') # Then the all target. for buildtype in self.buildtypes: bt_dict = PbxDict() - self.write_line('{} /* {} */ = {{'.format(self.buildall_configurations[buildtype], buildtype)) objects_dict.add_item(self.buildall_configurations[buildtype], bt_dict, buildtype) - self.indent_level += 1 - self.write_line('isa = XCBuildConfiguration;') bt_dict.add_item('isa', 'XCBuildConfiguration') - self.write_line('buildSettings = {') settings_dict = PbxDict() bt_dict.add_item('buildSettings', settings_dict) - self.indent_level += 1 - self.write_line('COMBINE_HIDPI_IMAGES = YES;') settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') - self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = NO;') settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') - self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') - self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) - self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') - self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') - self.write_line('INSTALL_PATH = "";') settings_dict.add_item('INSTALL_PATH', '""') - self.write_line('OTHER_CFLAGS = " ";') settings_dict.add_item('OTHER_CFLAGS', '" "') - self.write_line('OTHER_LDFLAGS = " ";') settings_dict.add_item('OTHER_LDFLAGS', '" "') - self.write_line('OTHER_REZFLAGS = "";') settings_dict.add_item('OTHER_REZFLAGS', '""') - self.write_line('PRODUCT_NAME = ALL_BUILD;') settings_dict.add_item('PRODUCT_NAME', 'ALL_BUILD') - self.write_line('SECTORDER_FLAGS = "";') settings_dict.add_item('SECTORDER_FLAGS', '""') - self.write_line('SYMROOT = "%s";' % self.environment.get_build_dir()) settings_dict.add_item('SYMROOT', '"%s"' % self.environment.get_build_dir()) - self.write_line('USE_HEADERMAP = NO;') settings_dict.add_item('USE_HEADERMAP', 'NO') - self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) warn_array = PbxArray() settings_dict.add_item('WARNING_CFLAGS', warn_array) warn_array.add_item('"-Wmost"') warn_array.add_item('"-Wno-four-char-constants"') warn_array.add_item('"-Wno-unknown-pragmas"') - self.indent_level -= 1 - self.write_line('};') - self.write_line('name = "%s";' % buildtype) bt_dict.add_item('name', f'"{buildtype}"') - self.indent_level -= 1 - self.write_line('};') # Then the test target. for buildtype in self.buildtypes: bt_dict = PbxDict() - self.write_line('{} /* {} */ = {{'.format(self.test_configurations[buildtype], buildtype)) objects_dict.add_item(self.test_configurations[buildtype], bt_dict, buildtype) - self.indent_level += 1 - self.write_line('isa = XCBuildConfiguration;') bt_dict.add_item('isa', 'XCBuildConfiguration') settings_dict = PbxDict() - self.write_line('buildSettings = {') bt_dict.add_item('buildSettings', settings_dict) - self.indent_level += 1 - self.write_line('COMBINE_HIDPI_IMAGES = YES;') settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') - self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = NO;') settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'NO') - self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') - self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) - self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') - self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') - self.write_line('INSTALL_PATH = "";') settings_dict.add_item('INSTALL_PATH', '""') - self.write_line('OTHER_CFLAGS = " ";') settings_dict.add_item('OTHER_CFLAGS', '" "') - self.write_line('OTHER_LDFLAGS = " ";') settings_dict.add_item('OTHER_LDFLAGS', '" "') - self.write_line('OTHER_REZFLAGS = "";') settings_dict.add_item('OTHER_REZFLAGS', '""') - self.write_line('PRODUCT_NAME = RUN_TESTS;') settings_dict.add_item('PRODUCT_NAME', 'RUN_TESTS') - self.write_line('SECTORDER_FLAGS = "";') settings_dict.add_item('SECTORDER_FLAGS', '""') - self.write_line('SYMROOT = "%s";' % self.environment.get_build_dir()) settings_dict.add_item('SYMROOT', '"%s"' % self.environment.get_build_dir()) - self.write_line('USE_HEADERMAP = NO;') settings_dict.add_item('USE_HEADERMAP', 'NO') - self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) warn_array = PbxArray() settings_dict.add_item('WARNING_CFLAGS', warn_array) warn_array.add_item('"-Wmost"') warn_array.add_item('"-Wno-four-char-constants"') warn_array.add_item('"-Wno-unknown-pragmas"') - self.indent_level -= 1 - self.write_line('};') - self.write_line('name = "%s";' % buildtype) bt_dict.add_item('name', f'"{buildtype}"') - self.indent_level -= 1 - self.write_line('};') # Now finally targets. langnamemap = {'c': 'C', 'cpp': 'CPLUSPLUS', 'objc': 'OBJC', 'objcpp': 'OBJCPLUSPLUS'} @@ -1170,33 +840,21 @@ class XCodeBackend(backends.Backend): langargs[langname] += lang_cargs symroot = os.path.join(self.environment.get_build_dir(), target.subdir) bt_dict = PbxDict() - self.write_line(f'{valid} /* {buildtype} */ = {{') objects_dict.add_item(valid, bt_dict, buildtype) - self.indent_level += 1 - self.write_line('isa = XCBuildConfiguration;') bt_dict.add_item('isa', 'XCBuildConfiguration') settings_dict = PbxDict() - self.write_line('buildSettings = {') bt_dict.add_item('buildSettings', settings_dict) - self.indent_level += 1 - self.write_line('COMBINE_HIDPI_IMAGES = YES;') settings_dict.add_item('COMBINE_HIDPI_IMAGES', 'YES') if dylib_version is not None: - self.write_line('DYLIB_CURRENT_VERSION = "%s";' % dylib_version) settings_dict.add_item('DYLIB_CURRENT_VERSION', f'"{dylib_version}') - self.write_line('EXECUTABLE_PREFIX = "%s";' % target.prefix) settings_dict.add_item('EXECUTABLE_PREFIX', f'"{target.prefix}"') if target.suffix == '': suffix = '' else: suffix = '.' + target.suffix - self.write_line('EXECUTABLE_SUFFIX = "%s";' % suffix) settings_dict.add_item('EXECUTABLE_SUFFIX', f'"{suffix}"') - self.write_line('GCC_GENERATE_DEBUGGING_SYMBOLS = YES;') settings_dict.add_item('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES') - self.write_line('GCC_INLINES_ARE_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_INLINES_ARE_PRIVATE_EXTERN', 'NO') - self.write_line('GCC_OPTIMIZATION_LEVEL = 0;') settings_dict.add_item('GCC_OPTIMIZATION_LEVEL', 0) if target.has_pch: # Xcode uses GCC_PREFIX_HEADER which only allows one file per target/executable. Precompiling various header files and @@ -1209,198 +867,89 @@ class XCodeBackend(backends.Backend): if len(pchs) > 1: mlog.warning('Unsupported Xcode configuration: More than 1 precompiled header found "{}". Target "{}" might not compile correctly.'.format(str(pchs), target.name)) relative_pch_path = os.path.join(target.get_subdir(), pchs[0]) # Path relative to target so it can be used with "$(PROJECT_DIR)" - self.write_line('GCC_PRECOMPILE_PREFIX_HEADER = YES;') settings_dict.add_item('GCC_PRECOMPILE_PREFIX_HEADER', 'YES') - self.write_line('GCC_PREFIX_HEADER = "$(PROJECT_DIR)/%s";' % relative_pch_path) settings_dict.add_item('GCC_PREFIX_HEADER', f'"$(PROJECT_DIR)/{relative_pch_path}"') - self.write_line('GCC_PREPROCESSOR_DEFINITIONS = "";') settings_dict.add_item('GCC_PREPROCESSOR_DEFINITIONS', '""') - self.write_line('GCC_SYMBOLS_PRIVATE_EXTERN = NO;') settings_dict.add_item('GCC_SYMBOLS_PRIVATE_EXTERN', 'NO') if headerdirs: quotedh = ','.join(['"\\"%s\\""' % i for i in headerdirs]) - self.write_line('HEADER_SEARCH_PATHS=(%s);' % quotedh) settings_dict.add_item('HEADER_SEARCH_PATHS', f'({quotedh}') - self.write_line('INSTALL_PATH = "%s";' % install_path) settings_dict.add_item('INSTALL_PATH', f'"{install_path}"') - self.write_line('LIBRARY_SEARCH_PATHS = "";') settings_dict.add_item('LIBRARY_SEARCH_PATHS', '""') if isinstance(target, build.SharedLibrary): - self.write_line('LIBRARY_STYLE = DYNAMIC;') settings_dict.add_item('LIBRARY_STYLE', 'DYNAMIC') for langname, args in langargs.items(): - self.write_build_setting_line('OTHER_%sFLAGS' % langname, args) settings_dict.add_item(f'OTHER_{langname}FLAGS', args) - self.write_line('OTHER_LDFLAGS = "%s";' % ldstr) settings_dict.add_item('OTHER_LDFLAGS', f'"{ldstr}"') - self.write_line('OTHER_REZFLAGS = "";') settings_dict.add_item('OTHER_REZFLAGS', '""') - self.write_line('PRODUCT_NAME = %s;' % product_name) settings_dict.add_item('PRODUCT_NAME', product_name) - self.write_line('SECTORDER_FLAGS = "";') settings_dict.add_item('SECTORDER_FLAGS', '""') - self.write_line('SYMROOT = "%s";' % symroot) settings_dict.add_item('SYMROOT', f'"{symroot}"') - self.write_build_setting_line('SYSTEM_HEADER_SEARCH_PATHS', [self.environment.get_build_dir()]) settings_dict.add_item('SYSTEM_HEADER_SEARCH_PATHS', '"{}"'.format(self.environment.get_build_dir())) - self.write_line('USE_HEADERMAP = NO;') settings_dict.add_item('USE_HEADERMAP', 'NO') - self.write_build_setting_line('WARNING_CFLAGS', ['-Wmost', '-Wno-four-char-constants', '-Wno-unknown-pragmas']) warn_array = PbxArray() settings_dict.add_item('WARNING_CFLAGS', warn_array) warn_array.add_item('"-Wmost"') warn_array.add_item('"-Wno-four-char-constants"') warn_array.add_item('"-Wno-unknown-pragmas"') - self.indent_level -= 1 - self.write_line('};') - self.write_line('name = %s;' % buildtype) bt_dict.add_item('name', buildtype) - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End XCBuildConfiguration section */\n') def generate_xc_configurationList(self, objects_dict): # FIXME: sort items - self.ofile.write('\n/* Begin XCConfigurationList section */\n') conf_dict = PbxDict() - self.write_line(f'{self.project_conflist} /* Build configuration list for PBXProject "{self.build.project_name}" */ = {{') objects_dict.add_item(self.project_conflist, conf_dict, f'Build configuration list for PBXProject "{self.build.project_name}"') - self.indent_level += 1 - self.write_line('isa = XCConfigurationList;') conf_dict.add_item('isa', 'XCConfigurationList') confs_arr = PbxArray() - self.write_line('buildConfigurations = (') conf_dict.add_item('buildConfigurations', confs_arr) - self.indent_level += 1 for buildtype in self.buildtypes: - self.write_line('{} /* {} */,'.format(self.project_configurations[buildtype], buildtype)) confs_arr.add_item(self.project_configurations[buildtype], buildtype) - self.indent_level -= 1 - self.write_line(');') - self.write_line('defaultConfigurationIsVisible = 0;') conf_dict.add_item('defaultConfigurationIsVisible', 0) - self.write_line('defaultConfigurationName = debug;') conf_dict.add_item('defaultConfigurationName', 'debug') - self.indent_level -= 1 - self.write_line('};') # Now the all target all_dict = PbxDict() - self.write_line('%s /* Build configuration list for PBXAggregateTarget "ALL_BUILD" */ = {' % self.all_buildconf_id) objects_dict.add_item(self.all_buildconf_id, all_dict, 'Build configuration list for PBXAggregateTarget "ALL_BUILD"') - self.indent_level += 1 - self.write_line('isa = XCConfigurationList;') all_dict.add_item('isa', 'XCConfigurationList') conf_arr = PbxArray() - self.write_line('buildConfigurations = (') all_dict.add_item('buildConfigurations', conf_arr) - self.indent_level += 1 for buildtype in self.buildtypes: - self.write_line('{} /* {} */,'.format(self.buildall_configurations[buildtype], buildtype)) conf_arr.add_item(self.buildall_configurations[buildtype], buildtype) - self.indent_level -= 1 - self.write_line(');') - self.write_line('defaultConfigurationIsVisible = 0;') all_dict.add_item('defaultConfigurationIsVisible', 0) - self.write_line('defaultConfigurationName = debug;') all_dict.add_item('defaultConfigurationName', 'debug') - self.indent_level -= 1 - self.write_line('};') # Test target test_dict = PbxDict() - self.write_line('%s /* Build configuration list for PBXAggregateTarget "RUN_TEST" */ = {' % self.test_buildconf_id) objects_dict.add_item(self.test_buildconf_id, test_dict, 'Build configuration list for PBXAggregateTarget "RUN_TEST"') - self.indent_level += 1 - self.write_line('isa = XCConfigurationList;') test_dict.add_item('isa', 'XCConfigurationList') conf_arr = PbxArray() - self.write_line('buildConfigurations = (') test_dict.add_item('buildConfigurations', conf_arr) - self.indent_level += 1 for buildtype in self.buildtypes: - self.write_line('{} /* {} */,'.format(self.test_configurations[buildtype], buildtype)) conf_arr.add_item(self.test_configurations[buildtype], buildtype) - self.indent_level -= 1 - self.write_line(');') - self.write_line('defaultConfigurationIsVisible = 0;') test_dict.add_item('defaultConfigurationIsVisible', 0) - self.write_line('defaultConfigurationName = debug;') test_dict.add_item('defaultConfigurationName', 'debug') - self.indent_level -= 1 - self.write_line('};') for target_name in self.build.get_build_targets(): t_dict = PbxDict() listid = self.buildconflistmap[target_name] - self.write_line(f'{listid} /* Build configuration list for PBXNativeTarget "{target_name}" */ = {{') objects_dict.add_item(listid, t_dict, f'Build configuration list for PBXNativeTarget "{target_name}"') - self.indent_level += 1 - self.write_line('isa = XCConfigurationList;') t_dict.add_item('isa', 'XCConfigurationList') conf_arr = PbxArray() - self.write_line('buildConfigurations = (') t_dict.add_item('buildConfigurations', conf_arr) - self.indent_level += 1 typestr = 'debug' idval = self.buildconfmap[target_name][typestr] - self.write_line(f'{idval} /* {typestr} */,') conf_arr.add_item(idval, typestr) - self.indent_level -= 1 - self.write_line(');') - self.write_line('defaultConfigurationIsVisible = 0;') t_dict.add_item('defaultConfigurationIsVisible', 0) - self.write_line('defaultConfigurationName = %s;' % typestr) t_dict.add_item('defaultConfigurationName', typestr) - self.indent_level -= 1 - self.write_line('};') - self.ofile.write('/* End XCConfigurationList section */\n') - def write_build_setting_line(self, flag_name, flag_values, explicit=False): - if flag_values: - if len(flag_values) == 1: - value = flag_values[0] - if (' ' in value): - # If path contains spaces surround it with double colon - self.write_line(f'{flag_name} = "\\"{value}\\"";') - else: - self.write_line(f'{flag_name} = "{value}";') - else: - self.write_line('%s = (' % flag_name) - self.indent_level += 1 - for value in flag_values: - if (' ' in value): - # If path contains spaces surround it with double colon - self.write_line('"\\"%s\\"",' % value) - else: - self.write_line('"%s",' % value) - self.indent_level -= 1 - self.write_line(');') - else: - if explicit: - self.write_line('%s = "";' % flag_name) def generate_prefix(self, pbxdict): - self.ofile.write('// !$*UTF8*$!\n{\n') - self.indent_level += 1 - self.write_line('archiveVersion = 1;\n') pbxdict.add_item('archiveVersion', '1') - self.write_line('classes = {\n') - self.write_line('};\n') pbxdict.add_item('classes', PbxDict()) - self.write_line('objectVersion = 46;\n') pbxdict.add_item('objectVersion', '46') - self.write_line('objects = {\n') objects_dict = PbxDict() pbxdict.add_item('objects', objects_dict) - self.indent_level += 1 return objects_dict def generate_suffix(self, pbxdict): - self.indent_level -= 1 - self.write_line('};\n') - self.write_line('rootObject = ' + self.project_uid + ' /* Project object */;') pbxdict.add_item('rootObject', self.project_uid, 'Project object') - self.indent_level -= 1 - self.write_line('}\n') From 3420957c73e4f6081f15ba3c26da86cf1eb36217 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 19:30:36 +0300 Subject: [PATCH 12/13] Move constant to module level. --- mesonbuild/backend/xcodebackend.py | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index b189429eb..6f409beb2 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -24,6 +24,24 @@ from ..mesonlib import MesonException from ..interpreter import Interpreter INDENT = '\t' +XCODETYPEMAP = {'c': 'sourcecode.c.c', + 'a': 'archive.ar', + 'cc': 'sourcecode.cpp.cpp', + 'cxx': 'sourcecode.cpp.cpp', + 'cpp': 'sourcecode.cpp.cpp', + 'c++': 'sourcecode.cpp.cpp', + 'm': 'sourcecode.c.objc', + 'mm': 'sourcecode.cpp.objcpp', + 'h': 'sourcecode.c.h', + 'hpp': 'sourcecode.cpp.h', + 'hxx': 'sourcecode.cpp.h', + 'hh': 'sourcecode.cpp.hh', + 'inc': 'sourcecode.c.h', + 'dylib': 'compiled.mach-o.dylib', + 'o': 'compiled.mach-o.objfile', + 's': 'sourcecode.asm', + 'asm': 'sourcecode.asm', + } class PbxItem: def __init__(self, value, comment = ''): @@ -145,24 +163,6 @@ class XCodeBackend(backends.Backend): self.name = 'xcode' self.project_uid = self.environment.coredata.lang_guids['default'].replace('-', '')[:24] self.project_conflist = self.gen_id() - self.xcodetypemap = {'c': 'sourcecode.c.c', - 'a': 'archive.ar', - 'cc': 'sourcecode.cpp.cpp', - 'cxx': 'sourcecode.cpp.cpp', - 'cpp': 'sourcecode.cpp.cpp', - 'c++': 'sourcecode.cpp.cpp', - 'm': 'sourcecode.c.objc', - 'mm': 'sourcecode.cpp.objcpp', - 'h': 'sourcecode.c.h', - 'hpp': 'sourcecode.cpp.h', - 'hxx': 'sourcecode.cpp.h', - 'hh': 'sourcecode.cpp.hh', - 'inc': 'sourcecode.c.h', - 'dylib': 'compiled.mach-o.dylib', - 'o': 'compiled.mach-o.objfile', - 's': 'sourcecode.asm', - 'asm': 'sourcecode.asm', - } self.maingroup_id = self.gen_id() self.all_id = self.gen_id() self.all_buildconf_id = self.gen_id() @@ -258,7 +258,7 @@ class XCodeBackend(backends.Backend): self.write_pbxfile(self.top_level_dict, self.proj_file) def get_xcodetype(self, fname): - xcodetype = self.xcodetypemap.get(fname.split('.')[-1].lower()) + xcodetype = XCODETYPEMAP.get(fname.split('.')[-1].lower()) if not xcodetype: xcodetype = 'sourcecode.unknown' mlog.warning(f'Unknown file type "{fname}" fallbacking to "{xcodetype}". Xcode project might be malformed.') From 2d30f8d1246004f112fdb292a364c66a88832974 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 4 Apr 2021 20:08:12 +0300 Subject: [PATCH 13/13] Fix LGTM issues. --- mesonbuild/backend/xcodebackend.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py index 6f409beb2..d8876cf98 100644 --- a/mesonbuild/backend/xcodebackend.py +++ b/mesonbuild/backend/xcodebackend.py @@ -82,6 +82,7 @@ class PbxArrayItem: class PbxComment: def __init__(self, text): + assert(isinstance(text, str)) assert('/*' not in text) self.text = f'/* {text} */' @@ -173,10 +174,10 @@ class XCodeBackend(backends.Backend): self.top_level_dict = PbxDict() def write_pbxfile(self, top_level_dict, ofilename): - with open(ofilename, 'w') as ofile: - ofile.write('// !$*UTF8*$!\n') - top_level_dict.write(ofile, 0) - + with open(ofilename, 'w') as ofile: + ofile.write('// !$*UTF8*$!\n') + top_level_dict.write(ofile, 0) + def gen_id(self): return str(uuid.uuid4()).upper().replace('-', '')[:24] @@ -396,7 +397,6 @@ class XCodeBackend(backends.Backend): fw_dict.add_item('fileRef', self.native_frameworks_fileref[f], f) for s in t.sources: - sdict = PbxDict() if isinstance(s, mesonlib.File): s = os.path.join(s.subdir, s.fname) @@ -460,7 +460,6 @@ class XCodeBackend(backends.Backend): fw_dict.add_item('name', f'{f}.framework') fw_dict.add_item('path', f'System/Library/Frameworks/{f}.framework') fw_dict.add_item('sourceTree', 'SDKROOT') - src_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; fileEncoding = 4; name = "%s"; path = "%s"; sourceTree = SOURCE_ROOT; };\n' for fname, idval in self.filemap.items(): src_dict = PbxDict() fullpath = os.path.join(self.environment.get_source_dir(), fname) @@ -474,7 +473,6 @@ class XCodeBackend(backends.Backend): src_dict.add_item('name', '"' + name + '"') src_dict.add_item('path', '"' + path + '"') src_dict.add_item('sourceTree', 'SOURCE_ROOT') - target_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; path = %s; refType = %d; sourceTree = BUILT_PRODUCTS_DIR; };\n' for tname, idval in self.target_filemap.items(): target_dict = PbxDict() objects_dict.add_item(idval, target_dict, tname) @@ -642,7 +640,6 @@ class XCodeBackend(backends.Backend): attr_dict = PbxDict() project_dict.add_item('attributes', attr_dict) attr_dict.add_item('BuildIndependentTargetsInParallel', 'YES') - conftempl = 'buildConfigurationList = %s /* Build configuration list for PBXProject "%s" */;' project_dict.add_item('buildConfigurationList', self.project_conflist, f'Build configuration list for PBXProject "{self.build.project_name}"') project_dict.add_item('buildSettings', PbxDict()) style_arr = PbxArray()