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:
parent
4677f37366
commit
fc4e332601
|
@ -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():
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue