安装

通过 以下命令 调用 (自 0.47.0 版本起可用)

meson install

或作为替代方案(在旧版本的 Meson 中,使用 ninja 后端)

ninja install

默认情况下,Meson 不会安装任何内容。构建目标可以通过在定义中将其标记为可安装来进行安装。

project('install', 'c')
shared_library('mylib', 'libfile.c', install : true)

通常不需要指定安装路径等。Meson 会自动将其安装到符合标准的位置。在本例中,可执行文件将安装到安装前缀的 bin 子目录中。但是,如果你希望覆盖安装目录,可以使用 install_dir 参数。

executable('prog', 'prog.c', install : true, install_dir : 'my/special/dir')

其他安装命令如下。

install_headers('header.h', subdir : 'projname') # -> include/projname/header.h
install_man('foo.1') # -> share/man/man1/foo.1
install_data('datafile.dat', install_dir : get_option('datadir') / 'progname')
# -> share/progname/datafile.dat

install_data() 支持文件重命名 (自 0.46.0 版本起)

# file.txt -> {datadir}/{projectname}/new-name.txt
install_data('file.txt', rename : 'new-name.txt')

# file1.txt -> share/myapp/dir1/data.txt
# file2.txt -> share/myapp/dir2/data.txt
install_data(['file1.txt', 'file2.txt'],
             rename : ['dir1/data.txt', 'dir2/data.txt'],
             install_dir : 'share/myapp')

有时你可能需要直接复制整个子树。为此,可以使用 install_subdir 命令,使用方法如下。

install_subdir('mydir', install_dir : 'include') # mydir subtree -> include/mydir

大多数情况下,你希望相对于安装前缀安装文件。有时你需要超出前缀范围(例如,将文件写入 /etc 而不是 /usr/etc)。可以通过指定绝对安装路径来实现这一点。

install_data(sources : 'foo.dat', install_dir : '/etc') # -> /etc/foo.dat

自定义安装脚本

有时你需要做的不仅仅是安装基本目标。Meson 允许你指定在安装时执行的自定义脚本,从而轻松实现这一点。例如,以下脚本将在自定义目录中生成一个空文件。

#!/bin/sh

mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir"
touch "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir/file.dat"

如你所见,Meson 设置了一些环境变量来帮助你编写脚本(DESTDIR 未由 Meson 设置,它是从外部环境继承的)。除了安装前缀之外,Meson 还设置了变量 MESON_SOURCE_ROOTMESON_BUILD_ROOT

告诉 Meson 在安装时运行此脚本只需一行代码。

meson.add_install_script('myscript.sh')

参数是相对于当前子目录的脚本文件名。

以超级用户身份安装

当以非 root 用户身份构建,但通过例如 sudo ninja install 安装到 root 拥有的位置时,ninja 将尝试以 root 身份重新构建所有过期的目标。这会导致各种不良行为,因为构建输出和 ninja 内部文件将由 root 拥有。

出于多种原因,建议运行 meson install。它可以重新构建过期的目标,然后以 root 身份重新调用自身。(自 1.1.0 版本起) 此外,运行 sudo meson install 将降低权限,并以原始用户身份重新构建过期的目标,而不是以 root 身份。

(自 1.1.0 版本起) 以 root 身份重新调用将尝试猜测用户首选的以 root 身份重新运行命令的方法。优先级顺序为:sudo、doas、pkexec(polkit)。可以通过设置 $MESON_ROOT_CMD 强制使用提升工具。

DESTDIR 支持

有时你需要安装到与安装前缀不同的目录。这在构建 rpm 或 deb 包时最为常见。这可以通过 DESTDIR 环境变量来实现,使用方法与其他构建系统相同。

$ DESTDIR=/path/to/staging/area meson install

0.57.0 版本起,可以使用 --destdir 参数代替环境变量。在这种情况下,Meson 将在运行安装脚本时将 DESTDIR 设置到环境中。

0.60.0 版本起,DESTDIR--destdir 可以是相对于构建目录的路径。在执行脚本时,将设置绝对路径到环境中。

自定义安装行为

可以使用其他参数进一步自定义安装行为。

例如,如果你希望安装当前设置而不重新构建代码(默认的安装目标始终会这样做),并且只安装已更改的文件,你将在构建树中运行以下命令

$ meson install --no-rebuild --only-changed

安装标签

自 0.60.0 版本起

可以使用 meson install --tags tag1,tag2 命令行仅安装可安装文件的一部分。当指定 --tags 时,只有已用其中一个标签标记的文件才会被安装。

这旨在供打包人员(例如发行版)使用,他们通常希望拆分 libfoolibfoo-devlibfoo-doc 包。与其在每个打包系统中为每个类别重复安装文件列表,不如在一个地方直接在上游 meson.build 文件中维护它。

Meson 在某些文件上设置了预定义的标签。随着时间的推移,可能会添加更多标签,请帮助扩展知名类别列表。

  • devel:
    • static_library(),
    • install_headers(),
    • pkgconfig.generate(),
    • gnome.generate_gir() - .gir 文件,
    • gnome.generate_vapi() - .vapi 文件(自 0.64.0 版本起),
    • 安装到 libdir 中且扩展名为 .a.pc 的文件,
    • 安装到 includedir 中的文件,
    • 使用 gnome.compile_resources()gnome.genmarshal()gnome.mkenums()gnome.mkenums_simple()gnome.gdbus_codegen() 安装的生成头文件(自 0.64.0 版本起)。
  • runtime:
  • python-runtime:
    • python.install_sources().
  • man:
  • doc:
    • gnome.gtkdoc(),
    • gnome.yelp(),
    • hotdoc.generate_doc().
  • i18n:
    • i18n.gettext(),
    • qt.compile_translations(),
    • 安装到 localedir 中的文件。
  • typelib:
    • gnome.generate_gir() - .typelib 文件。
  • bin:
    • 与库捆绑在一起的脚本和可执行文件,供最终用户使用。
  • bin-devel:
    • 与库捆绑在一起的脚本和可执行文件,供开发人员使用(即构建工具)。
  • tests:
    • 安装到 installed-tests 子目录中的文件(自 0.64.0 版本起)。
  • systemtap:
    • 安装到 systemtap 子目录中的文件(自 0.64.0 版本起)。

可以使用 install_tag 关键字参数在各种函数(例如 custom_target()configure_file()install_subdir()install_data())上设置自定义安装标签。有关详细信息,请参阅参考手册中的各自文档。建议尽可能使用上述预定义标签之一。

当使用 --tags 时,未通过 Meson 自动标记或使用 install_tag 关键字参数手动标记的可安装文件将不会被安装。这些文件将在 <builddir>/meson-logs/meson-log.txt 的末尾报告,建议添加缺少的 install_tag,以便每个可安装文件都有一个标签。

搜索结果为