チュートリアル

このページでは、単純なプロジェクトのMesonビルド定義を作成する方法を最初から紹介します。その後、外部依存関係を使用して、それらをどのように簡単にプロジェクトに統合できるかを示します。

このチュートリアルは主にLinuxの使用向けに書かれています。GTK開発ライブラリがシステムで利用できることを想定しています。UbuntuなどのDebianベースのシステムでは、次のコマンドでインストールできます。

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

検索の結果は