Red Hati töötaja tutvustas Goalsi koostesüsteemi. GNU Make 4.2 väljalase

Richard WM Jones, autor libguestfs, töötab Red Hatis, tutvustatud uus montaažiutiliit Eesmärgid, mille eesmärk on kõrvaldada puudused ja probleemid make utiliidis, säilitades samas skriptide üldise lihtsuse ja arusaadavuse. Make utiliit loodi 1976. aastal ja sellel on mitmeid kontseptuaalseid puudujääke; Goals kavatseb need puudused kõrvaldada ilma üldist kontseptsiooni muutmata.
Eesmärkide lähtekood jaotatud litsentsitud GPLv2+ alusel.

Lahendatavad probleemid:

  • Toetab ainult ühte sõltuvuse lahendamise taktikat - "koostejuhist käivitatakse, kui sihtfail puudub või on vanem kui üks sõltuvustest." Goals plaanib rakendada muid taktikaid, nagu URL-i olemasolu kontrollimine, muutmisaegade võrdlemine mis tahes failiga, paketi sisseehitamise hindamine Milline neist, kontrollsummade võrdlemine, testjuhtumite käivitamine koos testide valikulise vahelejätmisega.
  • Ehitamise sihtmärkide töötlemisel ei eralda make faile ja reeglite nimesid ning sellest tulenevalt ei kontrollita, kas reegli käivitamisel luuakse ka tegelikult fail, mille loomisel see väidetavalt on. Näiteks kui teil on reegel nimega "test", mis käivitab skripte koos testidega, luuakse kogemata fail nimega "test", siis teste enam ei kutsuta, kuna make arvestab, et sihtmärk on ehitatud ega nõua. mis tahes toiming (probleemi lahendamiseks saate määrata käskkirja „.PHONY: test”). Eesmärgid eraldavad selgesõnaliselt failid ja reeglite nimed.

    Red Hati töötaja tutvustas Goalsi koostesüsteemi. GNU Make 4.2 väljalase

  • Probleem ainult ühe parameetri esitamisega montaažijuhiste jaoks.

    Red Hati töötaja tutvustas Goalsi koostesüsteemi. GNU Make 4.2 väljalase

    Goals võimaldab kasutada suvalist arvu nimega parameetreid. Näiteks saate silumisfaili märgi nimest eraldi välja võtta:

    Red Hati töötaja tutvustas Goalsi koostesüsteemi. GNU Make 4.2 väljalase

  • Probleemid shellitõlgiga suhtlemisel. Näiteks vajadus kontrollida tühikute vältimist faili- ja katalooginimedes, ressursside raiskamine iga käsu täitmisel eraldi shell-tõlgi käivitamisel, märgi “$” topelttõlgendus (kasutatakse nii shellis kui ka make-is), võttes arvesse süvendeid.

    Need probleemid lahendatakse rakenduses Goals, kasutades koostemuutujate jaoks sümbolit "%" sümboli "$" asemel ("$" jääb ainult kesta jaoks), kasutades parserit LALR(1), mille jaoks peate ümbritsema teed ja failinimed jutumärkidega ning esile tõstma koodiplokid lokkis sulgudega. Kogu käsuplokk käivitatakse käsukesta ühes eksemplaris ja ploki sees on lubatud koodi suvaline vormindamine, ilma spetsiaalsete tühikuteta.

    See oli:
    sihtmärk: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

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

Muud eesmärkide funktsioonid:

  • Valikuline tugi suvaliste nimede ja parameetrite määramiseks:

    eesmärk kõik = : "sihtmärk"

    eesmärgi link =
    "target" : "foo.o", "bar.o" { ... }

    eesmärgi koostamine (nimi) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Kaks käivitusrežiimi: loomisrežiim, et sobitada järgu sihtmärgid failinimedega (näiteks fail "foo.o" vastab sihtmärgile "%name.o") ja otsene kompileerimisrežiim:

    eesmärk kõik = : link

    eesmärgi link =
    "target" : "foo.o", kompileeri ("bar") { ... }

    eesmärgi koostamine (nimi) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Montaažitaktika määratakse kindlaks spetsiaalsete reeglitega, mille abil saab kindlaks teha, kas on vaja kokkupanemise sihtmärk uuesti kokku panna. Kui faili olemasolule viidatakse, siis määratakse see selgesõnaliselt vastava märgi kaudu (reegli nime puhul "sihtmärk" ja faili kontrollimiseks *fail ("sihtmärk").

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

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

  • Arendaja saab määratleda koostetaktika suvalised atribuudid. Lipp "*fail" on vaikimisi defineeritud (@{...} tähistab väljundi mahasurumist ja "exit 99" annab märku vajadusest taastada):

    taktika *fail (failinimi) = @{
    test -f % failinimi || väljapääs 99
    f jaoks %

    Allikas: opennet.ru

Lisa kommentaar