Meson中CMake FetchContent的等效实现及GitHub依赖获取方法
Meson中替代CMake FetchContent的方案
Meson里和CMake FetchContent 功能对等的是子项目(Subprojects) 结合Wrap 机制,能自动下载、构建并集成外部依赖,不管依赖用的是什么构建系统。
1. 对应FetchContent_Declare:编写Wrap文件
在项目根目录的subprojects文件夹下新建some_dep.wrap文件,内容如下:
[wrap-git] url = https://github.com/some/repo revision = sometag source_subdir = src
url:对应CMake的GIT_REPOSITORY,填写Git仓库地址revision:对应CMake的GIT_TAG,可以是标签、分支名或者提交哈希source_subdir:对应CMake的SOURCE_SUBDIR,指定仓库里实际存放代码的子目录
2. 对应FetchContent_MakeAvailable:集成并构建依赖
根据依赖的构建系统类型,分两种情况处理:
情况A:依赖本身用Meson构建
如果依赖自带meson.build,直接在主项目的meson.build里添加这段代码:
# 加载子项目并自动构建,获取依赖对象 some_dep = subproject('some_dep').dependency('some_dep') # 在你的目标中使用该依赖 executable('my_app', 'main.c', dependencies: some_dep)
情况B:依赖用其他构建系统(比如CMake、Makefile)
如果依赖没有Meson配置,需要在subprojects/some_dep目录下手动编写meson.build,用Meson的模块适配外部构建系统:
示例:依赖是CMake项目
# 导入Meson的CMake模块 cmake = import('cmake') # 初始化CMake子项目,指向wrap文件指定的源码子目录 some_dep_cmake = cmake.subproject('some_dep') # 获取CMake导出的依赖目标 some_dep_dep = some_dep_cmake.dependency('some_dep')
然后在主项目的meson.build里:
# 加载子项目 some_dep_sub = subproject('some_dep', required: true) # 获取刚才定义的依赖对象 some_dep = some_dep_sub.get_variable('some_dep_dep') # 将依赖应用到你的目标 executable('my_app', 'main.c', dependencies: some_dep)
示例:依赖是Makefile项目
# 自定义Make构建步骤,生成静态库 some_dep_lib = static_library( 'some_dep', build_by_default: true, command: [ 'make', '-C', meson.current_source_dir(), 'INSTALL_DIR=' + meson.current_build_dir() ], output: ['libsome_dep.a'] ) # 把库封装成Meson可识别的依赖对象 some_dep_dep = declare_dependency( link_with: some_dep_lib, include_directories: include_directories('include') )
主项目里同样通过subproject获取这个依赖即可。
内容的提问来源于stack exchange,提问作者prnvbn
相关产品推荐
相关产品推荐

