From e3db7af0ea41ea120f9d2dfedba309522575c5e7 Mon Sep 17 00:00:00 2001 From: matyalatte Date: Sun, 7 Apr 2024 20:58:43 +0900 Subject: [PATCH] vs2010backend: fix an error when using /MANIFEST:NO --- mesonbuild/backend/vs2010backend.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/mesonbuild/backend/vs2010backend.py b/mesonbuild/backend/vs2010backend.py index 9c23571bd..2e8100884 100644 --- a/mesonbuild/backend/vs2010backend.py +++ b/mesonbuild/backend/vs2010backend.py @@ -129,6 +129,14 @@ def get_non_primary_lang_intellisense_fields(vslite_ctx: dict, defs_paths_opts_per_lang_and_buildtype[src_lang][buildtype] = Vs2010Backend._extract_nmake_fields(args_list) return defs_paths_opts_per_lang_and_buildtype +# Returns if a target generates a manifest or not. +def get_gen_manifest(target): + if isinstance(target, build.BuildTarget): + upper_args = [arg.upper() for arg in target.link_args] + manifest_args = [arg for arg in upper_args if arg == '/MANIFEST' or arg.startswith('/MANIFEST:')] + return len(manifest_args) == 0 or manifest_args[-1] != '/MANIFEST:NO' + return True + class Vs2010Backend(backends.Backend): name = 'vs2010' @@ -616,7 +624,8 @@ class Vs2010Backend(backends.Backend): guid, conftype='Utility', target_ext=None, - target_platform=None) -> T.Tuple[ET.Element, ET.Element]: + target_platform=None, + gen_manifest=True) -> T.Tuple[ET.Element, ET.Element]: root = ET.Element('Project', {'DefaultTargets': "Build", 'ToolsVersion': '4.0', 'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'}) @@ -688,13 +697,16 @@ class Vs2010Backend(backends.Backend): ET.SubElement(direlem, 'TargetExt').text = target_ext ET.SubElement(direlem, 'EmbedManifest').text = 'false' + if not gen_manifest: + ET.SubElement(direlem, 'GenerateManifest').text = 'false' return (root, type_config) def gen_run_target_vcxproj(self, target: build.RunTarget, ofname: str, guid: str) -> None: (root, type_config) = self.create_basic_project(target.name, temp_dir=target.get_id(), - guid=guid) + guid=guid, + gen_manifest=get_gen_manifest(target)) depend_files = self.get_target_depend_files(target) if not target.command: @@ -729,7 +741,8 @@ class Vs2010Backend(backends.Backend): (root, type_config) = self.create_basic_project(target.name, temp_dir=target.get_id(), guid=guid, - target_platform=platform) + target_platform=platform, + gen_manifest=get_gen_manifest(target)) # We need to always use absolute paths because our invocation is always # from the target dir, not the build root. target.absolute_paths = True @@ -769,7 +782,8 @@ class Vs2010Backend(backends.Backend): (root, type_config) = self.create_basic_project(target.name, temp_dir=target.get_id(), guid=guid, - target_platform=platform) + target_platform=platform, + gen_manifest=get_gen_manifest(target)) ET.SubElement(root, 'Import', Project=r'$(VCTargetsPath)\Microsoft.Cpp.targets') target.generated = [self.compile_target_to_generator(target)] target.sources = [] @@ -1601,7 +1615,8 @@ class Vs2010Backend(backends.Backend): guid=guid, conftype=conftype, target_ext=tfilename[1], - target_platform=platform) + target_platform=platform, + gen_manifest=get_gen_manifest(target)) generated_files, custom_target_output_files, generated_files_include_dirs = self.generate_custom_generator_commands( target, root)