compilers/gnu: Split Gnu C++ standard handling into a mixin class

So we can re-use it in the ObjC++ standards
This commit is contained in:
Dylan Baker 2024-09-06 10:08:49 -07:00
parent 30ca64a25b
commit 4f314baaf6
2 changed files with 28 additions and 14 deletions

View File

@ -25,7 +25,7 @@ from .mixins.ccrx import CcrxCompiler
from .mixins.ti import TICompiler
from .mixins.arm import ArmCompiler, ArmclangCompiler
from .mixins.visualstudio import MSVCCompiler, ClangClCompiler
from .mixins.gnu import GnuCompiler, gnu_common_warning_args, gnu_cpp_warning_args
from .mixins.gnu import GnuCompiler, GnuCPPStds, gnu_common_warning_args, gnu_cpp_warning_args
from .mixins.intel import IntelGnuLikeCompiler, IntelVisualStudioLikeCompiler
from .mixins.clang import ClangCompiler, ClangCPPStds
from .mixins.elbrus import ElbrusCompiler
@ -417,7 +417,7 @@ class ArmclangCPPCompiler(ArmclangCompiler, CPPCompiler):
return []
class GnuCPPCompiler(_StdCPPLibMixin, GnuCompiler, CPPCompiler):
class GnuCPPCompiler(_StdCPPLibMixin, GnuCPPStds, GnuCompiler, CPPCompiler):
def __init__(self, ccache: T.List[str], exelist: T.List[str], version: str, for_machine: MachineChoice, is_cross: bool,
info: 'MachineInfo',
linker: T.Optional['DynamicLinker'] = None,
@ -437,7 +437,7 @@ class GnuCPPCompiler(_StdCPPLibMixin, GnuCompiler, CPPCompiler):
def get_options(self) -> 'MutableKeyedOptionDictType':
key = self.form_compileropt_key('std')
opts = CPPCompiler.get_options(self)
opts = super().get_options()
self.update_options(
opts,
self.create_option(options.UserComboOption,
@ -454,17 +454,6 @@ class GnuCPPCompiler(_StdCPPLibMixin, GnuCompiler, CPPCompiler):
'STL debug mode',
False),
)
cppstd_choices = [
'c++98', 'c++03', 'c++11', 'c++14', 'c++17', 'c++1z',
'c++2a', 'c++20',
]
if version_compare(self.version, '>=11.0.0'):
cppstd_choices.append('c++23')
if version_compare(self.version, '>=14.0.0'):
cppstd_choices.append('c++26')
std_opt = opts[key]
assert isinstance(std_opt, options.UserStdOption), 'for mypy'
std_opt.set_versions(cppstd_choices, gnu=True)
if self.info.is_windows() or self.info.is_cygwin():
self.update_options(
opts,

View File

@ -657,3 +657,28 @@ class GnuCStds(Compiler):
assert isinstance(std_opt, UserStdOption), 'for mypy'
std_opt.set_versions(stds, gnu=True)
return opts
class GnuCPPStds(Compiler):
"""Mixin class for GNU based compilers for setting CPP standards."""
_CPP23_VERSION = '>=11.0.0'
_CPP26_VERSION = '>=14.0.0'
def get_options(self) -> MutableKeyedOptionDictType:
opts = super().get_options()
stds = [
'c++98', 'c++03', 'c++11', 'c++14', 'c++17', 'c++1z',
'c++2a', 'c++20',
]
if mesonlib.version_compare(self.version, self._CPP23_VERSION):
stds.append('c++23')
if mesonlib.version_compare(self.version, self._CPP26_VERSION):
stds.append('c++26')
key = self.form_compileropt_key('std')
std_opt = opts[key]
assert isinstance(std_opt, UserStdOption), 'for mypy'
std_opt.set_versions(stds, gnu=True)
return opts