aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/backend/xcodebackend.py
diff options
context:
space:
mode:
authorblackbox <roger@boerdijk.org>2017-04-03 00:34:03 +0200
committerRoger Boerdijk <git@boerdijk.org>2017-05-23 12:54:33 +0200
commitea5eb2a80dac61a4e5174b90042cedd933af9a83 (patch)
tree13f8d64a7bdaec4f108acca3faa390009c7e4a3f /mesonbuild/backend/xcodebackend.py
parent07f117e38504df2525b4b09eb16ccc208031db9c (diff)
downloadmeson-ea5eb2a80dac61a4e5174b90042cedd933af9a83.zip
meson-ea5eb2a80dac61a4e5174b90042cedd933af9a83.tar.gz
meson-ea5eb2a80dac61a4e5174b90042cedd933af9a83.tar.bz2
XCode frameworks support
- supported as "Link with Libraries". - Frameworks added as a group to the project - no need to specify custom linker flags anymore, xcodeproj works just like ninja example mason.build file : dep_main += [dependency('appleframeworks', modules : ['Foundation', 'AppKit', 'IOKIT', 'QuartzCore', 'OpenGL', 'GLUT', 'OpenAL'], required : true)]
Diffstat (limited to 'mesonbuild/backend/xcodebackend.py')
-rw-r--r--mesonbuild/backend/xcodebackend.py84
1 files changed, 82 insertions, 2 deletions
diff --git a/mesonbuild/backend/xcodebackend.py b/mesonbuild/backend/xcodebackend.py
index 16c0daf..fae5822 100644
--- a/mesonbuild/backend/xcodebackend.py
+++ b/mesonbuild/backend/xcodebackend.py
@@ -14,6 +14,7 @@
from . import backends
from .. import build
+from .. import dependencies
from .. import mesonlib
import uuid, os, sys
@@ -77,6 +78,7 @@ class XCodeBackend(backends.Backend):
self.generate_buildall_configurations_map()
self.generate_test_configurations_map()
self.generate_native_target_map()
+ self.generate_native_frameworks_map()
self.generate_source_phase_map()
self.generate_target_dependency_map()
self.generate_pbxdep_map()
@@ -91,6 +93,7 @@ class XCodeBackend(backends.Backend):
self.generate_pbx_build_style()
self.generate_pbx_container_item_proxy()
self.generate_pbx_file_reference()
+ self.generate_pbx_frameworks_buildphase()
self.generate_pbx_group()
self.generate_pbx_native_target()
self.generate_pbx_project()
@@ -133,7 +136,14 @@ class XCodeBackend(backends.Backend):
self.buildstylemap = {'debug': self.gen_id()}
def generate_build_phase_map(self):
- self.buildphasemap = {}
+ # Probably should be a vector of maps, one vector-entry for each native_targets (e.g. macos/ios/...)
+ # and each native-target can have their own Frameworks-section (with its own unique-id)
+ self.buildphasemap = {}
+ # system ones
+ self.buildphasemap['Frameworks'] = self.gen_id()
+ self.buildphasemap['Resources'] = self.gen_id()
+ self.buildphasemap['Sources'] = self.gen_id()
+ self.buildphasemap['Encode images'] = self.gen_id()
for t in self.build.targets:
self.buildphasemap[t] = self.gen_id()
@@ -162,6 +172,16 @@ class XCodeBackend(backends.Backend):
for t in self.build.targets:
self.native_targets[t] = self.gen_id()
+ def generate_native_frameworks_map(self):
+ self.native_frameworks = {}
+ self.native_frameworks_fileref = {}
+ for t in self.build.targets.values():
+ for dep in t.get_external_deps():
+ if isinstance(dep, dependencies.AppleFrameworks):
+ for f in dep.frameworks:
+ self.native_frameworks[f] = self.gen_id()
+ self.native_frameworks_fileref[f] = self.gen_id()
+
def generate_target_dependency_map(self):
self.target_dependency_map = {}
for tname, t in self.build.targets.items():
@@ -222,7 +242,14 @@ class XCodeBackend(backends.Backend):
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'
+
for t in self.build.targets.values():
+
+ for dep in t.get_external_deps():
+ if isinstance(dep, dependencies.AppleFrameworks):
+ for f in dep.frameworks:
+ self.ofile.write('%s /* %s.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = %s /* %s.framework */; };\n' %(self.native_frameworks[f], f, self.native_frameworks_fileref[f], f))
+
for s in t.sources:
if isinstance(s, mesonlib.File):
s = s.fname
@@ -276,6 +303,13 @@ class XCodeBackend(backends.Backend):
def generate_pbx_file_reference(self):
self.ofile.write('\n/* Begin PBXFileReference section */\n')
+
+ for t in self.build.targets.values():
+ for dep in t.get_external_deps():
+ if isinstance(dep, dependencies.AppleFrameworks):
+ for f in dep.frameworks:
+ self.ofile.write('%s /* %s.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = %s.framework; path = System/Library/Frameworks/%s.framework; sourceTree = SDKROOT; };\n' %(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():
fullpath = os.path.join(self.environment.get_source_dir(), fname)
@@ -300,6 +334,29 @@ class XCodeBackend(backends.Backend):
self.ofile.write(target_templ % (idval, tname, typestr, path, reftype))
self.ofile.write('/* End PBXFileReference section */\n')
+ def generate_pbx_frameworks_buildphase(self):
+ self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n')
+ self.indent_level += 1
+ self.write_line('%s /* %s */ = {\n' %(self.buildphasemap['Frameworks'], 'Frameworks'))
+ self.indent_level += 1
+ self.write_line('isa = PBXFrameworksBuildPhase;\n')
+ self.write_line('buildActionMask = %s;\n' %(2147483647))
+ self.write_line('files = (\n')
+ self.indent_level += 1
+
+ for t in self.build.targets.values():
+ for dep in t.get_external_deps():
+ if isinstance(dep, dependencies.AppleFrameworks):
+ for f in dep.frameworks:
+ self.write_line('%s /* %s.framework in Frameworks */,\n' %(self.native_frameworks[f], f))
+
+ self.indent_level -= 1
+ self.write_line(');\n')
+ self.write_line('runOnlyForDeploymentPostprocessing = 0;\n')
+ self.indent_level -= 1
+ self.write_line('};\n')
+ self.ofile.write('/* End PBXFrameworksBuildPhase section */\n')
+
def generate_pbx_group(self):
groupmap = {}
target_src_map = {}
@@ -310,6 +367,7 @@ class XCodeBackend(backends.Backend):
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)
self.indent_level += 1
self.write_line('isa = PBXGroup;')
@@ -318,6 +376,7 @@ class XCodeBackend(backends.Backend):
self.write_line('%s /* Sources */,' % sources_id)
self.write_line('%s /* Resources */,' % resources_id)
self.write_line('%s /* Products */,' % products_id)
+ self.write_line('%s /* Frameworks */,' % frameworks_id)
self.indent_level -= 1
self.write_line(');')
self.write_line('sourceTree = "<group>";')
@@ -348,6 +407,26 @@ class XCodeBackend(backends.Backend):
self.write_line('sourceTree = "<group>";')
self.indent_level -= 1
self.write_line('};')
+
+ self.write_line('%s /* Frameworks */ = {' % frameworks_id)
+ self.indent_level += 1
+ self.write_line('isa = PBXGroup;')
+ self.write_line('children = (')
+ # write frameworks
+ self.indent_level += 1
+
+ for t in self.build.targets.values():
+ for dep in t.get_external_deps():
+ if isinstance(dep, dependencies.AppleFrameworks):
+ for f in dep.frameworks:
+ self.write_line('%s /* %s.framework */,\n' %(self.native_frameworks_fileref[f], f))
+
+ self.indent_level -= 1
+ self.write_line(');')
+ self.write_line('name = Frameworks;')
+ self.write_line('sourceTree = "<group>";')
+ self.indent_level -= 1
+ self.write_line('};')
# Targets
for t in self.build.targets:
@@ -409,7 +488,8 @@ class XCodeBackend(backends.Backend):
% (self.buildconflistmap[tname], tname))
self.write_line('buildPhases = (')
self.indent_level += 1
- self.write_line('%s /* Sources */,' % self.buildphasemap[tname])
+ for bpname, bpval in self.buildphasemap.items():
+ self.write_line('%s /* %s xxx */,' % (self.buildphasemap[bpname], bpname))
self.indent_level -= 1
self.write_line(');')
self.write_line('buildRules = (')