summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jussi.pakkanen@mailbox.org>2025-11-10 11:48:06 +0200
committerJussi Pakkanen <jussi.pakkanen@mailbox.org>2025-11-23 16:04:33 +0200
commitc52e6c92b08d28048047fa5642f16530bc81c5d7 (patch)
tree0f6001cfd92eb0c7a65ded81818f85a9242f352c
parent35193dd8e4f2a24ae689eeb8d01a2c3bcca11025 (diff)
downloadmeson-c52e6c92b08d28048047fa5642f16530bc81c5d7.tar.gz
Add import std support to MSVC.
-rw-r--r--mesonbuild/backend/ninjabackend.py17
-rw-r--r--mesonbuild/compilers/cpp.py7
-rw-r--r--test cases/common/286 importstd/meson.build21
3 files changed, 41 insertions, 4 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py
index fb7ac5b01..5dcf5f1e1 100644
--- a/mesonbuild/backend/ninjabackend.py
+++ b/mesonbuild/backend/ninjabackend.py
@@ -3334,6 +3334,23 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485'''))
istd_args = ['-fmodules']
istd_dep = [File(True, '', self.import_std.gen_module_file)]
return istd_args, istd_dep
+ elif compiler.id == 'msvc':
+ if self.import_std is None:
+ mod_file = 'std.ifc'
+ mod_obj_file = 'std.obj'
+ in_file = Path(os.environ['VCToolsInstallDir']) / 'modules/std.ixx'
+ if not in_file.is_file():
+ raise SystemExit('VS std import header could not be located.')
+ in_file_str = str(in_file)
+ elem = NinjaBuildElement(self.all_outputs, [mod_file, mod_obj_file], 'CUSTOM_COMMAND', [in_file_str])
+ compile_args = compiler.get_option_compile_args(target, self.environment)
+ compile_args += compiler.get_option_std_args(target, self.environment)
+ compile_args += ['/nologo', '/c', '/O2', in_file_str]
+ elem.add_item('COMMAND', compiler.exelist + compile_args)
+ self.add_build(elem)
+ self.import_std = ImportStdInfo(elem, mod_file, [mod_obj_file])
+ istd_dep = [File(True, '', self.import_std.gen_module_file)]
+ return istd_args, istd_dep
else:
raise MesonException(f'Import std not supported on compiler {compiler.id} yet.')
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 908d6dc45..bdf60f6c2 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -801,6 +801,13 @@ class VisualStudioLikeCPPCompilerMixin(CompilerMixinBase):
std_opt = opts[self.form_compileropt_key('std')]
assert isinstance(std_opt, options.UserStdOption), 'for mypy'
std_opt.set_versions(cpp_stds)
+
+ if version_compare(self.version, '>=19.44.35219'):
+ key = self.form_compileropt_key('importstd')
+ opts[key] = options.UserComboOption(self.make_option_name(key),
+ 'Use #import std.',
+ 'false',
+ choices=['false', 'true'])
return opts
def get_option_compile_args(self, target: 'BuildTarget', subproject: T.Optional[str] = None) -> T.List[str]:
diff --git a/test cases/common/286 importstd/meson.build b/test cases/common/286 importstd/meson.build
index d5221cd96..b5dd440bd 100644
--- a/test cases/common/286 importstd/meson.build
+++ b/test cases/common/286 importstd/meson.build
@@ -1,10 +1,23 @@
-project('importstd', 'cpp', default_options: {'cpp_importstd': 'true',
- 'cpp_std': 'c++23'})
+project('importstd', 'cpp', default_options: {'cpp_importstd': 'true',
+ 'cpp_std': 'c++latest,c++23,c++20'})
cpp = meson.get_compiler('cpp')
-if cpp.get_id() == 'gcc' and cpp.version().version_compare('>=15.1')
- istd_supported = true
+cpp_id = cpp.get_id()
+cpp_version = cpp.version()
+
+if cpp_id == 'gcc' and cpp_version.version_compare('>=15.1')
+ if host_machine.system() == 'windows'
+ istd_supported = cpp_version.version_compare('>=15.3')
+ else
+ if cpp_version.version_compare('=15.2.0') or cpp_version.version_compare('>=15.3.0')
+ istd_supported = true
+ else
+ istd_supported = false
+ endif
+ endif
+elif cpp_id == 'msvc' and cpp_version.version_compare('>=19.44.35219')
+ istd_supported = get_option('backend') == 'ninja'
else
istd_supported = false
endif