Merge pull request #2943 from ximion/master

Don't fail loading subprojects if subprojects_dir is in a subdirectory
pull/3090/head
Jussi Pakkanen 7 years ago committed by GitHub
commit 1841d53a84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      mesonbuild/interpreter.py
  2. 15
      test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/a.c
  3. 4
      test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/meson.build
  4. 1
      test cases/common/177 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_here
  5. 14
      test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/b.c
  6. 3
      test cases/common/177 subproject nested subproject dirs/contrib/subprojects/beta/meson.build
  7. 7
      test cases/common/177 subproject nested subproject dirs/meson.build
  8. 5
      test cases/common/177 subproject nested subproject dirs/prog.c

@ -33,6 +33,7 @@ from .modules import ModuleReturnValue
import os, sys, shutil, uuid import os, sys, shutil, uuid
import re, shlex import re, shlex
from collections import namedtuple from collections import namedtuple
from pathlib import PurePath
import importlib import importlib
@ -1981,7 +1982,7 @@ to directly access options of other subprojects.''')
@noKwargs @noKwargs
def func_error(self, node, args, kwargs): def func_error(self, node, args, kwargs):
self.validate_arguments(args, 1, [str]) 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): def detect_compilers(self, lang, need_cross_compiler):
cross_comp = None cross_comp = None
@ -2358,10 +2359,10 @@ root and issuing %s.
raise raise
# If the subproject execution failed in a non-fatal way, don't raise an # If the subproject execution failed in a non-fatal way, don't raise an
# exception; let the caller handle things. # exception; let the caller handle things.
except: except Exception as e:
mlog.log('Also couldn\'t find a fallback subproject in', mlog.log('Also couldn\'t find a fallback subproject in',
mlog.bold(os.path.join(self.subproject_dir, dirname)), 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 return None
dep = self.get_subproject_dep(name, dirname, varname, kwargs.get('required', True)) dep = self.get_subproject_dep(name, dirname, varname, kwargs.get('required', True))
if not dep: if not dep:
@ -2982,11 +2983,16 @@ different subdirectory.
def evaluate_subproject_info(self, path_from_source_root, subproject_dirname): def evaluate_subproject_info(self, path_from_source_root, subproject_dirname):
depth = 0 depth = 0
subproj_name = '' subproj_name = ''
segs = path_from_source_root.split(os.path.sep) segs = PurePath(path_from_source_root).parts
while segs and segs[0] == subproject_dirname: segs_spd = PurePath(subproject_dirname).parts
depth += 1 while segs and segs[0] == segs_spd[0]:
subproj_name = segs[1] if len(segs_spd) == 1:
segs = segs[2:] subproj_name = segs[1]
segs = segs[2:]
depth += 1
else:
segs_spd = segs_spd[1:]
segs = segs[1:]
return (depth, subproj_name) return (depth, subproj_name)
# Check that the indicated file is within the same subproject # Check that the indicated file is within the same subproject

@ -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(); }

@ -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'))

@ -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;
}

@ -0,0 +1,3 @@
project('beta project', 'c')
lb = shared_library('b', 'b.c')

@ -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)

@ -0,0 +1,5 @@
int func();
int main(int argc, char **argv) {
return func() == 42 ? 0 : 1;
}
Loading…
Cancel
Save