Warn when grabbing internals of subprojects with include_directories.
This commit is contained in:
parent
639063db7f
commit
fe4ddb5268
|
@ -4595,6 +4595,28 @@ remember that the current source and build directories are always
|
||||||
put in the include directories by default so you only need to do
|
put in the include directories by default so you only need to do
|
||||||
include_directories('.') if you intend to use the result in a
|
include_directories('.') if you intend to use the result in a
|
||||||
different subdirectory.
|
different subdirectory.
|
||||||
|
''')
|
||||||
|
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
|
||||||
|
prevents the subproject from changing 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
|
||||||
|
some_dep = declare_depencency(include_directories: include_directories('include'))
|
||||||
|
|
||||||
|
# In parent project
|
||||||
|
some_dep = depencency('some')
|
||||||
|
executable(..., dependencies: [some_dep])
|
||||||
|
|
||||||
|
This warning will become a hard error in a future Meson release.
|
||||||
''')
|
''')
|
||||||
absdir_src = os.path.join(absbase_src, a)
|
absdir_src = os.path.join(absbase_src, a)
|
||||||
absdir_build = os.path.join(absbase_build, a)
|
absdir_build = os.path.join(absbase_build, a)
|
||||||
|
@ -4797,6 +4819,10 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
|
||||||
def validate_within_subproject(self, subdir, fname):
|
def validate_within_subproject(self, subdir, fname):
|
||||||
srcdir = Path(self.environment.source_dir)
|
srcdir = Path(self.environment.source_dir)
|
||||||
norm = Path(srcdir, subdir, fname).resolve()
|
norm = Path(srcdir, subdir, fname).resolve()
|
||||||
|
if os.path.isdir(norm):
|
||||||
|
inputtype = 'directory'
|
||||||
|
else:
|
||||||
|
inputtype = 'file'
|
||||||
if srcdir not in norm.parents:
|
if srcdir not in norm.parents:
|
||||||
# Grabbing files outside the source tree is ok.
|
# Grabbing files outside the source tree is ok.
|
||||||
# This is for vendor stuff like:
|
# This is for vendor stuff like:
|
||||||
|
@ -4805,9 +4831,9 @@ Try setting b_lundef to false instead.'''.format(self.coredata.options[OptionKey
|
||||||
return
|
return
|
||||||
project_root = Path(srcdir, self.root_subdir)
|
project_root = Path(srcdir, self.root_subdir)
|
||||||
if project_root not in norm.parents:
|
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:
|
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]:
|
def source_strings_to_files(self, sources: T.List[str]) -> T.List[mesonlib.File]:
|
||||||
mesonlib.check_direntry_issues(sources)
|
mesonlib.check_direntry_issues(sources)
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
project('foo', 'c')
|
||||||
|
|
||||||
|
# This is here rather than in failing because this needs a
|
||||||
|
# transition period to avoid breaking existing projects.
|
||||||
|
# Once this becomes an error, move this under failing tests.
|
||||||
|
|
||||||
|
inc = include_directories('subprojects/sub/include')
|
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Git can not handle empty directories, so there must be something here.
|
|
@ -0,0 +1,3 @@
|
||||||
|
project('subproj', 'c')
|
||||||
|
|
||||||
|
# This is never actually executed, just here for completeness.
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"stdout": [
|
||||||
|
{
|
||||||
|
"line": "WARNING: include_directories sandbox violation!"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue