Tutorial

Diese Seite zeigt von Grund auf, wie man eine Meson-Build-Definition für ein einfaches Projekt erstellt. Dann erweitern wir sie, um externe Abhängigkeiten zu nutzen und zu zeigen, wie einfach diese in Ihr Projekt integriert werden können.

Dieses Tutorial wurde hauptsächlich für die Linux-Nutzung geschrieben. Es wird davon ausgegangen, dass Sie GTK-Entwicklungsbibliotheken auf dem System verfügbar haben. Auf Debian-basierten Systemen wie Ubuntu können diese mit dem folgenden Befehl installiert werden

sudo apt install libgtk-3-dev

Zusätzlich wird empfohlen, die glib-Bibliothek in Version 2.74 oder höher zu haben.

Es ist möglich, die GUI-Anwendung auf anderen Plattformen wie Windows und macOS zu erstellen, aber Sie müssen die benötigten Abhängigkeiten installieren.

Der bescheidene Anfang

Beginnen wir mit dem grundlegendsten aller Programme, dem klassischen Hallo-Beispiel. Zuerst erstellen wir eine Datei main.c, die den Quellcode enthält. Sie sieht so aus.

#include <stdio.h>

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

Dann erstellen wir eine Meson-Build-Beschreibung und legen sie in einer Datei namens meson.build im selben Verzeichnis ab. Ihr Inhalt ist wie folgt.

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

Das ist alles. Beachten Sie, dass Sie im Gegensatz zu Autotools keine Header-Dateien zur Quellcode-Liste hinzufügen müssen.

Wir sind nun bereit, unsere Anwendung zu erstellen. Zuerst müssen wir den Build initialisieren, indem wir in das Quellverzeichnis wechseln und die folgenden Befehle ausführen.

$ meson setup builddir

Wir erstellen ein separates Build-Verzeichnis, um die gesamte Compiler-Ausgabe zu speichern. Meson unterscheidet sich von einigen anderen Build-Systemen dadurch, dass es keine Builds im Quellverzeichnis zulässt. Sie müssen immer ein separates Build-Verzeichnis erstellen. Übliche Konvention ist, das Standard-Build-Verzeichnis in einem Unterverzeichnis Ihres Top-Level-Quellverzeichnisses abzulegen.

Wenn Meson ausgeführt wird, gibt es die folgende Ausgabe aus.

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.

Jetzt sind wir bereit, unseren Code zu erstellen.

$ cd builddir
$ ninja

Wenn Ihre Meson-Version neuer als 0.55.0 ist, können Sie den neuen Backend-unabhängigen Build-Befehl verwenden

$ cd builddir
$ meson compile

Für den Rest dieses Dokuments werden wir die letztere Form verwenden.

Sobald die ausführbare Datei erstellt ist, können wir sie ausführen.

$ ./demo

Dies erzeugt die erwartete Ausgabe.

Hello there.

Abhängigkeiten hinzufügen

Nur Text auszugeben ist etwas altmodisch. Aktualisieren wir unser Programm, um stattdessen ein grafisches Fenster zu erstellen. Wir werden das GTK+ Widget-Toolkit verwenden. Zuerst bearbeiten wir die Hauptdatei, um GTK+ zu verwenden. Die neue Version sieht so aus.


#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

Dann bearbeiten wir die Meson-Datei und weisen sie an, die GTK+-Bibliotheken zu finden und zu verwenden.

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

Wenn Ihre App mehrere Bibliotheken verwenden muss, müssen Sie für jede separate dependency()-Aufrufe verwenden, wie folgt

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

Für das aktuelle Beispiel benötigen wir dies nicht.

Jetzt sind wir bereit zum Erstellen. Beachten Sie, dass wir unser Build-Verzeichnis nicht neu erstellen, keine magischen Befehle oder ähnliches ausführen müssen. Stattdessen tippen wir genau denselben Befehl ein, als ob wir unseren Code ohne Änderungen am Build-System neu erstellen würden.

$ meson compile

Nachdem Sie Ihr Build-Verzeichnis zum ersten Mal eingerichtet haben, müssen Sie den meson-Befehl nie wieder ausführen. Sie führen immer nur meson compile aus. Meson erkennt automatisch, wenn Sie Änderungen an den Build-Definitionen vorgenommen haben und kümmert sich um alles, sodass sich die Benutzer nicht darum kümmern müssen. In diesem Fall wird die folgende Ausgabe erzeugt.

[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

Beachten Sie, wie Meson bemerkt hat, dass sich die Build-Definition geändert hat und sich automatisch neu gestartet hat. Das Programm ist nun bereit zur Ausführung

$ ./demo

Dies erzeugt die folgende GUI-Anwendung.

GTK+ sample application screenshot

Die Ergebnisse der Suche sind