Red Hatin työntekijä esitteli Goals-kokoonpanojärjestelmän. GNU Make 4.2:n julkaisu

Richard WM Jones, kirjoittaja libguestfs, työskentelee Red Hatilla, toimitettu uusi kokoonpanoapuohjelma Tavoitteet, jonka tarkoituksena on poistaa puutteet ja ongelmat make-apuohjelmassa samalla kun säilytetään komentosarjojen yleinen yksinkertaisuus ja ymmärrettävyys. Make-apuohjelma on suunniteltu vuonna 1976, ja siinä on useita käsitteellisiä puutteita; Goals suunnittelee poistavansa nämä puutteet muuttamatta yleistä konseptia.
Tavoitteiden lähdekoodi jakelija lisensoitu GPLv2+:lla.

Ratkaistu ongelmia:

  • Tuki vain yhdelle riippuvuuden selvitystaktiikalle - "kokoamisohje suoritetaan, jos kohdetiedosto puuttuu tai on vanhempi kuin yksi riippuvuuksista." Goals aikoo ottaa käyttöön muita taktiikoita, kuten tarkistaa URL-osoitteen olemassaolon, vertailla muokkausaikoja mihin tahansa tiedostoon, arvioida paketin koontiversiota. kōji, tarkistussummien vertailu, testitapausten suorittaminen ja testien valikoiva ohittaminen.
  • Koontikohteita käsitellessä make ei erota tiedostoja ja sääntöjen nimiä, ja tämän seurauksena ei voida tarkistaa, että sääntöä suoritettaessa tiedosto, jonka se väittää olevan luotu, todella luodaan. Jos sinulla on esimerkiksi "testi"-niminen sääntö, joka suorittaa skriptejä testeillä, "testi"-niminen tiedosto luodaan vahingossa, jolloin testejä ei enää kutsuta, koska make katsoo, että kohde on rakennettu eikä vaadi. minkä tahansa toiminnon (jos haluat kiertää merkki-ongelman, voit määrittää ".PHONY: test" -direktiivin). Tavoitteet erottavat erikseen tiedostot ja sääntöjen nimet.

    Red Hatin työntekijä esitteli Goals-kokoonpanojärjestelmän. GNU Make 4.2:n julkaisu

  • Ongelma vain yhden parametrin antamisessa kokoonpanoohjeisiin.

    Red Hatin työntekijä esitteli Goals-kokoonpanojärjestelmän. GNU Make 4.2:n julkaisu

    Tavoitteet mahdollistavat mielivaltaisen määrän nimettyjä parametreja. Voit esimerkiksi poimia erikseen virheenkorjaustiedoston merkin nimestä:

    Red Hatin työntekijä esitteli Goals-kokoonpanojärjestelmän. GNU Make 4.2:n julkaisu

  • Ongelmia vuorovaikutuksessa shell-tulkin kanssa. Esimerkiksi tarve hallita välilyöntejä tiedostojen ja hakemistojen nimissä, resurssien tuhlausta erillisen komentotulkin käynnistämiseen kutakin komentoa suoritettaessa, "$"-merkin kaksinkertainen tulkinta (käytetään sekä shellissä että makeissa), ottaen huomioon sisennykset.

    Nämä ongelmat ratkaistaan ​​Goalsissa käyttämällä kokoonpanomuuttujien "%" -symbolia "$" sijaan ("$" jää vain komentotulkille), käyttämällä jäsennintä LALR(1), joka edellyttää, että polut ja tiedostonimet ympäröidään lainausmerkeillä ja korostetaan koodilohkot aaltosulkeilla. Koko komentolohko käynnistetään komentotulkin yhdestä esiintymästä, ja lohkossa sallitaan mielivaltainen koodin muotoilu ilman erityisiä välilyöntejä.

    Se oli:
    kohde: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Siitä tuli:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Muut Goalsin ominaisuudet:

  • Valinnainen tuki mielivaltaisten nimien ja parametrien määrittämiseen:

    tavoite kaikki = : "tavoite"

    tavoite linkki =
    "target" : "foo.o", "bar.o" { ... }

    tavoite käännös (nimi) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Kaksi käynnistystilaa: luomistila sovittaa koontikohteet tiedostonimiin (esimerkiksi tiedosto "foo.o" vastaa kohdetta "%name.o") ja suora käännöstila:

    tavoite kaikki = : linkki

    tavoite linkki =
    "target" : "foo.o", kääntää ("bar") { ... }

    tavoite käännös (nimi) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Kokoamistaktiikat määräytyvät erityisillä säännöillä, joiden avulla voidaan määrittää tarve koota kokoonpanokohde uudelleen. Jos linkki tehdään tiedoston olemassaoloon, se määritetään nimenomaisesti vastaavan merkin kautta ("kohde" säännön nimelle ja *file ("kohde") tiedoston tarkistamiseksi).

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

    *tiedosto("kohde") : *tiedosto("foo.o"), *tiedosto("bar.o") { ... }

  • Kehittäjä voi määritellä mielivaltaisia ​​kokoonpanotaktiikkojen attribuutteja. Lippu "*file" on määritetty oletusarvoisesti (@{...} tarkoittaa lähdön estämistä ja "exit 99" merkitsee uudelleenmuodostuksen tarvetta):

    taktiikka *tiedosto (tiedostonimi) = @{
    testi -f %tiedostonimi || uloskäynti 99
    f:lle %

    Lähde: opennet.ru

Lisää kommentti