外部專案模組
注意:此模組的功能受 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] 設定 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@
。請注意,在 Meson 中,libdir
和includedir
路徑是相對於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
建置此外部專案之前建置。例如,當外部專案連結到 Mesonlibrary()
時應使用此選項,該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
檔案。
搜尋的結果是