|
|
|
@ -31,6 +31,7 @@ from ..mesonlib import ( |
|
|
|
|
) |
|
|
|
|
from ..environment import Environment, build_filename |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def autodetect_vs_version(build: T.Optional[build.Build], interpreter: T.Optional[Interpreter]) -> backends.Backend: |
|
|
|
|
vs_version = os.getenv('VisualStudioVersion', None) |
|
|
|
|
vs_install_dir = os.getenv('VSINSTALLDIR', None) |
|
|
|
@ -61,6 +62,7 @@ def autodetect_vs_version(build: T.Optional[build.Build], interpreter: T.Optiona |
|
|
|
|
raise MesonException('Could not detect Visual Studio using VisualStudioVersion: {!r} or VSINSTALLDIR: {!r}!\n' |
|
|
|
|
'Please specify the exact backend to use.'.format(vs_version, vs_install_dir)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def split_o_flags_args(args): |
|
|
|
|
""" |
|
|
|
|
Splits any /O args and returns them. Does not take care of flags overriding |
|
|
|
@ -82,9 +84,11 @@ def split_o_flags_args(args): |
|
|
|
|
o_flags += ['/O' + f for f in flags] |
|
|
|
|
return o_flags |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def generate_guid_from_path(path, path_type): |
|
|
|
|
return str(uuid.uuid5(uuid.NAMESPACE_URL, 'meson-vs-' + path_type + ':' + str(path))).upper() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Vs2010Backend(backends.Backend): |
|
|
|
|
def __init__(self, build: T.Optional[build.Build], interpreter: T.Optional[Interpreter]): |
|
|
|
|
super().__init__(build, interpreter) |
|
|
|
@ -519,9 +523,9 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
def create_basic_project(self, target_name, *, |
|
|
|
|
temp_dir, |
|
|
|
|
guid, |
|
|
|
|
conftype = 'Utility', |
|
|
|
|
target_ext = None, |
|
|
|
|
target_platform = None): |
|
|
|
|
conftype='Utility', |
|
|
|
|
target_ext=None, |
|
|
|
|
target_platform=None): |
|
|
|
|
root = ET.Element('Project', {'DefaultTargets': "Build", |
|
|
|
|
'ToolsVersion': '4.0', |
|
|
|
|
'xmlns': 'http://schemas.microsoft.com/developer/msbuild/2003'}) |
|
|
|
@ -587,8 +591,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
|
|
|
|
|
def gen_run_target_vcxproj(self, target, ofname, guid): |
|
|
|
|
(root, type_config) = self.create_basic_project(target.name, |
|
|
|
|
temp_dir = target.get_id(), |
|
|
|
|
guid = guid) |
|
|
|
|
temp_dir=target.get_id(), |
|
|
|
|
guid=guid) |
|
|
|
|
depend_files = self.get_custom_target_depend_files(target) |
|
|
|
|
|
|
|
|
|
if not target.command: |
|
|
|
@ -621,9 +625,9 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
else: |
|
|
|
|
platform = self.platform |
|
|
|
|
(root, type_config) = self.create_basic_project(target.name, |
|
|
|
|
temp_dir = target.get_id(), |
|
|
|
|
guid = guid, |
|
|
|
|
target_platform = platform) |
|
|
|
|
temp_dir=target.get_id(), |
|
|
|
|
guid=guid, |
|
|
|
|
target_platform=platform) |
|
|
|
|
# We need to always use absolute paths because our invocation is always |
|
|
|
|
# from the target dir, not the build root. |
|
|
|
|
target.absolute_paths = True |
|
|
|
@ -874,11 +878,11 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
tfilename = os.path.splitext(target.get_filename()) |
|
|
|
|
|
|
|
|
|
(root, type_config) = self.create_basic_project(tfilename[0], |
|
|
|
|
temp_dir = target.get_id(), |
|
|
|
|
guid = guid, |
|
|
|
|
conftype = conftype, |
|
|
|
|
target_ext = tfilename[1], |
|
|
|
|
target_platform = platform) |
|
|
|
|
temp_dir=target.get_id(), |
|
|
|
|
guid=guid, |
|
|
|
|
conftype=conftype, |
|
|
|
|
target_ext=tfilename[1], |
|
|
|
|
target_platform=platform) |
|
|
|
|
|
|
|
|
|
# FIXME: Should these just be set in create_basic_project(), even if |
|
|
|
|
# irrelevant for current target? |
|
|
|
@ -952,9 +956,10 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
ET.SubElement(clconf, 'ExceptionHandling').text = 'SyncCThrow' |
|
|
|
|
elif eh.value == 'none': |
|
|
|
|
ET.SubElement(clconf, 'ExceptionHandling').text = 'false' |
|
|
|
|
else: # 'sc' or 'default' |
|
|
|
|
else: # 'sc' or 'default' |
|
|
|
|
ET.SubElement(clconf, 'ExceptionHandling').text = 'Sync' |
|
|
|
|
generated_files, custom_target_output_files, generated_files_include_dirs = self.generate_custom_generator_commands(target, root) |
|
|
|
|
generated_files, custom_target_output_files, generated_files_include_dirs = self.generate_custom_generator_commands( |
|
|
|
|
target, root) |
|
|
|
|
(gen_src, gen_hdrs, gen_objs, gen_langs) = self.split_sources(generated_files) |
|
|
|
|
(custom_src, custom_hdrs, custom_objs, custom_langs) = self.split_sources(custom_target_output_files) |
|
|
|
|
gen_src += custom_src |
|
|
|
@ -1020,8 +1025,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
# reversed is used to keep order of includes |
|
|
|
|
for i in reversed(d.get_incdirs()): |
|
|
|
|
curdir = os.path.join(d.get_curdir(), i) |
|
|
|
|
args.append('-I' + self.relpath(curdir, target.subdir)) # build dir |
|
|
|
|
args.append('-I' + os.path.join(proj_to_src_root, curdir)) # src dir |
|
|
|
|
args.append('-I' + self.relpath(curdir, target.subdir)) # build dir |
|
|
|
|
args.append('-I' + os.path.join(proj_to_src_root, curdir)) # src dir |
|
|
|
|
for i in d.get_extra_build_dirs(): |
|
|
|
|
curdir = os.path.join(d.get_curdir(), i) |
|
|
|
|
args.append('-I' + self.relpath(curdir, target.subdir)) # build dir |
|
|
|
@ -1175,7 +1180,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
# Link args added from the env: LDFLAGS, or the cross file. We want |
|
|
|
|
# these to override all the defaults but not the per-target link |
|
|
|
|
# args. |
|
|
|
|
extra_link_args += self.environment.coredata.get_external_link_args(target.for_machine, compiler.get_language()) |
|
|
|
|
extra_link_args += self.environment.coredata.get_external_link_args( |
|
|
|
|
target.for_machine, compiler.get_language()) |
|
|
|
|
# Only non-static built targets need link args and link dependencies |
|
|
|
|
extra_link_args += target.link_args |
|
|
|
|
# External deps must be last because target link libraries may depend on them. |
|
|
|
@ -1353,7 +1359,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
self.add_additional_options(lang, inc_cl, file_args) |
|
|
|
|
self.add_preprocessor_defines(lang, inc_cl, file_defines) |
|
|
|
|
self.add_include_dirs(lang, inc_cl, file_inc_dirs) |
|
|
|
|
ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + self.object_filename_from_source(target, s) |
|
|
|
|
ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + \ |
|
|
|
|
self.object_filename_from_source(target, s) |
|
|
|
|
for s in gen_src: |
|
|
|
|
if path_normalize_add(s, previous_sources): |
|
|
|
|
inc_cl = ET.SubElement(inc_src, 'CLCompile', Include=s) |
|
|
|
@ -1363,7 +1370,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
self.add_preprocessor_defines(lang, inc_cl, file_defines) |
|
|
|
|
self.add_include_dirs(lang, inc_cl, file_inc_dirs) |
|
|
|
|
s = File.from_built_file(target.get_subdir(), s) |
|
|
|
|
ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + self.object_filename_from_source(target, s) |
|
|
|
|
ET.SubElement(inc_cl, 'ObjectFileName').text = "$(IntDir)" + \ |
|
|
|
|
self.object_filename_from_source(target, s) |
|
|
|
|
for lang in pch_sources: |
|
|
|
|
impl = pch_sources[lang][1] |
|
|
|
|
if impl and path_normalize_add(impl, previous_sources): |
|
|
|
@ -1378,7 +1386,7 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
else: |
|
|
|
|
inc_dirs = file_inc_dirs |
|
|
|
|
self.add_include_dirs(lang, inc_cl, inc_dirs) |
|
|
|
|
#XXX: Do we need to set the object file name name here too? |
|
|
|
|
# XXX: Do we need to set the object file name name here too? |
|
|
|
|
|
|
|
|
|
previous_objects = [] |
|
|
|
|
if self.has_objects(objects, additional_objects, gen_objs): |
|
|
|
@ -1400,8 +1408,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
def gen_regenproj(self, project_name, ofname): |
|
|
|
|
guid = self.environment.coredata.regen_guid |
|
|
|
|
(root, type_config) = self.create_basic_project(project_name, |
|
|
|
|
temp_dir = 'regen-temp', |
|
|
|
|
guid = guid) |
|
|
|
|
temp_dir='regen-temp', |
|
|
|
|
guid=guid) |
|
|
|
|
|
|
|
|
|
action = ET.SubElement(root, 'ItemDefinitionGroup') |
|
|
|
|
midl = ET.SubElement(action, 'Midl') |
|
|
|
@ -1426,8 +1434,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
def gen_testproj(self, target_name, ofname): |
|
|
|
|
guid = self.environment.coredata.test_guid |
|
|
|
|
(root, type_config) = self.create_basic_project(target_name, |
|
|
|
|
temp_dir = 'test-temp', |
|
|
|
|
guid = guid) |
|
|
|
|
temp_dir='test-temp', |
|
|
|
|
guid=guid) |
|
|
|
|
|
|
|
|
|
action = ET.SubElement(root, 'ItemDefinitionGroup') |
|
|
|
|
midl = ET.SubElement(action, 'Midl') |
|
|
|
@ -1454,8 +1462,8 @@ class Vs2010Backend(backends.Backend): |
|
|
|
|
|
|
|
|
|
guid = self.environment.coredata.install_guid |
|
|
|
|
(root, type_config) = self.create_basic_project(target_name, |
|
|
|
|
temp_dir = 'install-temp', |
|
|
|
|
guid = guid) |
|
|
|
|
temp_dir='install-temp', |
|
|
|
|
guid=guid) |
|
|
|
|
|
|
|
|
|
action = ET.SubElement(root, 'ItemDefinitionGroup') |
|
|
|
|
midl = ET.SubElement(action, 'Midl') |
|
|
|
|