aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/interpreter/interpreter.py18
-rw-r--r--test cases/unit/125 declare_dep var/meson.build7
-rw-r--r--test cases/unit/125 declare_dep var/meson_options.txt1
-rw-r--r--unittests/linuxliketests.py12
4 files changed, 28 insertions, 10 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 185bb07..bf41bfb 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -704,20 +704,18 @@ class Interpreter(InterpreterBase, HoldableObject):
version = self.project_version
d_module_versions = kwargs['d_module_versions']
d_import_dirs = self.extract_incdirs(kwargs, 'd_import_dirs')
- srcdir = Path(self.environment.source_dir)
+ srcdir = self.environment.source_dir
+ subproject_dir = os.path.abspath(os.path.join(srcdir, self.subproject_dir))
+ project_root = os.path.abspath(os.path.join(srcdir, self.root_subdir))
# convert variables which refer to an -uninstalled.pc style datadir
for k, v in variables.items():
if not v:
FeatureNew.single_use('empty variable value in declare_dependency', '1.4.0', self.subproject, location=node)
- try:
- p = Path(v)
- except ValueError:
- continue
- else:
- if not self.is_subproject() and srcdir / self.subproject_dir in p.parents:
- continue
- if p.is_absolute() and p.is_dir() and srcdir / self.root_subdir in [p] + list(Path(os.path.abspath(p)).parents):
- variables[k] = P_OBJ.DependencyVariableString(v)
+ if os.path.isabs(v) \
+ and (self.is_subproject() or not is_parent_path(subproject_dir, v)) \
+ and is_parent_path(project_root, v) \
+ and os.path.isdir(v):
+ variables[k] = P_OBJ.DependencyVariableString(v)
dep = dependencies.InternalDependency(version, incs, compile_args,
link_args, libs, libs_whole, sources, extra_files,
diff --git a/test cases/unit/125 declare_dep var/meson.build b/test cases/unit/125 declare_dep var/meson.build
new file mode 100644
index 0000000..4909b59
--- /dev/null
+++ b/test cases/unit/125 declare_dep var/meson.build
@@ -0,0 +1,7 @@
+project('foo')
+
+declare_dependency(
+ variables: {
+ 'dir': get_option('dir')
+ }
+)
diff --git a/test cases/unit/125 declare_dep var/meson_options.txt b/test cases/unit/125 declare_dep var/meson_options.txt
new file mode 100644
index 0000000..eb15ffc
--- /dev/null
+++ b/test cases/unit/125 declare_dep var/meson_options.txt
@@ -0,0 +1 @@
+option('dir', type: 'string')
diff --git a/unittests/linuxliketests.py b/unittests/linuxliketests.py
index db7068d..6b896d7 100644
--- a/unittests/linuxliketests.py
+++ b/unittests/linuxliketests.py
@@ -1862,6 +1862,18 @@ class LinuxlikeTests(BasePlatformTests):
testdir = os.path.join(self.unit_test_dir, '125 pkgsubproj')
self.init(testdir)
+ def test_unreadable_dir_in_declare_dep(self):
+ testdir = os.path.join(self.unit_test_dir, '125 declare_dep var')
+ tmpdir = Path(tempfile.mkdtemp())
+ self.addCleanup(windows_proof_rmtree, tmpdir)
+ declaredepdir = tmpdir / 'test'
+ declaredepdir.mkdir()
+ try:
+ tmpdir.chmod(0o444)
+ self.init(testdir, extra_args=f'-Ddir={declaredepdir}')
+ finally:
+ tmpdir.chmod(0o755)
+
def check_has_flag(self, compdb, src, argument):
for i in compdb:
if src in i['file']: