aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/coredata.py36
1 files changed, 17 insertions, 19 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 2bb89a2..4a84467 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -549,14 +549,13 @@ class CoreData:
def sanitize_dir_option_value(self, prefix: str, option: OptionKey, value: T.Any) -> T.Any:
'''
- If the option is an installation directory option and the value is an
- absolute path, check that it resides within prefix and return the value
- as a path relative to the prefix.
+ If the option is an installation directory option, the value is an
+ absolute path and resides within prefix, return the value
+ as a path relative to the prefix. Otherwise, return it as is.
- This way everyone can do f.ex, get_option('libdir') and be sure to get
- the library directory relative to prefix.
-
- .as_posix() keeps the posix-like file separators Meson uses.
+ This way everyone can do f.ex, get_option('libdir') and usually get
+ the library directory relative to prefix, even though it really
+ should not be relied upon.
'''
try:
value = PurePath(value)
@@ -564,21 +563,20 @@ class CoreData:
return value
if option.name.endswith('dir') and value.is_absolute() and \
option not in BULITIN_DIR_NOPREFIX_OPTIONS:
- # Value must be a subdir of the prefix
- # commonpath will always return a path in the native format, so we
- # must use pathlib.PurePath to do the same conversion before
- # comparing.
- msg = ('The value of the \'{!s}\' option is \'{!s}\' which must be a '
- 'subdir of the prefix {!r}.\nNote that if you pass a '
- 'relative path, it is assumed to be a subdir of prefix.')
- # os.path.commonpath doesn't understand case-insensitive filesystems,
- # but PurePath().relative_to() does.
try:
+ # Try to relativize the path.
value = value.relative_to(prefix)
except ValueError:
- raise MesonException(msg.format(option, value, prefix))
- if '..' in str(value):
- raise MesonException(msg.format(option, value, prefix))
+ # Path is not relative, let’s keep it as is.
+ pass
+ if '..' in value.parts:
+ raise MesonException(
+ f'The value of the \'{option}\' option is \'{value}\' but '
+ 'directory options are not allowed to contain \'..\'.\n'
+ f'If you need a path outside of the {prefix!r} prefix, '
+ 'please use an absolute path.'
+ )
+ # .as_posix() keeps the posix-like file separators Meson uses.
return value.as_posix()
def init_builtins(self, subproject: str) -> None: