diff options
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 18 | ||||
-rw-r--r-- | test cases/unit/125 declare_dep var/meson.build | 7 | ||||
-rw-r--r-- | test cases/unit/125 declare_dep var/meson_options.txt | 1 | ||||
-rw-r--r-- | unittests/linuxliketests.py | 12 |
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']: |