En Red Hat-ansatt presenterte Goals-samlingssystemet. Utgivelse av GNU Make 4.2

Richard WM Jones, forfatter libguestfs, jobber på Red Hat, innsendt nytt monteringsverktøy Mål, rettet mot å eliminere mangler og problemer i bruken av fabrikat samtidig som man opprettholder den generelle enkelheten og forståeligheten til skript. Make-verktøyet ble designet i 1976 og har en rekke konseptuelle mangler; Mål planlegger å eliminere disse manglene uten å endre det generelle konseptet.
Mål kildekode distribuert av lisensiert under GPLv2+.

Løste problemer:

  • Støtte for bare én taktikk for avhengighetsoppløsning - "monteringsinstruksjonen kjøres hvis målfilen mangler eller er eldre enn en av avhengighetene." Mål planlegger å implementere andre taktikker, for eksempel å sjekke for tilstedeværelsen av en URL, sammenligne endringstider med en hvilken som helst fil, evaluere den innebygde pakken kōji, sammenligning av sjekksummer, kjøring av testtilfeller med selektiv hopping av tester.
  • Når du behandler byggemål, skiller ikke make filer og regelnavn, og som et resultat er det ingen kontroll for at når du kjører en regel, vil filen den hevder å være opprettet faktisk bli opprettet. Hvis du for eksempel har en regel kalt "test" som kjører skript med tester, opprettes en fil kalt "test" ved et uhell, og testene vil ikke lenger kalles, siden make vil vurdere at målet er bygget og ikke krever enhver handling (for å omgå problemet i make, kan du spesifisere ".PHONY: test"-direktivet). Mål skiller eksplisitt filer og regelnavn.

    En Red Hat-ansatt presenterte Goals-samlingssystemet. Utgivelse av GNU Make 4.2

  • Problem med å oppgi kun én parameter for monteringsanvisning.

    En Red Hat-ansatt presenterte Goals-samlingssystemet. Utgivelse av GNU Make 4.2

    Mål lar deg bruke et vilkårlig antall navngitte parametere. For eksempel kan du separat trekke ut tegnet til en feilsøkingsfil fra navnet:

    En Red Hat-ansatt presenterte Goals-samlingssystemet. Utgivelse av GNU Make 4.2

  • Problemer med å samhandle med shell-tolken. For eksempel, behovet for å kontrollere unnslipping av mellomrom i fil- og katalognavn, sløsing med ressurser ved å starte en separat shell-tolk når du utfører hver kommando, dobbelttolkningen av "$"-tegnet (brukt i både shell og make), tar hensyn til innrykk.

    Disse problemene løses i Goals ved å bruke «%»-symbolet i stedet for «$» for sammenstillingsvariabler («$» forblir bare for skallet), ved å bruke en parser LALR(1), som krever at du omgir stier og filnavn med anførselstegn og markerer kodeblokker med krøllete klammeparenteser. Hele kommandoblokken startes i én forekomst av kommandoskallet, og innenfor blokken er vilkårlig kodeformatering tillatt, uten referanse til spesielle mellomrom.

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

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

Andre funksjoner ved mål:

  • Valgfri støtte for å spesifisere vilkårlige navn og parametere:

    mål alle = : "mål"

    mållenke =
    "target" : "foo.o", "bar.o" { ... }

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

  • To lanseringsmoduser: lag-modus for å matche byggemål med filnavn (for eksempel filen "foo.o" samsvarer med målet "%name.o"), og direkte kompileringsmodus:

    mål alle = : lenke

    mållenke =
    "target" : "foo.o", kompiler ("bar") { ... }

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

  • Monteringstaktikk bestemmes av spesielle regler som kan brukes til å bestemme behovet for å sette sammen et monteringsmål. Hvis det lages en kobling til tilstedeværelsen av en fil, bestemmes dette eksplisitt gjennom det tilsvarende tegnet (“mål” for regelnavnet og *fil (“mål”) for å sjekke filen).

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

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

  • Utvikleren kan definere vilkårlige attributter for monteringstaktikker. "*file"-flagget er definert som standard (@{...} indikerer undertrykkelse av utdata, og "exit 99" signaliserer behovet for gjenoppbygging):

    taktikk *fil (filnavn) = @{
    test -f %filnavn || utgang 99
    for f i %

    Kilde: opennet.ru

Legg til en kommentar