From 06268665cd594cf2ac46433a317352029432706e Mon Sep 17 00:00:00 2001 From: Nicolas Schneider Date: Sat, 26 Jan 2019 18:54:57 +0100 Subject: [PATCH 1/3] vs: use project references in vcxproj instead of the sln file This shows dependencies clearly in the 'references' view of VS and properly propagates the dependencies when building a single vcxproj with msbuild. --- mesonbuild/backend/vs2010backend.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index 8029d58c2..fc37feca3 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -305,17 +305,9 @@ class Vs2010Backend(backends.Backend): prj[0], prj[1], prj[2]) ofile.write(prj_line) target_dict = {target.get_id(): target} - # Get direct deps - all_deps = self.get_target_deps(target_dict) # Get recursive deps recursive_deps = self.get_target_deps( target_dict, recursive=True) - ofile.write('\tProjectSection(ProjectDependencies) = ' - 'postProject\n') - for dep in all_deps.keys(): - guid = self.environment.coredata.target_guids[dep] - ofile.write('\t\t{%s} = {%s}\n' % (guid, guid)) - ofile.write('\tEndProjectSection\n') ofile.write('EndProject\n') for dep, target in recursive_deps.items(): if prj[0] in default_projlist: @@ -449,6 +441,14 @@ class Vs2010Backend(backends.Backend): pref = ET.SubElement(ig, 'ProjectReference', Include=include) ET.SubElement(pref, 'Project').text = '{%s}' % projid + def add_target_deps(self, root, target): + target_dict = {target.get_id(): target} + for name, dep in self.get_target_deps(target_dict).items(): + relpath = self.get_target_dir_relative_to(dep, target) + vcxproj = os.path.join(relpath, dep.get_id() + '.vcxproj') + tid = self.environment.coredata.target_guids[dep.get_id()] + self.add_project_reference(root, vcxproj, tid) + def create_basic_crap(self, target, guid): project_name = target.name root = ET.Element('Project', {'DefaultTargets': "Build", @@ -519,6 +519,7 @@ class Vs2010Backend(backends.Backend): ET.SubElement(customstep, 'Message').text = 'Running custom command.' ET.SubElement(root, 'Import', Project=r'$(VCTargetsPath)\Microsoft.Cpp.targets') self.add_regen_dependency(root) + self.add_target_deps(root, target) self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname) def gen_custom_target_vcxproj(self, target, ofname, guid): @@ -547,6 +548,7 @@ class Vs2010Backend(backends.Backend): ET.SubElement(root, 'Import', Project=r'$(VCTargetsPath)\Microsoft.Cpp.targets') self.generate_custom_generator_commands(target, root) self.add_regen_dependency(root) + self.add_target_deps(root, target) self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname) @classmethod @@ -1214,6 +1216,7 @@ class Vs2010Backend(backends.Backend): ET.SubElement(root, 'Import', Project=r'$(VCTargetsPath)\Microsoft.Cpp.targets') self.add_regen_dependency(root) + self.add_target_deps(root, target) self._prettyprint_vcxproj_xml(ET.ElementTree(root), ofname) def gen_regenproj(self, project_name, ofname): From 9c55e50bea0bcc1e5280e12c2413323a9a205be6 Mon Sep 17 00:00:00 2001 From: Nicolas Schneider Date: Wed, 13 Feb 2019 00:36:36 +0100 Subject: [PATCH 2/3] vs: do not automatically link dependencies --- mesonbuild/backend/vs2010backend.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index fc37feca3..d07caf34b 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -440,6 +440,10 @@ class Vs2010Backend(backends.Backend): ig = ET.SubElement(root, 'ItemGroup') pref = ET.SubElement(ig, 'ProjectReference', Include=include) ET.SubElement(pref, 'Project').text = '{%s}' % projid + # Do not link in generated .lib files from dependencies automatically. + # We only use the dependencies for ordering and link in the generated + # objects and .lib files manually. + ET.SubElement(pref, 'LinkLibraryDependencies').text = 'false' def add_target_deps(self, root, target): target_dict = {target.get_id(): target} From 907fb59f67cabfd11b2c4c9506e745cf590ac993 Mon Sep 17 00:00:00 2001 From: Nicolas Schneider Date: Wed, 13 Feb 2019 20:30:45 +0100 Subject: [PATCH 3/3] vs: link dependencies of link_whole targets Otherwise, msbuild will not create any output for targets that don't have any sources. --- mesonbuild/backend/vs2010backend.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index d07caf34b..e46dd5283 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -89,6 +89,7 @@ class Vs2010Backend(backends.Backend): self.vs_version = '2010' self.windows_target_platform_version = None self.subdirs = {} + self.handled_target_deps = {} def generate_custom_generator_commands(self, target, parent_node): generator_output_files = [] @@ -436,18 +437,22 @@ class Vs2010Backend(backends.Backend): def quote_arguments(self, arr): return ['"%s"' % i for i in arr] - def add_project_reference(self, root, include, projid): + def add_project_reference(self, root, include, projid, link_outputs=False): ig = ET.SubElement(root, 'ItemGroup') pref = ET.SubElement(ig, 'ProjectReference', Include=include) ET.SubElement(pref, 'Project').text = '{%s}' % projid - # Do not link in generated .lib files from dependencies automatically. - # We only use the dependencies for ordering and link in the generated - # objects and .lib files manually. - ET.SubElement(pref, 'LinkLibraryDependencies').text = 'false' + if not link_outputs: + # Do not link in generated .lib files from dependencies automatically. + # We only use the dependencies for ordering and link in the generated + # objects and .lib files manually. + ET.SubElement(pref, 'LinkLibraryDependencies').text = 'false' def add_target_deps(self, root, target): target_dict = {target.get_id(): target} for name, dep in self.get_target_deps(target_dict).items(): + if dep.get_id() in self.handled_target_deps[target.get_id()]: + # This dependency was already handled manually. + continue relpath = self.get_target_dir_relative_to(dep, target) vcxproj = os.path.join(relpath, dep.get_id() + '.vcxproj') tid = self.environment.coredata.target_guids[dep.get_id()] @@ -722,6 +727,7 @@ class Vs2010Backend(backends.Backend): mlog.debug('Generating vcxproj %s.' % target.name) entrypoint = 'WinMainCRTStartup' subsystem = 'Windows' + self.handled_target_deps[target.get_id()] = [] if isinstance(target, build.Executable): conftype = 'Application' if not target.gui_app: @@ -1111,7 +1117,10 @@ class Vs2010Backend(backends.Backend): trelpath = self.get_target_dir_relative_to(t, target) tvcxproj = os.path.join(trelpath, t.get_id() + '.vcxproj') tid = self.environment.coredata.target_guids[t.get_id()] - self.add_project_reference(root, tvcxproj, tid) + self.add_project_reference(root, tvcxproj, tid, link_outputs=True) + # Mark the dependency as already handled to not have + # multiple references to the same target. + self.handled_target_deps[target.get_id()].append(t.get_id()) else: # Other libraries go into AdditionalDependencies if linkname not in additional_links: