深入教學
在本教學中,我們將設定一個具有多個目標、單元測試和目標之間依賴關係的專案。我們的主要產品是一個名為 foo 的共享函式庫,它是用 C++11
編寫的。我們將忽略原始碼檔案的內容,因為從建置定義的角度來看,它們並不是真正重要的。該函式庫使用了 GLib
函式庫,因此我們需要正確地偵測並連結它。我們也將使生成的函式庫可安裝。
原始碼樹包含三個子目錄 src
、include
和 test
,它們分別包含我們專案的原始碼、標頭和單元測試。
首先,這是頂層的 meson.build
檔案。
project('c++ foolib', 'cpp',
version : '1.0.0',
license : 'MIT')
add_global_arguments('-DSOME_TOKEN=value', language : 'cpp')
glib_dep = dependency('glib-2.0')
inc = include_directories('include')
subdir('include')
subdir('src')
subdir('test')
pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : foolib,
version : '1.0',
name : 'libfoobar',
filebase : 'foobar',
description : 'A Library to barnicate your foos.')
定義總是從呼叫 project
函式開始。在其中,您必須指定專案的名稱和要使用的程式語言,在本例中僅為 C++
。我們也指定了兩個額外的參數,專案的版本和它所使用的授權。我們的專案版本為 1.0.0
,並指定使用 MIT 授權。
然後我們找到 GLib,這是一個外部依賴。dependency
函式告訴 Meson 找到該函式庫(預設使用 pkg-config
)。如果找不到該函式庫,Meson 將引發錯誤並停止處理建置定義。
然後我們新增一個全域編譯器參數 -DSOME_TOKEN=value
。此標誌用於所有 C++ 原始碼檔案的編譯。不可能為某些目標取消設定它。這樣做的原因是,如果全域設定在每個目標上都發生變化,就很難追蹤正在使用哪些編譯器標誌。
由於 include
目錄包含標頭檔案,我們需要一種方法告訴編譯將該目錄新增到編譯器命令行。這可以使用 include_directories
命令來完成,該命令接收一個目錄並傳回表示該目錄的物件。它儲存在變數 inc
中,使其稍後可以存取。
之後是三個 subdir
命令。這些命令指示 Meson 前往指定的子目錄,開啟其中的 meson.build
檔案並執行它。最後幾行是用於產生 pkg-config
檔案的段落。我們現在跳過它,稍後再回到本文檔的末尾。
我們要進入的第一個子目錄是 include
。在其中,我們有一個要安裝的函式庫的標頭檔案。這需要一行。
install_headers('foolib.h')
這會將給定的標頭檔案安裝到系統的標頭目錄。預設情況下,這是 /[安裝前綴]/include
,但可以使用命令行參數變更。
src
子目錄的 Meson 定義很簡單。
foo_sources = ['source1.cpp', 'source2.cpp']
foolib = shared_library('foo',
foo_sources,
include_directories : inc,
dependencies : glib_dep,
install : true)
在這裡,我們只是告訴 Meson 使用給定的原始碼建置函式庫。我們也告訴它使用我們之前儲存在變數 inc
中的包含目錄。由於這個函式庫使用了 GLib,我們告訴 Meson 使用 dependencies
關鍵字參數新增所有必要的編譯器和連結器標誌。它的值是 glib_dep
,我們在頂層的 meson.build
檔案中設定它。install
參數告訴 Meson 安裝結果。與標頭一樣,共享函式庫會安裝到系統的預設位置(通常為 /[安裝前綴]/lib
),但同樣可以覆寫。
生成的函式庫儲存在變數 foolib
中,就像包含目錄儲存在上一個檔案中一樣。
一旦 Meson 處理了 src
子目錄,它會回到主 Meson 檔案並執行下一行,將其移動到 test
子目錄。其內容如下所示。
testexe = executable('testexe', 'footest.cpp',
include_directories : inc,
link_with : foolib)
test('foolib test', testexe)
首先,我們建置一個測試執行檔,它與主函式庫具有相同的包含目錄,並且還會連結到新建立的共享函式庫。請注意,您不需要在此處指定 glib_dep
才能使用已建置的函式庫 foolib
。如果執行檔本身使用了 GLib 功能,那麼我們當然需要在此處將其新增為關鍵字參數。
最後,我們定義一個名為 foolib test
的測試。它包括執行我們剛才建置的二進位檔。如果執行檔以零傳回值結束,則測試被視為通過。非零傳回值將測試標記為失敗。
此時,我們可以回到 pkg-config 產生器行。所有共享函式庫都應提供 pkg-config 檔案,說明如何使用該函式庫。Meson 提供了這個簡單的產生器,對於大多數簡單的專案來說應該足夠了。您只需列出一些基本資訊,Meson 就會負責產生適當的檔案。更進階的使用者可能想要使用 Meson 的 組態檔產生器系統建立自己的 pkg-config 檔案。
有了這四個檔案,我們就完成了。要設定、建置和執行測試套件,我們只需要執行以下命令(從原始碼樹的根目錄開始)。
$ meson setup builddir && cd builddir
$ meson compile
$ meson test
然後要安裝專案,您只需要一個命令。
$ meson install
搜尋結果為