深入教學

在本教學中,我們將設定一個具有多個目標、單元測試和目標之間依賴關係的專案。我們的主要產品是一個名為 foo 的共享函式庫,它是用 C++11 編寫的。我們將忽略原始碼檔案的內容,因為從建置定義的角度來看,它們並不是真正重要的。該函式庫使用了 GLib 函式庫,因此我們需要正確地偵測並連結它。我們也將使生成的函式庫可安裝。

原始碼樹包含三個子目錄 srcincludetest,它們分別包含我們專案的原始碼、標頭和單元測試。

首先,這是頂層的 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

搜尋結果為