Installieren

Aufgerufen über den folgenden Befehl (verfügbar seit 0.47.0)

meson install

oder alternativ (bei älteren Meson-Versionen mit ninja Backend)

ninja install

Standardmäßig installiert Meson nichts. Build-Ziele können durch Markierung als installierbar in der Definition installiert werden.

project('install', 'c')
shared_library('mylib', 'libfile.c', install : true)

Normalerweise ist es nicht notwendig, Installationspfade oder Ähnliches anzugeben. Meson installiert es automatisch an den standardkonformen Speicherort. In diesem speziellen Fall wird die ausführbare Datei in das Unterverzeichnis bin des Installationspräfixes installiert. Wenn Sie jedoch das Installationsverzeichnis überschreiben möchten, können Sie dies mit dem Argument install_dir tun.

executable('prog', 'prog.c', install : true, install_dir : 'my/special/dir')

Andere Installationsbefehle sind die folgenden.

install_headers('header.h', subdir : 'projname') # -> include/projname/header.h
install_man('foo.1') # -> share/man/man1/foo.1
install_data('datafile.dat', install_dir : get_option('datadir') / 'progname')
# -> share/progname/datafile.dat

install_data() unterstützt die Umbenennung der Datei seit 0.46.0.

# file.txt -> {datadir}/{projectname}/new-name.txt
install_data('file.txt', rename : 'new-name.txt')

# file1.txt -> share/myapp/dir1/data.txt
# file2.txt -> share/myapp/dir2/data.txt
install_data(['file1.txt', 'file2.txt'],
             rename : ['dir1/data.txt', 'dir2/data.txt'],
             install_dir : 'share/myapp')

Manchmal möchten Sie einen gesamten Unterbaum direkt kopieren. Für diesen Anwendungsfall gibt es den Befehl install_subdir, der wie folgt verwendet werden kann.

install_subdir('mydir', install_dir : 'include') # mydir subtree -> include/mydir

Meistens möchten Sie Dateien relativ zum Installationspräfix installieren. Manchmal müssen Sie außerhalb des Präfixes gehen (z. B. Dateien nach /etc anstatt nach /usr/etc schreiben). Dies kann durch Angabe eines absoluten Installationspfads erreicht werden.

install_data(sources : 'foo.dat', install_dir : '/etc') # -> /etc/foo.dat

Benutzerdefiniertes Installationsskript

Manchmal müssen Sie mehr tun, als nur grundlegende Ziele zu installieren. Meson macht dies einfach, indem es Ihnen erlaubt, ein benutzerdefiniertes Skript anzugeben, das zur Installationszeit ausgeführt wird. Als Beispiel hier ein Skript, das eine leere Datei in einem benutzerdefinierten Verzeichnis generiert.

#!/bin/sh

mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir"
touch "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir/file.dat"

Wie Sie sehen, richtet Meson einige Umgebungsvariablen ein, um Ihnen beim Schreiben Ihres Skripts zu helfen (DESTDIR wird nicht von Meson gesetzt, sondern aus der externen Umgebung geerbt). Zusätzlich zum Installationspräfix setzt Meson auch die Variablen MESON_SOURCE_ROOT und MESON_BUILD_ROOT.

Meson anzuweisen, dieses Skript zur Installationszeit auszuführen, ist eine Einzeiler.

meson.add_install_script('myscript.sh')

Das Argument ist der Name der Skriptdatei relativ zum aktuellen Unterverzeichnis.

Installation als Superuser

Beim Erstellen als Nicht-Root-Benutzer, aber bei der Installation in Root-besessene Speicherorte über z. B. sudo ninja install, versucht Ninja, veraltete Ziele als Root neu zu erstellen. Dies führt zu verschiedenen Fehlverhalten aufgrund von Build-Ausgaben und Ninja-internen Dateien, die Root gehören.

Die Ausführung von meson install wird aus mehreren Gründen bevorzugt. Es kann veraltete Ziele neu erstellen und sich dann als Root erneut aufrufen. (seit 1.1.0) Zusätzlich wird beim Ausführen von sudo meson install die Berechtigung entzogen und veraltete Ziele als ursprünglicher Benutzer neu erstellt, nicht als Root.

(seit 1.1.0) Beim erneuten Aufruf als Root wird versucht, die bevorzugte Methode des Benutzers zum erneuten Ausführen von Befehlen als Root zu erraten. Die Reihenfolge der Priorität ist: sudo, doas, pkexec (polkit). Ein Berechtigungstool kann durch Setzen von $MESON_ROOT_CMD erzwungen werden.

DESTDIR-Unterstützung

