build: add function get_build_targets to Build class

Add function to Build class to get targets of type BuildTarget
Update xcode backend to call get_build_targets when iterating over targets.
This resolves crash in xcode backend when using custom targets:

AttributeError: ‘CustomTarget’ object has no attribute ‘objects’
pull/8273/head
Jeff Moguillansky 4 years ago committed by Jussi Pakkanen
parent c67e0a8a67
commit 4f8cecca97
  1. 66
      mesonbuild/backend/xcodebackend.py
  2. 7
      mesonbuild/build.py

@ -124,7 +124,7 @@ class XCodeBackend(backends.Backend):
def generate_filemap(self): def generate_filemap(self):
self.filemap = {} # Key is source file relative to src root. self.filemap = {} # Key is source file relative to src root.
self.target_filemap = {} self.target_filemap = {}
for name, t in self.build.targets.items(): for name, t in self.build.get_build_targets().items():
for s in t.sources: for s in t.sources:
if isinstance(s, mesonlib.File): if isinstance(s, mesonlib.File):
s = os.path.join(s.subdir, s.fname) s = os.path.join(s.subdir, s.fname)
@ -137,7 +137,7 @@ class XCodeBackend(backends.Backend):
def generate_buildmap(self): def generate_buildmap(self):
self.buildmap = {} self.buildmap = {}
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
for s in t.sources: for s in t.sources:
s = os.path.join(s.subdir, s.fname) s = os.path.join(s.subdir, s.fname)
self.buildmap[s] = self.gen_id() self.buildmap[s] = self.gen_id()
@ -150,7 +150,7 @@ class XCodeBackend(backends.Backend):
self.buildstylemap = {'debug': self.gen_id()} self.buildstylemap = {'debug': self.gen_id()}
def generate_build_phase_map(self): def generate_build_phase_map(self):
for tname, t in self.build.targets.items(): for tname, t in self.build.get_build_targets().items():
# generate id for our own target-name # generate id for our own target-name
t.buildphasemap = {} t.buildphasemap = {}
t.buildphasemap[tname] = self.gen_id() t.buildphasemap[tname] = self.gen_id()
@ -161,7 +161,7 @@ class XCodeBackend(backends.Backend):
def generate_build_configuration_map(self): def generate_build_configuration_map(self):
self.buildconfmap = {} self.buildconfmap = {}
for t in self.build.targets: for t in self.build.get_build_targets():
bconfs = {'debug': self.gen_id()} bconfs = {'debug': self.gen_id()}
self.buildconfmap[t] = bconfs self.buildconfmap[t] = bconfs
@ -176,18 +176,18 @@ class XCodeBackend(backends.Backend):
def generate_build_configurationlist_map(self): def generate_build_configurationlist_map(self):
self.buildconflistmap = {} self.buildconflistmap = {}
for t in self.build.targets: for t in self.build.get_build_targets():
self.buildconflistmap[t] = self.gen_id() self.buildconflistmap[t] = self.gen_id()
def generate_native_target_map(self): def generate_native_target_map(self):
self.native_targets = {} self.native_targets = {}
for t in self.build.targets: for t in self.build.get_build_targets():
self.native_targets[t] = self.gen_id() self.native_targets[t] = self.gen_id()
def generate_native_frameworks_map(self): def generate_native_frameworks_map(self):
self.native_frameworks = {} self.native_frameworks = {}
self.native_frameworks_fileref = {} self.native_frameworks_fileref = {}
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
for dep in t.get_external_deps(): for dep in t.get_external_deps():
if isinstance(dep, dependencies.AppleFrameworks): if isinstance(dep, dependencies.AppleFrameworks):
for f in dep.frameworks: for f in dep.frameworks:
@ -196,27 +196,27 @@ class XCodeBackend(backends.Backend):
def generate_target_dependency_map(self): def generate_target_dependency_map(self):
self.target_dependency_map = {} self.target_dependency_map = {}
for tname, t in self.build.targets.items(): for tname, t in self.build.get_build_targets().items():
for target in t.link_targets: for target in t.link_targets:
self.target_dependency_map[(tname, target.get_basename())] = self.gen_id() self.target_dependency_map[(tname, target.get_basename())] = self.gen_id()
def generate_pbxdep_map(self): def generate_pbxdep_map(self):
self.pbx_dep_map = {} self.pbx_dep_map = {}
for t in self.build.targets: for t in self.build.get_build_targets():
self.pbx_dep_map[t] = self.gen_id() self.pbx_dep_map[t] = self.gen_id()
def generate_containerproxy_map(self): def generate_containerproxy_map(self):
self.containerproxy_map = {} self.containerproxy_map = {}
for t in self.build.targets: for t in self.build.get_build_targets():
self.containerproxy_map[t] = self.gen_id() self.containerproxy_map[t] = self.gen_id()
def generate_source_phase_map(self): def generate_source_phase_map(self):
self.source_phase = {} self.source_phase = {}
for t in self.build.targets: for t in self.build.get_build_targets():
self.source_phase[t] = self.gen_id() self.source_phase[t] = self.gen_id()
def generate_pbx_aggregate_target(self): def generate_pbx_aggregate_target(self):
target_dependencies = list(map(lambda t: self.pbx_dep_map[t], self.build.targets)) target_dependencies = list(map(lambda t: self.pbx_dep_map[t], self.build.get_build_targets()))
aggregated_targets = [] aggregated_targets = []
aggregated_targets.append((self.all_id, 'ALL_BUILD', self.all_buildconf_id, [], target_dependencies)) aggregated_targets.append((self.all_id, 'ALL_BUILD', self.all_buildconf_id, [], target_dependencies))
aggregated_targets.append((self.test_id, 'RUN_TESTS', self.test_buildconf_id, [self.test_command_id], [])) aggregated_targets.append((self.test_id, 'RUN_TESTS', self.test_buildconf_id, [self.test_command_id], []))
@ -255,7 +255,7 @@ class XCodeBackend(backends.Backend):
templ = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */; settings = { COMPILER_FLAGS = "%s"; }; };\n' templ = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */; settings = { COMPILER_FLAGS = "%s"; }; };\n'
otempl = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */;};\n' otempl = '%s /* %s */ = { isa = PBXBuildFile; fileRef = %s /* %s */;};\n'
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
for dep in t.get_external_deps(): for dep in t.get_external_deps():
if isinstance(dep, dependencies.AppleFrameworks): if isinstance(dep, dependencies.AppleFrameworks):
@ -302,7 +302,7 @@ class XCodeBackend(backends.Backend):
def generate_pbx_container_item_proxy(self): def generate_pbx_container_item_proxy(self):
self.ofile.write('\n/* Begin PBXContainerItemProxy section */\n') self.ofile.write('\n/* Begin PBXContainerItemProxy section */\n')
for t in self.build.targets: for t in self.build.get_build_targets():
self.write_line('%s /* PBXContainerItemProxy */ = {' % self.containerproxy_map[t]) self.write_line('%s /* PBXContainerItemProxy */ = {' % self.containerproxy_map[t])
self.indent_level += 1 self.indent_level += 1
self.write_line('isa = PBXContainerItemProxy;') self.write_line('isa = PBXContainerItemProxy;')
@ -316,7 +316,7 @@ class XCodeBackend(backends.Backend):
def generate_pbx_file_reference(self): def generate_pbx_file_reference(self):
self.ofile.write('\n/* Begin PBXFileReference section */\n') self.ofile.write('\n/* Begin PBXFileReference section */\n')
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
for dep in t.get_external_deps(): for dep in t.get_external_deps():
if isinstance(dep, dependencies.AppleFrameworks): if isinstance(dep, dependencies.AppleFrameworks):
for f in dep.frameworks: for f in dep.frameworks:
@ -330,7 +330,7 @@ class XCodeBackend(backends.Backend):
self.write_line(src_templ % (idval, fullpath, xcodetype, name, path)) self.write_line(src_templ % (idval, fullpath, xcodetype, name, path))
target_templ = '%s /* %s */ = { isa = PBXFileReference; explicitFileType = "%s"; path = %s; refType = %d; sourceTree = BUILT_PRODUCTS_DIR; };\n' 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(): for tname, idval in self.target_filemap.items():
t = self.build.targets[tname] t = self.build.get_build_targets()[tname]
fname = t.get_filename() fname = t.get_filename()
reftype = 0 reftype = 0
if isinstance(t, build.Executable): if isinstance(t, build.Executable):
@ -346,7 +346,7 @@ class XCodeBackend(backends.Backend):
self.ofile.write('/* End PBXFileReference section */\n') self.ofile.write('/* End PBXFileReference section */\n')
def generate_pbx_frameworks_buildphase(self): def generate_pbx_frameworks_buildphase(self):
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n') self.ofile.write('\n/* Begin PBXFrameworksBuildPhase section */\n')
self.write_line('%s /* %s */ = {\n' % (t.buildphasemap['Frameworks'], 'Frameworks')) self.write_line('%s /* %s */ = {\n' % (t.buildphasemap['Frameworks'], 'Frameworks'))
self.indent_level += 1 self.indent_level += 1
@ -368,7 +368,7 @@ class XCodeBackend(backends.Backend):
def generate_pbx_group(self): def generate_pbx_group(self):
groupmap = {} groupmap = {}
target_src_map = {} target_src_map = {}
for t in self.build.targets: for t in self.build.get_build_targets():
groupmap[t] = self.gen_id() groupmap[t] = self.gen_id()
target_src_map[t] = self.gen_id() target_src_map[t] = self.gen_id()
self.ofile.write('\n/* Begin PBXGroup section */\n') self.ofile.write('\n/* Begin PBXGroup section */\n')
@ -397,7 +397,7 @@ class XCodeBackend(backends.Backend):
self.write_line('isa = PBXGroup;') self.write_line('isa = PBXGroup;')
self.write_line('children = (') self.write_line('children = (')
self.indent_level += 1 self.indent_level += 1
for t in self.build.targets: for t in self.build.get_build_targets():
self.write_line('%s /* %s */,' % (groupmap[t], t)) self.write_line('%s /* %s */,' % (groupmap[t], t))
self.indent_level -= 1 self.indent_level -= 1
self.write_line(');') self.write_line(');')
@ -423,7 +423,7 @@ class XCodeBackend(backends.Backend):
# write frameworks # write frameworks
self.indent_level += 1 self.indent_level += 1
for t in self.build.targets.values(): for t in self.build.get_build_targets().values():
for dep in t.get_external_deps(): for dep in t.get_external_deps():
if isinstance(dep, dependencies.AppleFrameworks): if isinstance(dep, dependencies.AppleFrameworks):
for f in dep.frameworks: for f in dep.frameworks:
@ -437,7 +437,7 @@ class XCodeBackend(backends.Backend):
self.write_line('};') self.write_line('};')
# Targets # Targets
for t in self.build.targets: for t in self.build.get_build_targets():
self.write_line('%s /* %s */ = {' % (groupmap[t], t)) self.write_line('%s /* %s */ = {' % (groupmap[t], t))
self.indent_level += 1 self.indent_level += 1
self.write_line('isa = PBXGroup;') self.write_line('isa = PBXGroup;')
@ -455,12 +455,12 @@ class XCodeBackend(backends.Backend):
self.write_line('isa = PBXGroup;') self.write_line('isa = PBXGroup;')
self.write_line('children = (') self.write_line('children = (')
self.indent_level += 1 self.indent_level += 1
for s in self.build.targets[t].sources: for s in self.build.get_build_targets()[t].sources:
s = os.path.join(s.subdir, s.fname) s = os.path.join(s.subdir, s.fname)
if isinstance(s, str): if isinstance(s, str):
self.write_line('%s /* %s */,' % (self.filemap[s], s)) self.write_line('%s /* %s */,' % (self.filemap[s], s))
for o in self.build.targets[t].objects: for o in self.build.get_build_targets()[t].objects:
o = os.path.join(self.build.targets[t].subdir, o) o = os.path.join(self.build.get_build_targets()[t].subdir, o)
self.write_line('%s /* %s */,' % (self.filemap[o], o)) self.write_line('%s /* %s */,' % (self.filemap[o], o))
self.indent_level -= 1 self.indent_level -= 1
self.write_line(');') self.write_line(');')
@ -475,7 +475,7 @@ class XCodeBackend(backends.Backend):
self.write_line('isa = PBXGroup;') self.write_line('isa = PBXGroup;')
self.write_line('children = (') self.write_line('children = (')
self.indent_level += 1 self.indent_level += 1
for t in self.build.targets: for t in self.build.get_build_targets():
self.write_line('%s /* %s */,' % (self.target_filemap[t], t)) self.write_line('%s /* %s */,' % (self.target_filemap[t], t))
self.indent_level -= 1 self.indent_level -= 1
self.write_line(');') self.write_line(');')
@ -488,7 +488,7 @@ class XCodeBackend(backends.Backend):
def generate_pbx_native_target(self): def generate_pbx_native_target(self):
self.ofile.write('\n/* Begin PBXNativeTarget section */\n') self.ofile.write('\n/* Begin PBXNativeTarget section */\n')
for tname, idval in self.native_targets.items(): for tname, idval in self.native_targets.items():
t = self.build.targets[tname] t = self.build.get_build_targets()[tname]
self.write_line('%s /* %s */ = {' % (idval, tname)) self.write_line('%s /* %s */ = {' % (idval, tname))
self.indent_level += 1 self.indent_level += 1
self.write_line('isa = PBXNativeTarget;') self.write_line('isa = PBXNativeTarget;')
@ -504,7 +504,7 @@ class XCodeBackend(backends.Backend):
self.write_line(');') self.write_line(');')
self.write_line('dependencies = (') self.write_line('dependencies = (')
self.indent_level += 1 self.indent_level += 1
for lt in self.build.targets[tname].link_targets: for lt in self.build.get_build_targets()[tname].link_targets:
# NOT DOCUMENTED, may need to make different links # NOT DOCUMENTED, may need to make different links
# to same target have different targetdependency item. # to same target have different targetdependency item.
idval = self.pbx_dep_map[lt.get_id()] idval = self.pbx_dep_map[lt.get_id()]
@ -556,7 +556,7 @@ class XCodeBackend(backends.Backend):
self.indent_level += 1 self.indent_level += 1
self.write_line('%s /* ALL_BUILD */,' % self.all_id) self.write_line('%s /* ALL_BUILD */,' % self.all_id)
self.write_line('%s /* RUN_TESTS */,' % self.test_id) self.write_line('%s /* RUN_TESTS */,' % self.test_id)
for t in self.build.targets: for t in self.build.get_build_targets():
self.write_line('%s /* %s */,' % (self.native_targets[t], t)) self.write_line('%s /* %s */,' % (self.native_targets[t], t))
self.indent_level -= 1 self.indent_level -= 1
self.write_line(');') self.write_line(');')
@ -589,14 +589,14 @@ class XCodeBackend(backends.Backend):
def generate_pbx_sources_build_phase(self): def generate_pbx_sources_build_phase(self):
self.ofile.write('\n/* Begin PBXSourcesBuildPhase section */\n') self.ofile.write('\n/* Begin PBXSourcesBuildPhase section */\n')
for name in self.source_phase.keys(): for name in self.source_phase.keys():
t = self.build.targets[name] t = self.build.get_build_targets()[name]
self.write_line('%s /* Sources */ = {' % (t.buildphasemap[name])) self.write_line('%s /* Sources */ = {' % (t.buildphasemap[name]))
self.indent_level += 1 self.indent_level += 1
self.write_line('isa = PBXSourcesBuildPhase;') self.write_line('isa = PBXSourcesBuildPhase;')
self.write_line('buildActionMask = 2147483647;') self.write_line('buildActionMask = 2147483647;')
self.write_line('files = (') self.write_line('files = (')
self.indent_level += 1 self.indent_level += 1
for s in self.build.targets[name].sources: for s in self.build.get_build_targets()[name].sources:
s = os.path.join(s.subdir, s.fname) s = os.path.join(s.subdir, s.fname)
if not self.environment.is_header(s): if not self.environment.is_header(s):
self.write_line('%s /* %s */,' % (self.buildmap[s], os.path.join(self.environment.get_source_dir(), s))) self.write_line('%s /* %s */,' % (self.buildmap[s], os.path.join(self.environment.get_source_dir(), s)))
@ -609,7 +609,7 @@ class XCodeBackend(backends.Backend):
def generate_pbx_target_dependency(self): def generate_pbx_target_dependency(self):
targets = [] targets = []
for t in self.build.targets: for t in self.build.get_build_targets():
idval = self.pbx_dep_map[t] # VERIFY: is this correct? idval = self.pbx_dep_map[t] # VERIFY: is this correct?
targets.append((idval, self.native_targets[t], t, self.containerproxy_map[t])) targets.append((idval, self.native_targets[t], t, self.containerproxy_map[t]))
@ -703,7 +703,7 @@ class XCodeBackend(backends.Backend):
# Now finally targets. # Now finally targets.
langnamemap = {'c': 'C', 'cpp': 'CPLUSPLUS', 'objc': 'OBJC', 'objcpp': 'OBJCPLUSPLUS'} langnamemap = {'c': 'C', 'cpp': 'CPLUSPLUS', 'objc': 'OBJC', 'objcpp': 'OBJCPLUSPLUS'}
for target_name, target in self.build.targets.items(): for target_name, target in self.build.get_build_targets().items():
for buildtype in self.buildtypes: for buildtype in self.buildtypes:
dep_libs = [] dep_libs = []
links_dylib = False links_dylib = False
@ -858,7 +858,7 @@ class XCodeBackend(backends.Backend):
self.indent_level -= 1 self.indent_level -= 1
self.write_line('};') self.write_line('};')
for target_name in self.build.targets: for target_name in self.build.get_build_targets():
listid = self.buildconflistmap[target_name] listid = self.buildconflistmap[target_name]
self.write_line('%s /* Build configuration list for PBXNativeTarget "%s" */ = {' % (listid, target_name)) self.write_line('%s /* Build configuration list for PBXNativeTarget "%s" */ = {' % (listid, target_name))
self.indent_level += 1 self.indent_level += 1

@ -223,6 +223,13 @@ class Build:
self.searched_programs = set() # The list of all programs that have been searched for. self.searched_programs = set() # The list of all programs that have been searched for.
self.dependency_overrides = PerMachine({}, {}) self.dependency_overrides = PerMachine({}, {})
def get_build_targets(self):
build_targets = OrderedDict()
for name, t in self.targets.items():
if isinstance(t, BuildTarget):
build_targets[name] = t
return build_targets
def copy(self): def copy(self):
other = Build(self.environment) other = Build(self.environment)
for k, v in self.__dict__.items(): for k, v in self.__dict__.items():

Loading…
Cancel
Save