aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter
diff options
context:
space:
mode:
authorFlorian "sp1rit"​ <sp1ritCS@protonmail.com>2022-04-23 00:02:13 +0200
committerEli Schwartz <eschwartz93@gmail.com>2022-05-30 18:03:01 -0400
commitad8f24f232290b778dad1152583820512ecf9f63 (patch)
tree647218dcbfad61599bfcf77b3e79dd43d29e52b1 /mesonbuild/interpreter
parent37fea630338a93cf7b8b6e91a38d45431d92bc5b (diff)
downloadmeson-ad8f24f232290b778dad1152583820512ecf9f63.zip
meson-ad8f24f232290b778dad1152583820512ecf9f63.tar.gz
meson-ad8f24f232290b778dad1152583820512ecf9f63.tar.bz2
Implement `preserve_path` for install_headers
The `install_headers` function now has an optional argument `preserve_path` that allows installing multi-directory headerfile structures that live alongside sourcecode with a single command. For example, the headerfile structure headers = [ 'one.h', 'two.h', 'alpha/one.h', 'alpha/two.h', 'alpha/three.h' 'beta/one.h' ] can now be passed to `install_headers(headers, subdir: 'mylib', preserve_path: true)` and the resulting directory tree will look like {prefix} └── include    └── mylib       ├── alpha       │   ├── one.h       │   ├── two.h       │   └── three.h       ├── beta       │   └── one.h       ├── one.h       └── two.h Fixes #3371
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r--mesonbuild/interpreter/interpreter.py22
1 files changed, 18 insertions, 4 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 7b87843c..af83c0e54 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -2091,6 +2091,7 @@ class Interpreter(InterpreterBase, HoldableObject):
@typed_kwargs(
'install_headers',
KwargInfo('install_dir', (str, NoneType)),
+ KwargInfo('preserve_path', bool, default=False, since='0.63.0'),
KwargInfo('subdir', (str, NoneType)),
INSTALL_MODE_KW.evolve(since='0.47.0'),
)
@@ -2104,12 +2105,25 @@ class Interpreter(InterpreterBase, HoldableObject):
raise InterpreterException('install_headers: cannot specify both "install_dir" and "subdir". Use only "install_dir".')
if os.path.isabs(install_subdir):
mlog.deprecation('Subdir keyword must not be an absolute path. This will be a hard error in the next release.')
+ else:
+ install_subdir = ''
+
+ dirs = collections.defaultdict(list)
+ ret_headers = []
+ if kwargs['preserve_path']:
+ for file in source_files:
+ dirname = os.path.dirname(file.fname)
+ dirs[dirname].append(file)
+ else:
+ dirs[''].extend(source_files)
- h = build.Headers(source_files, install_subdir, kwargs['install_dir'],
- kwargs['install_mode'], self.subproject)
- self.build.headers.append(h)
+ for childdir in dirs:
+ h = build.Headers(dirs[childdir], os.path.join(install_subdir, childdir), kwargs['install_dir'],
+ kwargs['install_mode'], self.subproject)
+ ret_headers.append(h)
+ self.build.headers.append(h)
- return h
+ return ret_headers
@typed_pos_args('install_man', varargs=(str, mesonlib.File))
@typed_kwargs(