aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers/cpp.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/compilers/cpp.py')
-rw-r--r--mesonbuild/compilers/cpp.py84
1 files changed, 47 insertions, 37 deletions
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index a089a5b..12644a2 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -14,12 +14,12 @@
import functools
import os.path
+import typing
from .. import coredata
from .. import mlog
from ..mesonlib import MesonException, version_compare
-from .c import CCompiler, VisualStudioCCompiler, ClangClCCompiler, IntelClCCompiler
from .compilers import (
gnu_winlibs,
msvc_winlibs,
@@ -31,20 +31,27 @@ from .compilers import (
ArmCompiler,
ArmclangCompiler,
CcrxCompiler,
+ Compiler,
+ VisualStudioLikeCompiler,
)
-from .c_function_attributes import CXX_FUNC_ATTRIBUTES
+from .c_function_attributes import CXX_FUNC_ATTRIBUTES, C_FUNC_ATTRIBUTES
+from .clike import CLikeCompiler
-class CPPCompiler(CCompiler):
+class CPPCompiler(CLikeCompiler, Compiler):
@classmethod
def attribute_check_func(cls, name):
- return CXX_FUNC_ATTRIBUTES.get(name, super().attribute_check_func(name))
+ try:
+ return CXX_FUNC_ATTRIBUTES.get(name, C_FUNC_ATTRIBUTES[name])
+ except KeyError:
+ raise MesonException('Unknown function attribute "{}"'.format(name))
- def __init__(self, exelist, version, is_cross, exe_wrap, **kwargs):
+ def __init__(self, exelist, version, is_cross: bool,
+ exe_wrap: typing.Optional[str] = None, **kwargs):
# If a child ObjCPP class has already set it, don't set it ourselves
- if not hasattr(self, 'language'):
- self.language = 'cpp'
- CCompiler.__init__(self, exelist, version, is_cross, exe_wrap, **kwargs)
+ self.language = 'cpp'
+ Compiler.__init__(self, exelist, version, **kwargs)
+ CLikeCompiler.__init__(self, is_cross, exe_wrap)
def get_display_language(self):
return 'C++'
@@ -350,25 +357,14 @@ class IntelCPPCompiler(IntelCompiler, CPPCompiler):
return []
-class VisualStudioCPPCompiler(VisualStudioCCompiler, CPPCompiler):
- def __init__(self, exelist, version, is_cross, exe_wrap, target):
- CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap)
- VisualStudioCCompiler.__init__(self, exelist, version, is_cross, exe_wrap, target)
- self.base_options = ['b_pch', 'b_vscrt'] # FIXME add lto, pgo and the like
+class VisualStudioLikeCPPCompilerMixin:
- def get_options(self):
- cpp_stds = ['none', 'c++11', 'vc++11']
- if self.id == 'clang-cl':
- cpp_stds.extend(['c++14', 'vc++14', 'c++17', 'vc++17', 'c++latest'])
- else:
- # Visual Studio 2015 and later
- if version_compare(self.version, '>=19'):
- cpp_stds.extend(['c++14', 'vc++14', 'c++latest', 'vc++latest'])
- # Visual Studio 2017 and later
- if version_compare(self.version, '>=19.11'):
- cpp_stds.extend(['c++17', 'vc++17'])
+ """Mixin for C++ specific method overrides in MSVC-like compilers."""
- opts = CPPCompiler.get_options(self)
+ def get_option_link_args(self, options):
+ return options['cpp_winlibs'].value[:]
+
+ def _get_options_impl(self, opts, cpp_stds: typing.List[str]):
opts.update({'cpp_eh': coredata.UserComboOption('cpp_eh',
'C++ exception handling type.',
['none', 'a', 's', 'sc', 'default'],
@@ -423,24 +419,38 @@ class VisualStudioCPPCompiler(VisualStudioCCompiler, CPPCompiler):
return args
- def get_option_link_args(self, options):
- return options['cpp_winlibs'].value[:]
-
def get_compiler_check_args(self):
- # Visual Studio C++ compiler doesn't support -fpermissive,
- # so just use the plain C args.
- return VisualStudioCCompiler.get_compiler_check_args(self)
+ # XXX: this is a hack because so much GnuLike stuff is in the base CPPCompiler class.
+ return CLikeCompiler.get_compiler_check_args(self)
+
-class ClangClCPPCompiler(VisualStudioCPPCompiler, ClangClCCompiler):
+class VisualStudioCPPCompiler(VisualStudioLikeCPPCompilerMixin, VisualStudioLikeCompiler, CPPCompiler):
def __init__(self, exelist, version, is_cross, exe_wrap, target):
- VisualStudioCPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, target)
- self.id = 'clang-cl'
+ CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap)
+ VisualStudioLikeCompiler.__init__(self, target)
+ self.base_options = ['b_pch', 'b_vscrt'] # FIXME add lto, pgo and the like
+ self.id = 'msvc'
+
+ def get_options(self):
+ cpp_stds = ['none', 'c++11', 'vc++11']
+ # Visual Studio 2015 and later
+ if version_compare(self.version, '>=19'):
+ cpp_stds.extend(['c++14', 'vc++14', 'c++latest', 'vc++latest'])
+ # Visual Studio 2017 and later
+ if version_compare(self.version, '>=19.11'):
+ cpp_stds.extend(['c++17', 'vc++17'])
+ return self._get_options_impl(super().get_options(), cpp_stds)
-class IntelClCPPCompiler(VisualStudioCPPCompiler, IntelClCCompiler):
+class ClangClCPPCompiler(VisualStudioLikeCPPCompilerMixin, VisualStudioLikeCompiler, CPPCompiler):
def __init__(self, exelist, version, is_cross, exe_wrap, target):
- VisualStudioCPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, target)
- self.id = 'intel'
+ CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap)
+ VisualStudioLikeCompiler.__init__(self, target)
+ self.id = 'clang-cl'
+
+ def get_options(self):
+ cpp_stds = ['none', 'c++11', 'vc++11', 'c++14', 'vc++14', 'c++17', 'vc++17', 'c++latest']
+ return self._get_options_impl(super().get_options(), cpp_stds)
class ArmCPPCompiler(ArmCompiler, CPPCompiler):