aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py30
1 files changed, 28 insertions, 2 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index e563f36..5b8f361 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -4577,6 +4577,28 @@ different subdirectory.
absdir_build = os.path.join(absbase_build, a)
if not os.path.isdir(absdir_src) and not os.path.isdir(absdir_build):
raise InvalidArguments('Include dir %s does not exist.' % a)
+ else:
+ try:
+ self.validate_within_subproject(a, '')
+ except InterpreterException:
+ mlog.warning('include_directories sandbox violation!')
+ print(f'''The project is trying to access the directory {a} which belongs to a different
+subproject. This is a problem as it hardcodes the relative paths of these two projeccts.
+This makes it impossible to compile the project in any other directory layout and also
+makes it impossible for the subproject to change its own directory layout.
+
+Instead of poking directly at the internals the subproject should be executed and
+it should set a variable that the caller can then use. Something like:
+
+# In subproject
+my_inc = include_directories('include')
+
+# In parent project
+dep_sp = subproject('sub')
+dep_inc = dep_sp.get_variable('my_inc')
+
+This warning will become a hard error in a future Meson release.
+''')
i = IncludeDirsHolder(build.IncludeDirs(self.subdir, incdir_strings, is_system))
return i
@@ -4774,6 +4796,10 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
def validate_within_subproject(self, subdir, fname):
srcdir = Path(self.environment.source_dir)
norm = Path(srcdir, subdir, fname).resolve()
+ if os.path.isdir(norm):
+ inputtype = 'directory'
+ else:
+ inputtype = 'file'
if srcdir not in norm.parents:
# Grabbing files outside the source tree is ok.
# This is for vendor stuff like:
@@ -4782,9 +4808,9 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
return
project_root = Path(srcdir, self.root_subdir)
if project_root not in norm.parents:
- raise InterpreterException(f'Sandbox violation: Tried to grab file {norm.name} outside current (sub)project.')
+ raise InterpreterException(f'Sandbox violation: Tried to grab {inputtype} {norm.name} outside current (sub)project.')
if project_root / self.subproject_dir in norm.parents:
- raise InterpreterException(f'Sandbox violation: Tried to grab file {norm.name} from a nested subproject.')
+ raise InterpreterException(f'Sandbox violation: Tried to grab {inputtype} {norm.name} from a nested subproject.')
def source_strings_to_files(self, sources: T.List[str]) -> T.List[mesonlib.File]:
mesonlib.check_direntry_issues(sources)