安裝

透過以下命令呼叫 (自 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 身分重新呼叫將會嘗試猜測使用者重新執行命令的首選方法。優先順序為: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 套件。無需在每個封裝系統中重複每個類別的已安裝檔案列表,而是可以直接在 upstream 的 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 版起)。

可以使用各種函數(例如 custom_target()configure_file()install_subdir()install_data())上的 install_tag 關鍵字引數來設定自訂安裝標籤。有關詳細資訊,請參閱參考手冊中各自的說明文件。建議盡可能使用上述預定義的標籤之一。

當使用 --tags 時,Meson 自動標記或使用 install_tag 關鍵字引數手動標記的可安裝檔案將不會被安裝。它們會在 <builddir>/meson-logs/meson-log.txt 的末尾報告,建議新增遺失的 install_tag 以在每個可安裝檔案上都有標籤。

搜尋結果為