backends: Add support for build_by_default to vs2010 backend

Always generate the vcxproj file, but only add it to the build
configuration if it's either supposed to be built by default, or is
a dependency of another target that is built by default.
This commit is contained in:
Nirbheek Chauhan 2017-01-26 19:08:47 +05:30
parent 4677f37366
commit fc4e332601
3 changed files with 67 additions and 51 deletions

View File

@ -516,6 +516,29 @@ class Backend:
newargs.append(arg)
return newargs
def get_build_by_default_targets(self):
result = {}
# Get all build and custom targets that must be built by default
for name, t in self.build.get_targets().items():
if t.build_by_default or t.install or t.build_always:
result[name] = t
# Get all targets used as test executables and arguments. These must
# also be built by default. XXX: Sometime in the future these should be
# built only before running tests.
for t in self.build.get_tests():
exe = t.exe
if hasattr(exe, 'held_object'):
exe = exe.held_object
if isinstance(exe, (build.CustomTarget, build.BuildTarget)):
result[exe.get_id()] = exe
for arg in t.cmd_args:
if hasattr(arg, 'held_object'):
arg = arg.held_object
if not isinstance(arg, (build.CustomTarget, build.BuildTarget)):
continue
result[arg.get_id()] = arg
return result
def get_custom_target_provided_libraries(self, target):
libs = []
for t in target.get_generated_sources():

View File

@ -2160,34 +2160,10 @@ rule FORTRAN_DEP_HACK
elem.add_item('pool', 'console')
elem.write(outfile)
def get_build_by_default_targets(self):
result = {}
# Get all build and custom targets that must be built by default
for t in self.build.get_targets().values():
if t.build_by_default or t.install or t.build_always:
result[t] = True
# Get all targets used as test executables and arguments. These must
# also be built by default. XXX: Sometime in the future these should be
# built only before running tests.
for t in self.build.get_tests():
exe = t.exe
if hasattr(exe, 'held_object'):
exe = exe.held_object
if isinstance(exe, (build.CustomTarget, build.BuildTarget)) and exe not in result:
result[exe] = True
for arg in t.cmd_args:
if hasattr(arg, 'held_object'):
arg = arg.held_object
if not isinstance(arg, (build.CustomTarget, build.BuildTarget)):
continue
if arg not in result:
result[arg] = True
return result.keys()
def generate_ending(self, outfile):
targetlist = []
ctlist = []
for t in self.get_build_by_default_targets():
for t in self.get_build_by_default_targets().values():
if isinstance(t, build.CustomTarget):
# Create a list of all custom target outputs
for o in t.get_outputs():

View File

@ -191,35 +191,40 @@ class Vs2010Backend(backends.Backend):
result = {}
for o in obj_list:
if isinstance(o, build.ExtractedObjects):
result[o.target.get_id()] = True
return result.keys()
result[o.target.get_id()] = o.target
return result.items()
def determine_deps(self, p):
def get_target_deps(self, t, recursive=False):
all_deps = {}
target = self.build.targets[p[0]]
for target in t.values():
if isinstance(target, build.CustomTarget):
for d in target.get_target_dependencies():
all_deps[d.get_id()] = True
return all_deps
if isinstance(target, build.RunTarget):
all_deps[d.get_id()] = d
elif isinstance(target, build.RunTarget):
for d in [target.command] + target.args:
if isinstance(d, build.BuildTarget):
all_deps[d.get_id()] = True
return all_deps
if isinstance(d, (build.BuildTarget, build.CustomTarget)):
all_deps[d.get_id()] = d
# BuildTarget
else:
for ldep in target.link_targets:
all_deps[ldep.get_id()] = True
for objdep in self.get_obj_target_deps(target.objects):
all_deps[objdep] = True
for gendep in target.generated:
all_deps[ldep.get_id()] = ldep
for obj_id, objdep in self.get_obj_target_deps(target.objects):
all_deps[obj_id] = objdep
for gendep in target.get_generated_sources():
if isinstance(gendep, build.CustomTarget):
all_deps[gendep.get_id()] = True
all_deps[gendep.get_id()] = gendep
else:
gen_exe = gendep.generator.get_exe()
if isinstance(gen_exe, build.Executable):
all_deps[gen_exe.get_id()] = True
all_deps[gen_exe.get_id()] = gen_exe
if not t or not recursive:
return all_deps
ret = self.get_target_deps(all_deps, recursive)
ret.update(all_deps)
return ret
def generate_solution(self, sln_filename, projlist):
default_projlist = self.get_build_by_default_targets()
with open(sln_filename, 'w') as ofile:
ofile.write('Microsoft Visual Studio Solution File, Format '
'Version 11.00\n')
@ -229,7 +234,12 @@ class Vs2010Backend(backends.Backend):
prj_line = prj_templ % (self.environment.coredata.guid,
p[0], p[1], p[2])
ofile.write(prj_line)
all_deps = self.determine_deps(p)
target = self.build.targets[p[0]]
t = {target.get_id(): target}
# Get direct deps
all_deps = self.get_target_deps(t)
# Get recursive deps
recursive_deps = self.get_target_deps(t, recursive=True)
ofile.write('\tProjectSection(ProjectDependencies) = '
'postProject\n')
regen_guid = self.environment.coredata.regen_guid
@ -239,6 +249,9 @@ class Vs2010Backend(backends.Backend):
ofile.write('\t\t{%s} = {%s}\n' % (guid, guid))
ofile.write('EndProjectSection\n')
ofile.write('EndProject\n')
for dep, target in recursive_deps.items():
if p[0] in default_projlist:
default_projlist[dep] = target
test_line = prj_templ % (self.environment.coredata.guid,
'RUN_TESTS', 'RUN_TESTS.vcxproj',
self.environment.coredata.test_guid)
@ -264,11 +277,15 @@ class Vs2010Backend(backends.Backend):
ofile.write('\t\t{%s}.%s|%s.Build.0 = %s|%s\n' %
(self.environment.coredata.regen_guid, self.buildtype,
self.platform, self.buildtype, self.platform))
# Create the solution configuration
for p in projlist:
# Add to the list of projects in this solution
ofile.write('\t\t{%s}.%s|%s.ActiveCfg = %s|%s\n' %
(p[2], self.buildtype, self.platform,
self.buildtype, self.platform))
if not isinstance(self.build.targets[p[0]], build.RunTarget):
if p[0] in default_projlist and \
not isinstance(self.build.targets[p[0]], build.RunTarget):
# Add to the list of projects to be built
ofile.write('\t\t{%s}.%s|%s.Build.0 = %s|%s\n' %
(p[2], self.buildtype, self.platform,
self.buildtype, self.platform))