From b29df2626723000039281a0238ca5d97b73bee7b Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 8 May 2021 00:23:11 +0300 Subject: Make objective C use C standard version. Closes #5495. --- docs/markdown/snippets/objcversion.md | 6 ++++++ mesonbuild/compilers/objc.py | 20 +++++++++++++++++++- mesonbuild/compilers/objcpp.py | 21 ++++++++++++++++++++- run_unittests.py | 15 +++++++++++++++ test cases/objc/1 simple/meson.build | 2 +- test cases/objcpp/1 simple/meson.build | 2 +- 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 docs/markdown/snippets/objcversion.md diff --git a/docs/markdown/snippets/objcversion.md b/docs/markdown/snippets/objcversion.md new file mode 100644 index 0000000..9825c80 --- /dev/null +++ b/docs/markdown/snippets/objcversion.md @@ -0,0 +1,6 @@ +## Objective C/C++ standard versions + +Objective C and C++ compilations will from now on use the language +versions set in `c_std` and `cpp_std`, respectively. It is not +possible to set the language version separately for Objective C and +plain C. diff --git a/mesonbuild/compilers/objc.py b/mesonbuild/compilers/objc.py index 32f17ff..f707928 100644 --- a/mesonbuild/compilers/objc.py +++ b/mesonbuild/compilers/objc.py @@ -14,7 +14,8 @@ import typing as T -from ..mesonlib import MachineChoice +from .. import coredata +from ..mesonlib import MachineChoice, OptionKey from .compilers import Compiler from .mixins.clike import CLikeCompiler @@ -84,6 +85,23 @@ class ClangObjCCompiler(ClangCompiler, ObjCCompiler): '2': default_warn_args + ['-Wextra'], '3': default_warn_args + ['-Wextra', '-Wpedantic']} + def get_options(self) -> 'KeyedOptionDictType': + opts = super().get_options() + opts.update({ + OptionKey('std', machine=self.for_machine, lang='c'): coredata.UserComboOption( + 'C language standard to use', + ['none', 'c89', 'c99', 'c11', 'c17'], + 'none', + ) + }) + return opts + + def get_option_compile_args(self, options: 'KeyedOptionDictType') -> T.List[str]: + args = [] + std = options[OptionKey('std', machine=self.for_machine, lang='c')] + if std.value != 'none': + args.append('-std=' + std.value) + return args class AppleClangObjCCompiler(ClangObjCCompiler): diff --git a/mesonbuild/compilers/objcpp.py b/mesonbuild/compilers/objcpp.py index 003da54..dbf5ba7 100644 --- a/mesonbuild/compilers/objcpp.py +++ b/mesonbuild/compilers/objcpp.py @@ -14,7 +14,8 @@ import typing as T -from ..mesonlib import MachineChoice +from .. import coredata +from ..mesonlib import MachineChoice, OptionKey from .mixins.clike import CLikeCompiler from .compilers import Compiler @@ -85,6 +86,24 @@ class ClangObjCPPCompiler(ClangCompiler, ObjCPPCompiler): '3': default_warn_args + ['-Wextra', '-Wpedantic']} + def get_options(self) -> 'KeyedOptionDictType': + opts = super().get_options() + opts.update({ + OptionKey('std', machine=self.for_machine, lang='cpp'): coredata.UserComboOption( + 'C++ language standard to use', + ['none', 'c++98', 'c++11', 'c++14', 'c++17'], + 'none', + ) + }) + return opts + + def get_option_compile_args(self, options: 'KeyedOptionDictType') -> T.List[str]: + args = [] + std = options[OptionKey('std', machine=self.for_machine, lang='cpp')] + if std.value != 'none': + args.append('-std=' + std.value) + return args + class AppleClangObjCPPCompiler(ClangObjCPPCompiler): diff --git a/run_unittests.py b/run_unittests.py index 1556b10..31debf1 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -1725,6 +1725,9 @@ class BasePlatformTests(unittest.TestCase): self.unit_test_dir = os.path.join(src_root, 'test cases/unit') self.rewrite_test_dir = os.path.join(src_root, 'test cases/rewrite') self.linuxlike_test_dir = os.path.join(src_root, 'test cases/linuxlike') + self.objc_test_dir = os.path.join(src_root, 'test cases/objc') + self.objcpp_test_dir = os.path.join(src_root, 'test cases/objcpp') + # Misc stuff self.orig_env = os.environ.copy() if self.backend is Backend.ninja: @@ -6452,6 +6455,18 @@ class DarwinTests(BasePlatformTests): env = {'CFLAGS': '-L/tmp -L /var/tmp -headerpad_max_install_names -Wl,-export_dynamic -framework Foundation'} self.init(testdir, override_envvars=env) + def test_objc_versions(self): + # Objective-C always uses the C standard version. + # Objecttive-C++ always uses the C++ standard version. + # This is what most people seem to want and in addition + # it is the only setup supported by Xcode. + testdir = os.path.join(self.objc_test_dir, '1 simple') + self.init(testdir) + self.assertIn('-std=c99', self.get_compdb()[0]['command']) + self.wipe() + testdir = os.path.join(self.objcpp_test_dir, '1 simple') + self.init(testdir) + self.assertIn('-std=c++14', self.get_compdb()[0]['command']) @unittest.skipUnless(not is_windows(), "requires something Unix-like") class LinuxlikeTests(BasePlatformTests): diff --git a/test cases/objc/1 simple/meson.build b/test cases/objc/1 simple/meson.build index b004e6b..f9d5c14 100644 --- a/test cases/objc/1 simple/meson.build +++ b/test cases/objc/1 simple/meson.build @@ -1,4 +1,4 @@ -project('objective c', 'objc') +project('objective c', 'objc', default_options: ['c_std=c99']) exe = executable('prog', 'prog.m') test('objctest', exe) diff --git a/test cases/objcpp/1 simple/meson.build b/test cases/objcpp/1 simple/meson.build index 7d91884..c9a5c84 100644 --- a/test cases/objcpp/1 simple/meson.build +++ b/test cases/objcpp/1 simple/meson.build @@ -1,4 +1,4 @@ -project('Objective C++', 'objcpp') +project('Objective C++', 'objcpp', default_options: 'cpp_std=c++14') exe = executable('objcppprog', 'prog.mm') test('objcpp', exe) -- cgit v1.1