Manchmal müssen Sie in ein anderes Verzeichnis als das Installationspräfix installieren. Dies ist am häufigsten beim Erstellen von RPM- oder DEB-Paketen der Fall. Dies geschieht mit der Umgebungsvariable DESTDIR und wird genauso verwendet wie bei anderen Build-Systemen.

$ DESTDIR=/path/to/staging/area meson install

Seit 0.57.0 kann das Argument --destdir anstelle der Umgebungsvariable verwendet werden. In diesem Fall setzt Meson DESTDIR in die Umgebung, wenn Installationsskripte ausgeführt werden.

Seit 0.60.0 kann DESTDIR und --destdir ein Pfad relativ zum Build-Verzeichnis sein. Ein absoluter Pfad wird in die Umgebung gesetzt, wenn Skripte ausgeführt werden.

Benutzerdefiniertes Installationsverhalten

Das Installationsverhalten kann durch zusätzliche Argumente weiter angepasst werden.

Wenn Sie beispielsweise das aktuelle Setup installieren möchten, ohne den Code neu zu erstellen (was das Standard-Installationsziel immer tut) und nur die geänderten Dateien installieren, würden Sie diesen Befehl im Build-Verzeichnis ausführen

$ meson install --no-rebuild --only-changed

Installations-Tags

Seit 0.60.0

Es ist möglich, nur eine Teilmenge der installierbaren Dateien mit dem Befehl meson install --tags tag1,tag2 zu installieren. Wenn --tags angegeben ist, werden nur Dateien installiert, die mit einem der Tags markiert wurden.

Dies ist für Packager (z. B. Distributionen) gedacht, die typischerweise die Pakete libfoo, libfoo-dev und libfoo-doc aufteilen möchten. Anstatt die Liste der installierten Dateien pro Kategorie in jedem Verpackungssystem zu duplizieren, kann sie an einem einzigen Ort, direkt in den Upstream meson.build-Dateien, gepflegt werden.

Meson setzt vordefinierte Tags auf einige Dateien. Im Laufe der Zeit werden wahrscheinlich weitere Tags hinzugefügt. Bitte helfen Sie mit, die Liste der bekannten Kategorien zu erweitern.

  • devel:
    • static_library(),
    • install_headers(),
    • pkgconfig.generate(),
    • gnome.generate_gir() - .gir-Datei,
    • gnome.generate_vapi() - .vapi-Datei (Seit 0.64.0),
    • Dateien, die in libdir und mit der Erweiterung .a oder .pc installiert werden,
    • Datei, die in includedir installiert wird,
    • Generierte Header-Dateien, die mit gnome.compile_resources(), gnome.genmarshal(), gnome.mkenums(), gnome.mkenums_simple() und gnome.gdbus_codegen() installiert werden (Seit 0.64.0).
  • runtime:
    • executable(),
    • shared_library(),
    • shared_module(),
    • jar(),
    • gnome.compile_resources() - .gresource-Datei (Seit 0.64.0),
    • Dateien, die in bindir installiert werden,
    • Dateien, die in libdir und mit der Erweiterung .so oder .dll installiert werden.
  • python-runtime:
    • python.install_sources().
  • man:
  • doc:
    • gnome.gtkdoc(),
    • gnome.yelp(),
    • hotdoc.generate_doc().
  • i18n:
    • i18n.gettext(),
    • qt.compile_translations(),
    • Dateien, die in localedir installiert werden.
  • typelib:
    • gnome.generate_gir() - .typelib-Datei.
  • bin:
    • Skripte und ausführbare Dateien, die mit einer Bibliothek gebündelt sind und von Endbenutzern verwendet werden sollen.
  • bin-devel:
    • Skripte und ausführbare Dateien, die mit einer Bibliothek gebündelt sind und von Entwicklern verwendet werden sollen (d. h. Build-Tools).
  • tests:
    • Dateien, die in das Unterverzeichnis installed-tests installiert werden (Seit 0.64.0).
  • systemtap:
    • Dateien, die in das Unterverzeichnis systemtap installiert werden (Seit 0.64.0).

Ein benutzerdefiniertes Installations-Tag kann mit dem Schlüsselwortargument install_tag bei verschiedenen Funktionen wie custom_target(), configure_file(), install_subdir() und install_data() gesetzt werden. Details finden Sie in der jeweiligen Dokumentation im Referenzhandbuch. Es wird empfohlen, nach Möglichkeit eines der vordefinierten Tags zu verwenden.

Installierbare Dateien, die weder automatisch von Meson getaggt noch manuell mit dem Schlüsselwortargument install_tag getaggt wurden, werden nicht installiert, wenn --tags verwendet wird. Sie werden am Ende von <builddir>/meson-logs/meson-log.txt gemeldet. Es wird empfohlen, fehlende install_tag hinzuzufügen, um jedes installierbare Element zu taggen.

Die Ergebnisse der Suche sind