Meson-Dateirewriter

Seit Version 0.50.0 verfügt Meson über die Funktionalität, einige grundlegende Änderungen an den meson.build-Dateien von der Befehlszeile aus durchzuführen. Die derzeit unterstützten Operationen sind:

  • Für Build-Ziele
    • Quellcodedateien hinzufügen/entfernen
    • Ziele hinzufügen/entfernen
    • Eine Auswahl von Schlüsselwortargumenten ändern
    • Einige JSON-Informationen ausgeben
  • Für Abhängigkeiten
    • Eine Auswahl von Schlüsselwortargumenten ändern
  • Für die Projektfunktion
    • Eine Auswahl von Schlüsselwortargumenten ändern
    • Die Liste der Standardoptionen ändern

Der Rewriter verfügt sowohl über eine normale Befehlszeilenschnittstelle als auch über einen "Skriptmodus". Die normale CLI ist hauptsächlich für den alltäglichen Gebrauch konzipiert. Der "Skriptmodus" hingegen ist für die Verwendung durch externe Programme (IDEs, grafische Frontends usw.) gedacht.

Der Rewriter selbst gilt als stabil, jedoch können sich die Benutzeroberfläche und die API des "Skriptmodus" in Zukunft ändern. Diese Änderungen können auch die Abwärtskompatibilität zu älteren Versionen brechen.

Wir sind auch offen für Vorschläge zur Verbesserung der API.

Verwendung des Rewriters

Alle Rewriter-Funktionen werden über meson rewrite aufgerufen. Der Meson-Rewriter geht davon aus, dass er im Stammverzeichnis des Projekts ausgeführt wird. Wenn dies nicht der Fall ist, verwenden Sie --sourcedir, um das tatsächliche Quellverzeichnis des Projekts anzugeben.

Quellcodedateien hinzufügen und entfernen

Die häufigsten Operationen werden wahrscheinlich das Hinzufügen und Entfernen von Quellcodedateien zu einem Build-Ziel sein. Dies kann einfach erfolgen mit

meson rewrite target <target name/id> {add/rm} [list of sources]

Gegeben sei beispielsweise das folgende Beispiel

src = ['main.cpp', 'fileA.cpp']

exe1 = executable('testExe', src)

kann die Quelldatei fileB.cpp hinzugefügt werden mit

meson rewrite target testExe add fileB.cpp

Nach Ausführung dieses Befehls sieht die neue meson.build-Datei wie folgt aus:

src = ['main.cpp', 'fileA.cpp', 'fileB.cpp']

exe1 = executable('testExe', src)

In diesem Fall hätte auch exe1 für den Zielnamen verwendet werden können. Dies ist möglich, da der Rewriter auch nach Zuweisungen und eindeutigen Meson-IDs sucht, die mit Introspektion erworben werden können. Wenn mehrere Ziele denselben Namen haben, tut Meson nichts und gibt eine Fehlermeldung aus.

Weitere Informationen finden Sie in der Hilfeausgabe des Rewriter-Zielbefehls.

extra_files hinzufügen und entfernen

Seit 0.61.0

Auf die gleiche Weise, wie Sie Quellcodedateien zu einem Ziel hinzufügen und entfernen können, können Sie die Liste extra_files eines Ziels ändern

meson rewrite target <target name/id> {add_extra_files/rm_extra_files} [list of extra files]

Projektversion festlegen

Es ist auch möglich, Schlüsselwortargumente spezifischer Funktionen mit dem Rewriter festzulegen. Der allgemeine Befehl zum Festlegen oder Entfernen von Schlüsselwortargumenten lautet

meson rewrite kwargs {set/delete} <function type> <function ID> <key1> <value1> <key2> <value2> ...

Zum Beispiel kann die Projektversion mit diesem Befehl festgelegt werden

meson rewrite kwargs set project / version 1.0.0

Derzeit werden nur die folgenden Funktionstypen unterstützt

  • Abhängigkeit
  • Ziel (jedes Build-Ziel, die Funktions-ID ist der Zielname/die Ziel-ID)
  • Projekt (die Funktions-ID muss / sein, da projekt() nur einmal aufgerufen werden kann)

