From ae0f4ef055de22996808714d3c42017605a18b3a Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Thu, 28 Dec 2017 10:14:30 +0530 Subject: [PATCH] compilers: Fix error when objc/objc++ compilers are not found Earlier it would exit with a traceback: UnboundLocalError: local variable 'out' referenced before assignment --- mesonbuild/environment.py | 2 ++ run_unittests.py | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 858d31d48..0c9a2f3ef 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -608,6 +608,7 @@ class Environment: p, out, err = Popen_safe(compiler + arg) except OSError as e: popen_exceptions[' '.join(compiler + arg)] = e + continue version = search_version(out) if 'Free Software Foundation' in out: defines = self.get_gnu_compiler_defines(compiler) @@ -634,6 +635,7 @@ class Environment: p, out, err = Popen_safe(compiler + arg) except OSError as e: popen_exceptions[' '.join(compiler + arg)] = e + continue version = search_version(out) if 'Free Software Foundation' in out: defines = self.get_gnu_compiler_defines(compiler) diff --git a/run_unittests.py b/run_unittests.py index cf229dae0..61ee7708a 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -37,7 +37,7 @@ from mesonbuild.interpreter import ObjectHolder from mesonbuild.mesonlib import is_linux, is_windows, is_osx, is_cygwin, windows_proof_rmtree from mesonbuild.mesonlib import python_command, meson_command, version_compare from mesonbuild.environment import Environment -from mesonbuild.dependencies import DependencyException +from mesonbuild.mesonlib import MesonException, EnvironmentException from mesonbuild.dependencies import PkgConfigDependency, ExternalProgram from run_tests import exe_suffix, get_fake_options @@ -1744,7 +1744,7 @@ class FailureTests(BasePlatformTests): f.write(contents) # Force tracebacks so we can detect them properly os.environ['MESON_FORCE_BACKTRACE'] = '1' - with self.assertRaisesRegex(DependencyException, match, msg=contents): + with self.assertRaisesRegex(MesonException, match, msg=contents): # Must run in-process or we'll get a generic CalledProcessError self.init(self.srcdir, extra_args=extra_args, inprocess=True) @@ -1865,6 +1865,21 @@ class FailureTests(BasePlatformTests): out, r'In subproject one: Unknown command line options: "one:two"') + def test_objc_cpp_detection(self): + ''' + Test that when we can't detect objc or objcpp, we fail gracefully. + ''' + env = Environment('', self.builddir, self.meson_command, + get_fake_options(self.prefix), []) + try: + objc = env.detect_objc_compiler(False) + objcpp = env.detect_objcpp_compiler(False) + except EnvironmentException: + code = "add_languages('objc')\nadd_languages('objcpp')" + self.assertMesonRaises(code, "Unknown compiler") + return + raise unittest.SkipTest("objc and objcpp found, can't test detection failure") + class WindowsTests(BasePlatformTests): '''