En Red Hat-anställd presenterade Goals monteringssystem. Release av GNU Make 4.2

Richard WM Jones, författare libguestfs, arbetar på Red Hat, lämnats nytt monteringsverktyg Mål, som syftar till att eliminera brister och problem i användbarheten av fabrikat samtidigt som skriptens övergripande enkelhet och förståelighet bibehålls. Make-verktyget designades 1976 och har ett antal konceptuella brister; Goals planerar att eliminera dessa brister utan att ändra det allmänna konceptet.
Mål källkod levererad av licensierad under GPLv2+.

Lös problem:

  • Stöd för endast en taktik för beroendeupplösning - "monteringsinstruktionen körs om målfilen saknas eller är äldre än ett av beroenden." Mål planerar att implementera andra taktiker, som att kontrollera om det finns en webbadress, jämföra ändringstider med vilken fil som helst, utvärdera det inbyggda paketet Som, jämförelse av kontrollsummor, köra testfall med selektivt hoppa över tester.
  • När man bearbetar byggmål separerar make inte filer och regelnamn, och som ett resultat finns det ingen kontroll att filen som den påstår sig vara skapad faktiskt kommer att skapas när en regel körs. Till exempel, om du har en regel som heter "test" som kör skript med tester skapas en fil med namnet "test" av misstag, då kommer testerna inte längre att anropas, eftersom make kommer att anse att målet är byggt och inte kräver någon åtgärd (för att komma runt problemet i make, kan du ange direktivet ".PHONY: test"). Mål skiljer uttryckligen filer och regelnamn åt.

    En Red Hat-anställd presenterade Goals monteringssystem. Release av GNU Make 4.2

  • Problem med att endast tillhandahålla en parameter för monteringsanvisningar.

    En Red Hat-anställd presenterade Goals monteringssystem. Release av GNU Make 4.2

    Mål låter dig använda ett godtyckligt antal namngivna parametrar. Du kan till exempel extrahera tecknet för en felsökningsfil separat från namnet:

    En Red Hat-anställd presenterade Goals monteringssystem. Release av GNU Make 4.2

  • Problem att interagera med skaltolken. Till exempel, behovet av att kontrollera flykten av utrymmen i fil- och katalognamn, slöseri med resurser på att starta en separat skaltolk när du kör varje kommando, dubbeltolkningen av tecknet "$" (används i både skal och make), med hänsyn till fördjupningar.

    Dessa problem löses i Goals genom att använda "%"-symbolen istället för "$" för sammansättningsvariabler ("$" finns kvar endast för skalet), med hjälp av en parser LALR(1), vilket kräver att du omger sökvägar och filnamn med citattecken och markerar kodblock med lockiga hängslen. Hela kommandoblocket startas i en instans av kommandoskalet, och inom blocket tillåts godtycklig kodformatering, utan hänvisning till speciella mellanslag.

    Var:
    mål: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

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

Andra funktioner i mål:

  • Valfritt stöd för att ange godtyckliga namn och parametrar:

    mål alla = : "mål"

    mållänk =
    "target" : "foo.o", "bar.o" { ... }

    målkompilera (namn) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Två startlägen: skapa läge för att matcha byggmål med filnamn (till exempel filen "foo.o" matchar målet "%name.o") och direkt kompileringsläge:

    mål alla = : länk

    mållänk =
    "target" : "foo.o", kompilera ("bar") { ... }

    målkompilera (namn) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Monteringstaktik bestäms av speciella regler som kan användas för att bestämma behovet av att återmontera ett monteringsmål. Om en länk görs till närvaron av en fil, så bestäms detta uttryckligen genom motsvarande tecken ("mål" för regelnamnet och *fil ("mål") för kontroll av filen).

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

    *fil("mål"): *fil("foo.o"), *fil("bar.o") { ... }

  • Utvecklaren kan definiera godtyckliga attribut för monteringstaktik. "*file"-flaggan är definierad som standard (@{...} indikerar undertryckande av utdata, och "exit 99" signalerar behovet av ombyggnad):

    taktik *fil (filnamn) = @{
    test -f %filnamn || avfart 99
    för f i %

    Källa: opennet.ru

Lägg en kommentar