Weitere Informationen finden Sie in der Hilfeausgabe des Rewriter-kwargs-Befehls.

Hinweis: msys bash kann / zu einem Pfad erweitern. Die Übergabe von // wird von msys bash in / konvertiert, aber um die Verwendung Shell-unabhängig zu halten, erlaubt der rewrite-Befehl auch // als Funktions-ID, sodass er sowohl in msys bash als auch in anderen Shells funktioniert.

Standardoptionen des Projekts festlegen

Zum Festlegen und Löschen von Standardoptionen verwenden Sie den folgenden Befehl

meson rewrite default-options {set/delete} <opt1> <value1> <opt2> <value2> ...

Einschränkungen

Das Umschreiben einer Meson-Datei garantiert nicht die Beibehaltung der Einrückung der geänderten Funktionen. Darüber hinaus werden Kommentare innerhalb einer geänderten Anweisung entfernt. Außerdem werden alle Quellcodedateien alphabetisch sortiert.

Zum Beispiel das Hinzufügen von e.c zu srcs im folgenden Code

# Important comment

srcs = [
'a.c', 'c.c', 'f.c',
# something important about b
       'b.c', 'd.c', 'g.c'
]

# COMMENT

würde zu folgendem Code führen

# Important comment

srcs = [
  'a.c',
  'b.c',
  'c.c',
  'd.c',
  'e.c',
  'f.c',
  'g.c'
]

# COMMENT

Verwendung des "Skriptmodus"

Der "Skriptmodus" sollte die bevorzugte API für Drittanbieterprogramme sein, da er mehr Flexibilität und eine höhere API-Stabilität bietet. Die "Skripte" werden im JSON-Format gespeichert und mit meson rewrite command <JSON-Datei oder -String> ausgeführt.

Das JSON-Format ist wie folgt definiert:

[
  {
    "type": "function to execute",
    ...
  }, {
    "type": "other function",
    ...
  },
  ...
]

Jedes Objekt im Hauptarray muss einen type-Eintrag haben, der angibt, welche Funktion ausgeführt werden soll.

Derzeit werden die folgenden Funktionen unterstützt:

  • Ziel
  • Schlüsselwortargumente
  • Standardoptionen

Format für Zieländerungen

Das Format für den Typ target ist wie folgt definiert:

{
  "type": "target",
  "target": "target ID/name/assignment variable",
  "operation": "one of ['src_add', 'src_rm', 'target_rm', 'target_add', 'extra_files_add', 'extra_files_rm', 'info']",
  "sources": ["list", "of", "source", "files", "to", "add, remove"],
  "subdir": "subdir where the new target should be added (only has an effect for operation 'tgt_add')",
  "target_type": "function name of the new target -- same as in the CLI (only has an effect for operation 'tgt_add')"
}

Die Schlüssel sources, subdir und target_type sind optional.

Format für Schlüsselwortargumentänderungen

Das Format für den Typ target ist wie folgt definiert:

{
  "type": "kwargs",
  "function": "one of ['dependency', 'target', 'project']",
  "id": "function ID",
  "operation": "one of ['set', 'delete', 'add', 'remove', 'remove_regex', 'info']",
  "kwargs": {
    "key1": "value1",
    "key2": "value2",
    ...
  }
}

Format für Standardoptionsänderungen

Das Format für den Typ default_options ist wie folgt definiert:

{
  "type": "default_options",
  "operation": "one of ['set', 'delete']",
  "options": {
    "opt1": "value1",
    "opt2": "value2",
    ...
  }
}

Für die Operation delete können die Werte der options beliebig sein (einschließlich null)

Extrahieren von Informationen

Der Rewriter bietet auch die Operation info für die Typen target und kwargs. Wenn diese Operation verwendet wird, gibt Meson einen JSON-Dump an stderr aus, der alle für den Rewriter verfügbaren Informationen über das betreffende Build-Ziel / die betreffenden Funktions-Schlüsselwortargumente enthält.

Das Ausgabeformat ist derzeit experimentell und kann sich in Zukunft ändern.

Die Ergebnisse der Suche sind