En Red Hat-medarbejder præsenterede Goals-samlingssystemet. Frigivelse af GNU Make 4.2

Richard WM Jones, forfatter libguestfs, arbejder hos Red Hat, indsendt nyt montageværktøj Mål, der har til formål at eliminere mangler og problemer i brugen af ​​fabrikat og samtidig bibeholde den overordnede enkelhed og forståelighed af scripts. Make-værktøjet blev designet i 1976 og har en række konceptuelle mangler; Goals planlægger at eliminere disse mangler uden at ændre det generelle koncept.
Mål kildekode distribueret af licenseret under GPLv2+.

Løste problemer:

  • Understøttelse af kun én afhængighedsløsningstaktik - "assemblyinstruktionen køres, hvis målfilen mangler eller er ældre end en af ​​afhængighederne." Mål planlægger at implementere andre taktikker, såsom at tjekke for tilstedeværelsen af ​​en URL, sammenligne ændringstider med enhver fil, evaluere den indbyggede pakke koji, sammenligning af kontrolsummer, kørende testcases med selektivt spring over tests.
  • Ved behandling af build-mål adskiller make ikke filer og regelnavne, og som følge heraf er der ingen kontrol af, at når en regel køres, vil den fil, den hævder at være oprettet, faktisk blive oprettet. For eksempel, hvis du har en regel kaldet "test", der kører scripts med tests, oprettes en fil med navnet "test" ved et uheld, så vil testene ikke længere blive kaldt, da make vil vurdere, at målet er bygget og ikke kræver enhver handling (for at omgå problemet i make, kan du angive ".PHONY: test"-direktivet). Mål adskiller eksplicit filer og regelnavne.

    En Red Hat-medarbejder præsenterede Goals-samlingssystemet. Frigivelse af GNU Make 4.2

  • Problem med kun at angive én parameter til monteringsvejledningen.

    En Red Hat-medarbejder præsenterede Goals-samlingssystemet. Frigivelse af GNU Make 4.2

    Mål giver dig mulighed for at bruge et vilkårligt antal navngivne parametre. For eksempel kan du separat udtrække tegnet på en fejlretningsfil fra navnet:

    En Red Hat-medarbejder præsenterede Goals-samlingssystemet. Frigivelse af GNU Make 4.2

  • Problemer med at interagere med shell-tolken. For eksempel behovet for at kontrollere undslippelsen af ​​mellemrum i fil- og mappenavne, spild af ressourcer ved at starte en separat shell-fortolker, når hver kommando udføres, dobbeltfortolkningen af ​​"$"-tegnet (brugt i både shell og make), under hensyntagen til fordybninger.

    Disse problemer løses i Goals ved at bruge "%"-symbolet i stedet for "$" for assembly-variabler ("$" forbliver kun for skallen), ved hjælp af en parser LALR(1), som kræver, at du omgiver stier og filnavne med anførselstegn og fremhæver kodeblokke med krøllede klammeparenteser. Hele kommandoblokken startes i én forekomst af kommandoskallen, og vilkårlig kodeformatering er tilladt inde i blokken uden henvisning til specielle mellemrum.

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

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

Andre funktioner i Goals:

  • Valgfri understøttelse til angivelse af vilkårlige navne og parametre:

    mål alle = : "mål"

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

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

  • To starttilstande: lav-tilstand til at matche build-mål med filnavne (f.eks. fil "foo.o" matcher målet "%name.o") og direkte kompileringstilstand:

    mål alle = : link

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

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

  • Samlingstaktik bestemmes af særlige regler, der kan bruges til at bestemme behovet for at samle et samlingsmål igen. Hvis der laves et link til tilstedeværelsen af ​​en fil, så bestemmes dette eksplicit gennem det tilsvarende tegn ("mål" for regelnavnet og *fil ("mål") for kontrol af filen).

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

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

  • Udvikleren kan definere vilkårlige attributter for monteringstaktik. "*file"-flaget er defineret som standard (@{...} angiver undertrykkelse af output, og "exit 99" signalerer behovet for genopbygning):

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

    Kilde: opennet.ru

Tilføj en kommentar