Merge pull request #458 from nioncode/vs-object-extraction

vs2010: fix object extraction
pull/461/head
Jussi Pakkanen 9 years ago
commit 7844fd54d9
  1. 13
      mesonbuild/backend/backends.py
  2. 13
      mesonbuild/backend/vs2010backend.py

@ -142,7 +142,7 @@ class Backend():
return os.path.relpath(os.path.join('dummyprefixdir', todir),\ return os.path.relpath(os.path.join('dummyprefixdir', todir),\
os.path.join('dummyprefixdir', fromdir)) os.path.join('dummyprefixdir', fromdir))
def flatten_object_list(self, target, proj_dir_to_build_root=''): def flatten_object_list(self, target, proj_dir_to_build_root='', include_dir_names=True):
obj_list = [] obj_list = []
for obj in target.get_objects(): for obj in target.get_objects():
if isinstance(obj, str): if isinstance(obj, str):
@ -150,7 +150,7 @@ class Backend():
self.build_to_src, target.get_subdir(), obj) self.build_to_src, target.get_subdir(), obj)
obj_list.append(o) obj_list.append(o)
elif isinstance(obj, build.ExtractedObjects): elif isinstance(obj, build.ExtractedObjects):
obj_list += self.determine_ext_objs(obj, proj_dir_to_build_root) obj_list += self.determine_ext_objs(obj, proj_dir_to_build_root, include_dir_names)
else: else:
raise MesonException('Unknown data type in object list.') raise MesonException('Unknown data type in object list.')
return obj_list return obj_list
@ -207,7 +207,7 @@ class Backend():
return c return c
raise RuntimeError('Unreachable code') raise RuntimeError('Unreachable code')
def determine_ext_objs(self, extobj, proj_dir_to_build_root=''): def determine_ext_objs(self, extobj, proj_dir_to_build_root='', include_dir_names=True):
result = [] result = []
targetdir = self.get_target_private_dir(extobj.target) targetdir = self.get_target_private_dir(extobj.target)
suffix = '.' + self.environment.get_object_suffix() suffix = '.' + self.environment.get_object_suffix()
@ -221,7 +221,12 @@ class Backend():
if pathsegs[0] == 'subprojects': if pathsegs[0] == 'subprojects':
pathsegs = pathsegs[2:] pathsegs = pathsegs[2:]
fixedpath = os.sep.join(pathsegs) fixedpath = os.sep.join(pathsegs)
objbase = osrc.fname.replace('/', '_').replace('\\', '_') if include_dir_names:
objbase = osrc_base.replace('/', '_').replace('\\', '_')
else:
# vs2010 backend puts all obj files without directory prefixes into build dir, so just
# use the file name without a directory (will be stripped by os.path.basename() below).
objbase = osrc_base
objname = os.path.join(proj_dir_to_build_root, objname = os.path.join(proj_dir_to_build_root,
targetdir, os.path.basename(objbase) + suffix) targetdir, os.path.basename(objbase) + suffix)
result.append(objname) result.append(objname)

@ -36,7 +36,7 @@ class Vs2010Backend(backends.Backend):
super().__init__(build) super().__init__(build)
self.project_file_version = '10.0.30319.1' self.project_file_version = '10.0.30319.1'
# foo.c compiles to foo.obj, not foo.c.obj # foo.c compiles to foo.obj, not foo.c.obj
self.source_suffix_in_obj = False self.source_suffix_in_objs = False
def generate_custom_generator_commands(self, target, parent_node): def generate_custom_generator_commands(self, target, parent_node):
all_output_files = [] all_output_files = []
@ -116,7 +116,7 @@ class Vs2010Backend(backends.Backend):
result = {} result = {}
for o in obj_list: for o in obj_list:
if isinstance(o, build.ExtractedObjects): if isinstance(o, build.ExtractedObjects):
result[o.target.get_basename()] = True result[o.target.get_id()] = True
return result.keys() return result.keys()
def determine_deps(self, p): def determine_deps(self, p):
@ -492,9 +492,10 @@ class Vs2010Backend(backends.Backend):
rel_path = self.relpath(lobj.subdir, target.subdir) rel_path = self.relpath(lobj.subdir, target.subdir)
linkname = os.path.join(rel_path, lobj.get_import_filename()) linkname = os.path.join(rel_path, lobj.get_import_filename())
additional_links.append(linkname) additional_links.append(linkname)
for o in self.flatten_object_list(target, down): additional_objects = []
for o in self.flatten_object_list(target, down, include_dir_names=False):
assert(isinstance(o, str)) assert(isinstance(o, str))
additional_links.append(o) additional_objects.append(o)
if len(additional_links) > 0: if len(additional_links) > 0:
additional_links.append('%(AdditionalDependencies)') additional_links.append('%(AdditionalDependencies)')
ET.SubElement(link, 'AdditionalDependencies').text = ';'.join(additional_links) ET.SubElement(link, 'AdditionalDependencies').text = ';'.join(additional_links)
@ -549,13 +550,15 @@ class Vs2010Backend(backends.Backend):
# just the file name instead of the relative path to the file. # just the file name instead of the relative path to the file.
pch_file.text = os.path.split(header)[1] pch_file.text = os.path.split(header)[1]
if len(objects) > 0: if len(objects) + len(additional_objects) > 0:
# Do not add gen_objs to project file. Those are automatically used by MSBuild, because they are part of # Do not add gen_objs to project file. Those are automatically used by MSBuild, because they are part of
# the CustomBuildStep Outputs. # the CustomBuildStep Outputs.
inc_objs = ET.SubElement(root, 'ItemGroup') inc_objs = ET.SubElement(root, 'ItemGroup')
for s in objects: for s in objects:
relpath = s.rel_to_builddir(proj_to_src_root) relpath = s.rel_to_builddir(proj_to_src_root)
ET.SubElement(inc_objs, 'Object', Include=relpath) ET.SubElement(inc_objs, 'Object', Include=relpath)
for s in additional_objects:
ET.SubElement(inc_objs, 'Object', Include=s)
ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets') ET.SubElement(root, 'Import', Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
# Reference the regen target. # Reference the regen target.
ig = ET.SubElement(root, 'ItemGroup') ig = ET.SubElement(root, 'ItemGroup')

Loading…
Cancel
Save