外部專案模組

注意:此模組的功能受 Meson 關於混合建置系統的規則約束。

這是一個實驗性模組,API 可能會變更。

新增於 0.56.0 版本

此模組允許建置使用 Meson 以外的建置系統的程式碼。此模組旨在用於在系統上找不到相依性(例如,發行版本太舊)時,作為建置 Autotools 子專案的備用方案。

專案將在 Meson 的建置目錄內以樹狀結構外部方式編譯。專案也將使用 make 的 DESTDIR 功能安裝在 Meson 的建置目錄內。在專案安裝步驟期間,該 DESTDIR 將逐字複製到所需位置。

由於 pkg.generate() 產生的 *-uninstalled.pc 檔案,外部子專案可以使用由 Meson(主要專案或其他子專案)建置的程式庫,方法是使用 pkg-config。

外部建置系統需求

  • 必須支援樹狀結構外部建置。設定腳本將在 Meson 的建置目錄內使用目前的工作目錄來調用,而不是子專案的頂層原始碼目錄。
  • 設定腳本必須在目前的工作目錄中產生一個 Makefile
  • 設定腳本必須將常見目錄(例如 prefix、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@。請注意,在 Meson 中,libdirincludedir 路徑是相對於 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 的 stdout。
  • env:要設定的環境變數,例如 ['NAME1=value1', 'NAME2=value2']、字典或 env 物件。
  • depends自 0.63.0 起,指定此專案相依於指定的目標,這些目標必須在執行 make 建置此外部專案之前建置。例如,當外部專案連結到 Meson library() 時應使用此選項,該 library() 將使用 Meson 產生的 -uninstalled.pc pkg-config 檔案來找到 configure 腳本。

傳回 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 檔案。

搜尋的結果是