Een Red Hat-medewerker presenteerde het Goals-montagesysteem. Uitgave van GNU Make 4.2

RichardWM Jones, auteur libguestfs, werkzaam bij Red Hat, ingediend nieuw montagehulpprogramma Doelen, gericht op het elimineren van tekortkomingen en problemen in de bruikbaarheid van make, terwijl de algehele eenvoud en begrijpelijkheid van scripts behouden blijft. Het make-hulpprogramma is ontworpen in 1976 en heeft een aantal conceptuele tekortkomingen; Goals is van plan deze tekortkomingen te elimineren zonder het algemene concept te veranderen.
Broncode van doelen gedistribueerd door gelicentieerd onder GPLv2+.

Opgeloste problemen:

  • Ondersteuning voor slechts één tactiek voor het oplossen van afhankelijkheid: “de montage-instructie wordt uitgevoerd als het doelbestand ontbreekt of ouder is dan een van de afhankelijkheden.” Goals is van plan andere tactieken te implementeren, zoals het controleren op de aanwezigheid van een URL, het vergelijken van wijzigingstijden met welk bestand dan ook, het evalueren van het ingebouwde pakket koji, vergelijking van checksums, uitvoeren van testgevallen met selectief overslaan van tests.
  • Bij het verwerken van builddoelen scheidt make de bestanden en regelnamen niet van elkaar, en als gevolg daarvan is er geen controle of bij het uitvoeren van een regel het bestand dat beweert te zijn gemaakt ook daadwerkelijk wordt gemaakt. Als u bijvoorbeeld een regel heeft met de naam 'test' die scripts met tests uitvoert, wordt er per ongeluk een bestand met de naam 'test' gemaakt. Vervolgens worden de tests niet langer aangeroepen, omdat make ervan uitgaat dat het doel is gebouwd en geen welke actie dan ook (om het probleem in make te omzeilen, kunt u de richtlijn ".PHONY: test" opgeven). Doelen scheiden expliciet bestanden en regelnamen.

    Een Red Hat-medewerker presenteerde het Goals-montagesysteem. Uitgave van GNU Make 4.2

  • Probleem met het opgeven van slechts één parameter voor montage-instructies.

    Een Red Hat-medewerker presenteerde het Goals-montagesysteem. Uitgave van GNU Make 4.2

    Met Doelen kunt u een willekeurig aantal benoemde parameters gebruiken. U kunt bijvoorbeeld afzonderlijk het teken van een foutopsporingsbestand uit de naam extraheren:

    Een Red Hat-medewerker presenteerde het Goals-montagesysteem. Uitgave van GNU Make 4.2

  • Problemen met de interactie met de shell-tolk. Bijvoorbeeld de noodzaak om het ontsnappen van spaties in bestands- en mapnamen te controleren, de verspilling van bronnen bij het starten van een aparte shell-interpreter bij het uitvoeren van elke opdracht, de dubbele interpretatie van het “$”-teken (gebruikt in zowel shell als make), rekening houdend met inkepingen.

    Deze problemen worden in Goals opgelost door het symbool “%” te gebruiken in plaats van “$” voor assemblagevariabelen (“$” blijft alleen voor de shell), met behulp van een parser LALR (1), waarbij u paden en bestandsnamen moet omringen met aanhalingstekens en codeblokken moet markeren met accolades. Het hele opdrachtblok wordt gestart in één exemplaar van de opdrachtshell, en binnen het blok is willekeurige codeopmaak toegestaan, zonder verwijzing naar speciale spaties.

    Het was:
    doel: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Het werd:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Andere kenmerken van Doelen:

  • Optionele ondersteuning voor het opgeven van willekeurige namen en parameters:

    doel alles =: "doel"

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

    doel compileren (naam) =
    "%name.o": "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Twee startmodi: make-modus om bouwdoelen te matchen met bestandsnamen (bijvoorbeeld bestand "foo.o" komt overeen met doel "%name.o"), en directe compilatiemodus:

    doel alles = : link

    doellink =
    "target": "foo.o", compileer ("bar") { ... }

    doel compileren (naam) =
    "%name.o": "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Montagetactieken worden bepaald door speciale regels die kunnen worden gebruikt om te bepalen of een montagedoel opnieuw in elkaar moet worden gezet. Als er een koppeling wordt gemaakt met de aanwezigheid van een bestand, dan wordt dit expliciet bepaald via het bijbehorende teken (“target” voor de regelnaam en *file (“target”) voor het controleren van het bestand).

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

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

  • De ontwikkelaar kan willekeurige kenmerken van assemblagetactieken definiëren. De vlag "*file" wordt standaard gedefinieerd (@{...} geeft onderdrukking van de uitvoer aan, en "exit 99" geeft aan dat er opnieuw moet worden opgebouwd):

    tactiek *bestand (bestandsnaam) = @{
    test -f %bestandsnaam || afrit 99
    voor f in %

    Bron: opennet.ru

Voeg een reactie