aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2021-04-03 23:33:08 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2021-04-03 23:33:08 +0300
commit18f718299c92f6905f7cc899701ba8b5dc14ff1d (patch)
tree35d7824b19dc67bc03f49b3e62b6b9ea2b536451
parent096780070509eeaecd71c6bba72cd1974865e1f6 (diff)
downloadmeson-18f718299c92f6905f7cc899701ba8b5dc14ff1d.zip
meson-18f718299c92f6905f7cc899701ba8b5dc14ff1d.tar.gz
meson-18f718299c92f6905f7cc899701ba8b5dc14ff1d.tar.bz2
Convert one more object type and some scaffolding.
-rw-r--r--mesonbuild/backend/xcodebackend.py79
1 files changed, 73 insertions, 6 deletions
diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py
index e44d085..cfbe42e 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