From f35606f61ea19d1d71b670b34ed8dc108b492d7f Mon Sep 17 00:00:00 2001 From: Matthias Klumpp Date: Thu, 18 Jan 2018 03:22:41 +0100 Subject: [PATCH 1/4] Show a better error message if subproject can not be configured Previously, Meson was showing a subproject being downloaded after later claiming it doesn't exist. This patch shows the actual error to clarify why the given subproject can not be used. --- mesonbuild/interpreter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 31d7616c2..0dfe57d6a 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2339,10 +2339,10 @@ root and issuing %s. raise # If the subproject execution failed in a non-fatal way, don't raise an # exception; let the caller handle things. - except: + except Exception as e: mlog.log('Also couldn\'t find a fallback subproject in', mlog.bold(os.path.join(self.subproject_dir, dirname)), - 'for the dependency', mlog.bold(name)) + 'for the dependency', mlog.bold(name), '\nReason:', str(e)) return None dep = self.get_subproject_dep(name, dirname, varname, kwargs.get('required', True)) if not dep: From 3274f951d20de2f6fcfa78e0531f7f70d7d234a8 Mon Sep 17 00:00:00 2001 From: Matthias Klumpp Date: Thu, 18 Jan 2018 03:23:17 +0100 Subject: [PATCH 2/4] Don't fail loading subprojects if subprojects_dir is in a subdirectory --- mesonbuild/interpreter.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 0dfe57d6a..9b1b45cc2 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -33,6 +33,7 @@ from .modules import ModuleReturnValue import os, sys, shutil, uuid import re, shlex from collections import namedtuple +from pathlib import PurePath import importlib @@ -2963,11 +2964,16 @@ different subdirectory. def evaluate_subproject_info(self, path_from_source_root, subproject_dirname): depth = 0 subproj_name = '' - segs = path_from_source_root.split(os.path.sep) - while segs and segs[0] == subproject_dirname: - depth += 1 - subproj_name = segs[1] - segs = segs[2:] + segs = PurePath(path_from_source_root).parts + segs_spd = PurePath(subproject_dirname).parts + while segs and segs[0] == segs_spd[0]: + if len(segs_spd) == 1: + subproj_name = segs[1] + segs = segs[2:] + depth += 1 + else: + segs_spd = segs_spd[1:] + segs = segs[1:] return (depth, subproj_name) # Check that the indicated file is within the same subproject From b57b82eaf9fe22769eb18c09a093ea7578949dc8 Mon Sep 17 00:00:00 2001 From: Matthias Klumpp Date: Mon, 12 Feb 2018 19:03:30 +0100 Subject: [PATCH 3/4] Add test for subprojects in subdirectories --- .../contrib/subprojects/alpha/a.c | 15 +++++++++++++++ .../contrib/subprojects/alpha/meson.build | 4 ++++ .../var/subprojects/wrap_files_might_be_here | 1 + .../contrib/subprojects/beta/b.c | 14 ++++++++++++++ .../contrib/subprojects/beta/meson.build | 3 +++ .../meson.build | 7 +++++++ .../177 subproject nested subproject dirs/prog.c | 5 +++++ 7 files changed, 49 insertions(+) create mode 100644 test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/a.c create mode 100644 test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/meson.build create mode 100644 test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_here create mode 100644 test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/b.c create mode 100644 test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/meson.build create mode 100644 test cases/common/177 subproject nested subproject dirs/meson.build create mode 100644 test cases/common/177 subproject nested subproject dirs/prog.c diff --git a/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/a.c b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/a.c new file mode 100644 index 000000000..7ac3e5e57 --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/a.c @@ -0,0 +1,15 @@ +int func2(); + +#if defined _WIN32 || defined __CYGWIN__ + #define DLL_PUBLIC __declspec(dllexport) +#else + #if defined __GNUC__ + #define DLL_PUBLIC __attribute__ ((visibility("default"))) + #else + #pragma message ("Compiler does not support symbol visibility.") + #define DLL_PUBLIC + #endif +#endif + +int DLL_PUBLIC func() { return func2(); } + diff --git a/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/meson.build b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/meson.build new file mode 100644 index 000000000..12f656427 --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/meson.build @@ -0,0 +1,4 @@ +project('alpha project', 'c', subproject_dir: 'var/subprojects') + +b = subproject('beta') +l = shared_library('a', 'a.c', link_with : b.get_variable('lb')) diff --git a/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_here b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_here new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_here @@ -0,0 +1 @@ + diff --git a/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/b.c b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/b.c new file mode 100644 index 000000000..a95651bc0 --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/b.c @@ -0,0 +1,14 @@ +#if defined _WIN32 || defined __CYGWIN__ + #define DLL_PUBLIC __declspec(dllexport) +#else + #if defined __GNUC__ + #define DLL_PUBLIC __attribute__ ((visibility("default"))) + #else + #pragma message ("Compiler does not support symbol visibility.") + #define DLL_PUBLIC + #endif +#endif + +int DLL_PUBLIC func2() { + return 42; +} diff --git a/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/meson.build b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/meson.build new file mode 100644 index 000000000..ea4cc9bdf --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/meson.build @@ -0,0 +1,3 @@ +project('beta project', 'c') + +lb = shared_library('b', 'b.c') diff --git a/test cases/common/177 subproject nested subproject dirs/meson.build b/test cases/common/177 subproject nested subproject dirs/meson.build new file mode 100644 index 000000000..a4d0a9716 --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/meson.build @@ -0,0 +1,7 @@ +project('gamma project', 'c', subproject_dir: 'contrib/subprojects') + +a = subproject('alpha') +lib = a.get_variable('l') + +exe = executable('prog', 'prog.c', link_with : lib) +test('basic', exe) diff --git a/test cases/common/177 subproject nested subproject dirs/prog.c b/test cases/common/177 subproject nested subproject dirs/prog.c new file mode 100644 index 000000000..394f139eb --- /dev/null +++ b/test cases/common/177 subproject nested subproject dirs/prog.c @@ -0,0 +1,5 @@ +int func(); + +int main(int argc, char **argv) { + return func() == 42 ? 0 : 1; +} From a64a237d7214404bcd2894168bddde13126af5c0 Mon Sep 17 00:00:00 2001 From: Matthias Klumpp Date: Sat, 17 Feb 2018 23:20:26 +0100 Subject: [PATCH 4/4] Don't mention "error" in error messages Starting with VS 2017 if the output of any command run by VS contains the word Error it will interpret that as a fatal error, even if the exit error code is zero. This messes up the unit tests on VS 2017, because we sometimes want to deliberately ignore error messages. Change "Error" to "Problem" to mitigate this issue until a more permanent solution is found. --- mesonbuild/interpreter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 9b1b45cc2..524df737b 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1963,7 +1963,7 @@ to directly access options of other subprojects.''') @noKwargs def func_error(self, node, args, kwargs): self.validate_arguments(args, 1, [str]) - raise InterpreterException('Error encountered: ' + args[0]) + raise InterpreterException('Problem encountered: ' + args[0]) def detect_compilers(self, lang, need_cross_compiler): cross_comp = None