diff options
| author | Jussi Pakkanen <jussi.pakkanen@mailbox.org> | 2025-11-10 11:48:06 +0200 |
|---|---|---|
| committer | Jussi Pakkanen <jussi.pakkanen@mailbox.org> | 2025-11-23 16:04:33 +0200 |
| commit | c52e6c92b08d28048047fa5642f16530bc81c5d7 (patch) | |
| tree | 0f6001cfd92eb0c7a65ded81818f85a9242f352c | |
| parent | 35193dd8e4f2a24ae689eeb8d01a2c3bcca11025 (diff) | |
| download | meson-c52e6c92b08d28048047fa5642f16530bc81c5d7.tar.gz | |
Add import std support to MSVC.
| -rw-r--r-- | mesonbuild/backend/ninjabackend.py | 17 | ||||
| -rw-r--r-- | mesonbuild/compilers/cpp.py | 7 | ||||
| -rw-r--r-- | test cases/common/286 importstd/meson.build | 21 |
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 |
