You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:10:51