diff options
author | Florian "sp1rit"​ <sp1ritCS@protonmail.com> | 2022-04-23 00:02:13 +0200 |
---|---|---|
committer | Eli Schwartz <eschwartz93@gmail.com> | 2022-05-30 18:03:01 -0400 |
commit | ad8f24f232290b778dad1152583820512ecf9f63 (patch) | |
tree | 647218dcbfad61599bfcf77b3e79dd43d29e52b1 /mesonbuild/interpreter | |
parent | 37fea630338a93cf7b8b6e91a38d45431d92bc5b (diff) | |
download | meson-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.py | 22 |
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( |