教學

此頁面從頭開始展示如何為一個簡單的專案建立 Meson 建置定義。然後我們將其擴展為使用外部相依性,以展示它們如何輕鬆地整合到您的專案中。

本教學主要為 Linux 使用者編寫。它假設您的系統上已安裝 GTK 開發程式庫。在 Debian 衍生系統(例如 Ubuntu)上,可以使用以下命令安裝它們

sudo apt install libgtk-3-dev

此外,建議安裝 2.74 或更高版本的 glib 函式庫。

可以在其他平台(例如 Windows 和 macOS)上建置 GUI 應用程式,但您需要安裝所需的相依性。

最初的開始

讓我們從最基本的程式開始,經典的 hello 範例。首先,我們建立一個名為 main.c 的檔案,其中包含原始碼。它看起來像這樣。

#include <stdio.h>

//
// main is where all program execution starts
//
int main(int argc, char **argv) {
  printf("Hello there.\n");
  return 0;
}

然後,我們建立一個 Meson 建置描述,並將其放入同一個目錄中名為 meson.build 的檔案中。其內容如下。

project('tutorial', 'c')
executable('demo', 'main.c')

就是這樣。請注意,與 Autotools 不同,您不需要將任何原始碼標頭新增到原始碼清單中

現在我們準備好建置我們的應用程式。首先,我們需要透過進入原始碼目錄並發出以下命令來初始化建置。

$ meson setup builddir

我們建立一個單獨的建置目錄來保存所有編譯器的輸出。Meson 與其他一些建置系統的不同之處在於它不允許在原始碼內建置。您必須始終建立一個單獨的建置目錄。常見的慣例是將預設建置目錄放在最上層原始碼目錄的子目錄中。

執行 Meson 時,它會列印以下輸出。

The Meson build system
 version: 0.13.0-research
Source dir: /home/jpakkane/mesontutorial
Build dir: /home/jpakkane/mesontutorial/builddir
Build type: native build
Project name is "tutorial".
Using native c compiler "ccache cc". (gcc 4.8.2)
Creating build target "demo" with 1 files.

現在我們準備好建置我們的程式碼。

$ cd builddir
$ ninja

如果您的 Meson 版本高於 0.55.0,您可以使用新的與後端無關的建置命令

$ cd builddir
$ meson compile

在本文件的其餘部分,我們將使用後一種形式。

建置完可執行檔後,我們可以執行它。

$ ./demo

這會產生預期的輸出。

Hello there.

新增相依性

僅列印文字有點過時了。讓我們更新我們的程式以建立一個圖形視窗。我們將使用 GTK+ 小工具工具組。首先,我們編輯主要檔案以使用 GTK+。新版本看起來像這樣。


#include <gtk/gtk.h>

//
// Should provided the active view for a GTK application
//
static void activate(GtkApplication* app, gpointer user_data)
{
  GtkWidget *window;
  GtkWidget *label;

  window = gtk_application_window_new (app);
  label = gtk_label_new("Hello GNOME!");
  gtk_container_add (GTK_CONTAINER (window), label);
  gtk_window_set_title(GTK_WINDOW (window), "Welcome to GNOME");
  gtk_window_set_default_size(GTK_WINDOW (window), 400, 200);
  gtk_widget_show_all(window);
} // end of function activate

//
// main is where all program execution starts
//
int main(int argc, char **argv)
{
  GtkApplication *app;
  int status;

#if GLIB_CHECK_VERSION(2, 74, 0)
  app = gtk_application_new(NULL, G_APPLICATION_DEFAULT_FLAGS);
#else
  app = gtk_application_new(NULL, G_APPLICATION_FLAGS_NONE);
#endif
  g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
  status = g_application_run(G_APPLICATION(app), argc, argv);
  g_object_unref(app);

  return status;
} // end of function main

然後我們編輯 Meson 檔案,指示它尋找並使用 GTK+ 程式庫。

project('tutorial', 'c')
gtkdep = dependency('gtk+-3.0')
executable('demo', 'main.c', dependencies : gtkdep)

如果您的應用程式需要使用多個程式庫,則需要對每個程式庫使用單獨的 dependency() 呼叫,如下所示

gtkdeps = [dependency('gtk+-3.0'), dependency('gtksourceview-3.0')]

我們不需要用於目前範例。

現在我們準備好建置了。要注意的是,我們需要重新建立我們的建置目錄,執行任何神奇的命令或類似的操作。相反,我們只需鍵入與重新建置沒有任何建置系統變更的程式碼時完全相同的命令。

$ meson compile

當您第一次設定建置目錄後,就不需要再次執行 meson 命令。您始終只需執行 meson compile。Meson 會自動偵測您何時對建置定義進行了變更,並且會處理所有事情,因此使用者不必關心。在這種情況下,會產生以下輸出。

[1/1] Regenerating build files
The Meson build system
 version: 0.13.0-research
Source dir: /home/jpakkane/mesontutorial
Build dir: /home/jpakkane/mesontutorial/builddir
Build type: native build
Project name is "tutorial".
Using native c compiler "ccache cc". (gcc 4.8.2)
Found pkg-config version 0.26.
Dependency gtk+-3.0 found: YES
Creating build target "demo" with 1 files.
[1/2] Compiling c object demo.dir/main.c.o
[2/2] Linking target demo

請注意,Meson 如何注意到建置定義已變更並自動重新執行。現在可以執行程式了

$ ./demo

這會建立以下 GUI 應用程式。

GTK+ sample application screenshot

搜尋結果如下