外部项目模块
注意:该模块的功能受 Meson 混合构建系统规则 的约束。
这是一个实验性模块,API 可能会有所更改。
在 0.56.0 中添加
该模块允许构建使用除 Meson 之外的其他构建系统的代码。该模块旨在用于构建 Autotools 子项目作为回退,如果在系统上找不到依赖项(例如,发行版版本过旧)。
项目将在 Meson 的构建目录中进行树外编译。项目还将使用 make 的 DESTDIR
功能安装在 Meson 的构建目录中。在项目安装步骤期间,该 DESTDIR 将逐字复制到所需位置。
由于 pkg.generate()
生成的 *-uninstalled.pc
文件,外部子项目可以使用 Meson 构建的库(主项目或其他子项目)使用 pkg-config。
外部构建系统要求
- 必须支持树外构建。配置脚本将在 Meson 构建目录内调用当前工作目录,而不是子项目的顶层源目录。
- 配置脚本必须在当前工作目录中生成
Makefile
。 - 配置脚本必须将常见的目录(如前缀、libdir 等)作为命令行参数。
- 配置脚本必须支持常见的环境变量,如 CFLAGS、CC 等。
- 编译步骤必须检测何时需要重新配置,并透明地执行。
已知限制
- 来自外部项目的可执行文件不能以未安装的方式使用,因为它们需要将其库安装在最终位置。这就是没有
find_program()
方法的原因。 - 配置脚本必须生成
Makefile
,其他构建系统尚不支持。 - 在交叉编译时,如果在环境中设置了
PKG_CONFIG_SYSROOT_DIR
或在交叉文件属性中设置了sys_root
,则外部子项目将无法使用 pkg-config 找到 Meson 构建的依赖项。原因是 pkg-config 和 pkgconf 都将 sysroot 路径附加到来自-uninstalled.pc
文件的-I
和-L
参数。这可以说是一个错误,可以在将来的 pkg-config/pkgconf 版本中修复。
自 1.7.0 起,[Meson devenv][Commands.md#devenv] 设置 PATH
和 LD_LIBRARY_PATH
以便能够运行程序。
函数
add_project()
此函数应在使用另一个构建系统的项目的根目录调用。通常在放置在子项目顶层目录中的 meson.build
文件中,但也可以在任何子目录中。
它的第一个位置参数是要执行的配置脚本的名称(例如,configure
),该文件必须位于当前目录中且可执行。请注意,如果需要引导脚本(例如,从 git 而不是 tarball 构建时的 autogen.sh
),则可以使用 run_command()
在调用 add_project()
方法之前完成。
自 0.60.0 起,如果第一个位置参数是 'waf'
,则对 waf 构建系统进行特殊处理。waf 可执行文件必须在当前目录或系统 PATH
中找到。
关键字参数
-
configure_options
:要作为参数传递给配置脚本的字符串数组。某些特殊标签将在传递给配置脚本之前由 Meson 替换:@PREFIX@
、@LIBDIR@
和@INCLUDEDIR@
。请注意,libdir
和includedir
路径相对于 Meson 中的prefix
,但某些配置脚本需要绝对路径,在这种情况下,它们可以作为'--libdir=@PREFIX@/@LIBDIR@'
传递。自 0.57.0 起,如果在configure_options
中找不到某些标签,则会添加默认参数:'--prefix=@PREFIX@'
、'--libdir=@PREFIX@/@LIBDIR@'
和'--includedir=@PREFIX@/@INCLUDEDIR@'
。以前,如果未指定它们,则被视为致命错误。自 1.7.0 起,@BINDIR@
和'--bindir=@PREFIX@/@BINDIR@'
默认参数已添加。 -
cross_configure_options
:仅在交叉编译时附加到configure_options
的额外选项。特殊标签@HOST@
将被替换为'{}-{}-{}'.format(host_machine.cpu_family(), build_machine.system(), host_machine.system()
。如果省略,则默认为['--host=@HOST@']
。 -
verbose
:如果设置为true
,则配置、构建和安装项目的子命令的输出将打印到 Meson 的标准输出。 -
env
:要设置的环境变量,例如['NAME1=value1', 'NAME2=value2']
,一个字典,或一个env
对象。 -
depends
:自 0.63.0 起,指定此项目依赖于指定的目标,这些目标必须在运行make
以构建此外部项目之前构建。这应在外部项目链接到 Mesonlibrary()
时使用,例如,配置脚本将使用 Meson 生成的-uninstalled.pc
pkg-config 文件找到它。
返回一个 ExternalProject
对象
ExternalProject
对象
方法
dependency(libname)
返回一个依赖项对象,可用于针对外部项目中的库构建目标。
关键字参数
-
subdir
相对于includedir
的路径,将添加到头文件搜索路径。
子项目的示例 meson.build
文件
project('My Autotools Project', 'c',
meson_version : '>=0.56.0',
)
mod = import('unstable-external_project')
p = mod.add_project('configure',
configure_options : ['--prefix=@PREFIX@',
'--libdir=@LIBDIR@',
'--incdir=@INCLUDEDIR@',
'--enable-foo',
],
)
mylib_dep = p.dependency('mylib')
meson.override_dependency('mylib', mylib_dep)
使用 wrap 文件
大多数情况下,项目将作为子项目构建,并使用 .wrap
文件获取。在这种情况下,可以通过在 wrap 文件中添加 patch_directory=mysubproject
行,并将构建定义文件放置在 subprojects/packagefiles/mysubproject/meson.build
中来提供构建子项目所需的简单 meson.build
文件。
搜索结果为