外部项目模块

注意:该模块的功能受 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] 设置 PATHLD_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@。请注意,libdirincludedir 路径相对于 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 以构建此外部项目之前构建。这应在外部项目链接到 Meson library() 时使用,例如,配置脚本将使用 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 文件。

搜索结果为