Ein Mitarbeiter von Red Hat stellte das Goals-Montagesystem vor. Veröffentlichung von GNU Make 4.2

Richard WM Jones, Autor libguestfs, arbeitet bei Red Hat, eingeführt neues Assembly-Dienstprogramm Ziele, mit dem Ziel, Mängel und Probleme in der Nützlichkeit von make zu beseitigen und gleichzeitig die allgemeine Einfachheit und Verständlichkeit von Skripten beizubehalten. Das Dienstprogramm make wurde 1976 entwickelt und weist eine Reihe konzeptioneller Mängel auf; Goals plant, diese Mängel zu beseitigen, ohne das allgemeine Konzept zu ändern.
Quellcode für Ziele vertrieben von lizenziert unter GPLv2+.

Zu lösende Probleme:

  • Unterstützung für nur eine Taktik zur Abhängigkeitsauflösung: „Die Assembleranweisung wird ausgeführt, wenn die Zieldatei fehlt oder älter als eine der Abhängigkeiten ist.“ Goals plant die Implementierung anderer Taktiken, wie z. B. die Prüfung auf das Vorhandensein einer URL, den Vergleich der Änderungszeiten mit beliebigen Dateien und die Bewertung des eingebauten Pakets die, Vergleich von Prüfsummen, Ausführen von Testfällen mit selektivem Überspringen von Tests.
  • Bei der Verarbeitung von Build-Zielen trennt make keine Dateien und Regelnamen. Daher wird beim Ausführen einer Regel nicht überprüft, ob die Datei, die sie zu erstellen vorgibt, tatsächlich erstellt wird. Wenn Sie beispielsweise eine Regel namens „test“ haben, die Skripte mit Tests ausführt, wird versehentlich eine Datei mit dem Namen „test“ erstellt, dann werden die Tests nicht mehr aufgerufen, da make davon ausgeht, dass das Ziel erstellt wurde und nicht benötigt wird jede Aktion (um das Problem in make zu umgehen, können Sie die Direktive „.PHONY: test“ angeben). Ziele trennen Dateien und Regelnamen explizit.

    Ein Mitarbeiter von Red Hat stellte das Goals-Montagesystem vor. Veröffentlichung von GNU Make 4.2

  • Problem bei der Bereitstellung nur eines Parameters für Montageanweisungen.

    Ein Mitarbeiter von Red Hat stellte das Goals-Montagesystem vor. Veröffentlichung von GNU Make 4.2

    Mit Goals können Sie eine beliebige Anzahl benannter Parameter verwenden. Sie können beispielsweise das Vorzeichen einer Debug-Datei separat aus dem Namen extrahieren:

    Ein Mitarbeiter von Red Hat stellte das Goals-Montagesystem vor. Veröffentlichung von GNU Make 4.2

  • Probleme bei der Interaktion mit dem Shell-Interpreter. Zum Beispiel die Notwendigkeit, das Escapezeichen von Leerzeichen in Datei- und Verzeichnisnamen zu kontrollieren, die Verschwendung von Ressourcen beim Starten eines separaten Shell-Interpreters bei der Ausführung jedes Befehls, die doppelte Interpretation des Zeichens „$“ (das sowohl in Shell als auch in Make verwendet wird), unter Berücksichtigung von Einrückungen.

    Diese Probleme werden in Goals durch die Verwendung des „%“-Symbols anstelle von „$“ für Assembly-Variablen („$“ bleibt nur für die Shell) mithilfe eines Parsers gelöst LALR (1), was erfordert, dass Sie Pfade und Dateinamen in Anführungszeichen setzen und Codeblöcke mit geschweiften Klammern hervorheben. Der gesamte Befehlsblock wird in einer Instanz der Befehlsshell gestartet und innerhalb des Blocks ist eine beliebige Codeformatierung ohne Verweis auf spezielle Leerzeichen zulässig.

    Es war:
    Ziel: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Wurde:
    „target“: „foo.o“, „bar.o“ {
    %CC %CFLAGS %< -o %@
    }

Weitere Funktionen von Goals:

  • Optionale Unterstützung für die Angabe beliebiger Namen und Parameter:

    Ziel alle =: „Ziel“

    Ziellink =
    "target": "foo.o", "bar.o" { ... }

    Ziel kompilieren (Name) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Zwei Startmodi: Make-Modus, um Build-Ziele mit Dateinamen abzugleichen (z. B. Datei „foo.o“ entspricht Ziel „%name.o“) und direkter Kompilierungsmodus:

    Ziel alle =: Link

    Ziellink =
    "target": "foo.o", kompilieren ("bar") { ... }

    Ziel kompilieren (Name) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Montagetaktiken werden durch spezielle Regeln bestimmt, anhand derer ermittelt werden kann, ob ein Montageziel erneut zusammengebaut werden muss. Wird auf das Vorhandensein einer Datei verwiesen, so wird dies durch das entsprechende Zeichen („target“ für den Regelnamen und *file („target“) für die Prüfung der Datei) explizit festgestellt.

    "target": "foo.o", "bar.o" { ... }

    *file("target") : *file("foo.o"), *file("bar.o") { ... }

  • Der Entwickler kann beliebige Attribute der Montagetaktiken definieren. Das Flag „*file“ ist standardmäßig definiert ((@{...} zeigt die Unterdrückung der Ausgabe an, und „exit 99“ signalisiert die Notwendigkeit einer Neuerstellung):

    Taktik *file (filename) = @{
    test -f %Dateiname || Ausfahrt 99
    für f in %

    Source: opennet.ru

Kommentar hinzufügen