为何使用Meson构建的仅头文件库安装时未保留子目录结构?
问题原因与解决方案
问题根源
你遇到的问题核心在于Meson路径解析的基准逻辑:当你在子目录的meson.build中用files()收集文件时,文件路径会被记录为相对于当前子目录的路径;但当这些文件被汇总到根目录的project_headers变量后,调用install_headers时,preserve_path: true的基准路径是根目录的meson.build所在位置,而非每个文件的原始子目录。
举个具体例子:
- 在
include/meson.build中添加的foo.hpp,路径被记录为foo.hpp(相对include目录) - 在
include/foo/meson.build中添加的bar.hpp,路径被记录为bar.hpp(相对include/foo目录)
根目录调用install_headers时,Meson会将这两个文件都视为相对于根目录的同级文件,因此会安装到同一目录下。
解决方法
方法一:根目录直接指定完整相对路径收集文件
修改根目录meson.build,直接收集带完整相对路径的头文件:
project('foobar', 'cpp', version: '0.1.0', default_options: ['cpp_std=c++20'] ) project_headers = files( 'include/foo.hpp', 'include/foo/bar.hpp' ) install_headers(project_headers, preserve_path: true)
此时preserve_path会保留相对于根目录的路径,安装后会生成includedir/foo.hpp和includedir/foo/bar.hpp,符合预期结构。
方法二:子目录单独安装头文件
去掉根目录的install_headers调用,在每个子目录的meson.build中单独处理安装:
include/meson.build:
install_headers(files('foo.hpp'), preserve_path: true) subdir('foo')
include/foo/meson.build:
install_headers(files('bar.hpp'), preserve_path: true)
每个子目录的install_headers调用会以当前子目录为基准,preserve_path: true会保留相对路径,最终安装结构为includedir/foo.hpp和includedir/foo/bar.hpp。
方法三:直接安装整个include目录(仅头文件库推荐)
如果你的库结构固定,用install_subdir更简洁,根目录meson.build修改为:
project('foobar', 'cpp', version: '0.1.0', default_options: ['cpp_std=c++20'] ) install_subdir('include', install_dir: get_option('includedir'))
这会完整复制include目录的结构到安装路径的includedir下,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Arnab De
相关产品推荐
相关产品推荐

