'n Red Hat-werknemer het die Goals-samestellingstelsel aangebied. Vrystelling van GNU Make 4.2

Richard WM Jones, skrywer libguestfs, werk by Red Hat, voorgelê nuwe monteerhulpmiddel Doelwitte, wat daarop gemik is om tekortkominge en probleme in die nut van maak uit te skakel, terwyl die algehele eenvoud en verstaanbaarheid van skrifte gehandhaaf word. Die maak-hulpmiddel is in 1976 ontwerp en het 'n aantal konseptuele tekortkominge; Doelwitte beplan om hierdie tekortkominge uit te skakel sonder om die algemene konsep te verander.
Doelwitte bronkode versprei deur gelisensieer onder GPLv2+.

Probleme wat opgelos moet word:

  • Ondersteuning vir slegs een afhanklikheidsresolusie-taktiek - "die samestelling-instruksie word uitgevoer as die teikenlêer ontbreek of ouer is as een van die afhanklikhede." Doelwitte beplan om ander taktieke te implementeer, soos om te kyk vir die teenwoordigheid van 'n URL, die vergelyking van wysigingstye met enige lêer, die evaluering van die ingeboude pakket kōji, vergelyking van kontrolesomme, lopende toetsgevalle met selektiewe oorslaan van toetse.
  • By die verwerking van bouteikens, skei make nie lêers en reëlname nie, en gevolglik is daar geen kontrole dat wanneer 'n reël uitgevoer word, die lêer wat dit beweer dat dit geskep is, werklik geskep sal word nie. Byvoorbeeld, as jy 'n reël genaamd "toets" het wat skrifte met toetse laat loop, word 'n lêer met die naam "toets" per ongeluk geskep, dan sal die toetse nie meer geroep word nie, aangesien make sal oorweeg dat die teiken gebou is en nie vereis enige aksie (vir Om die probleem in make te omseil, kan jy die ".PHONY: test"-direktief spesifiseer). Doelwitte skei lêers en reëlname uitdruklik.

    'n Red Hat-werknemer het die Goals-samestellingstelsel aangebied. Vrystelling van GNU Make 4.2

  • Probleem met die verskaffing van slegs een parameter vir monteerinstruksies.

    'n Red Hat-werknemer het die Goals-samestellingstelsel aangebied. Vrystelling van GNU Make 4.2

    Doelwitte laat jou toe om 'n arbitrêre aantal genoemde parameters te gebruik. Byvoorbeeld, jy kan die teken van 'n ontfoutlêer afsonderlik uit die naam onttrek:

    'n Red Hat-werknemer het die Goals-samestellingstelsel aangebied. Vrystelling van GNU Make 4.2

  • Probleme in interaksie met die doptolk. Byvoorbeeld, die behoefte om die ontsnapping van spasies in lêer- en gidsname te beheer, die vermorsing van hulpbronne met die bekendstelling van 'n aparte dop-tolk wanneer elke opdrag uitgevoer word, die dubbele interpretasie van die "$"-karakter (gebruik in beide dop en maak), met inagneming van inkepings.

    Hierdie probleme word in Doelwitte opgelos deur die “%”-simbool in plaas van “$” vir samestellingsveranderlikes te gebruik (“$” bly net vir die dop), met behulp van 'n ontleder LALR(1), wat vereis dat jy paaie en lêername met aanhalingstekens omring en kodeblokke met krullerige hakies uitlig. Die hele opdragblok word in een geval van die opdragdop geloods, en binne die blok word arbitrêre kodeformatering toegelaat, sonder verwysing na spesiale spasies.

    Was:
    teiken: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Dit het geword:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Ander kenmerke van Doelwitte:

  • Opsionele ondersteuning vir die spesifiseer van arbitrêre name en parameters:

    doel almal = : "teiken"

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

    doel saamstel (naam) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Twee bekendstellingmodusse: maak-modus om bouteikens met lêername te pas (byvoorbeeld, lêer "foo.o" pas by teiken "%name.o"), en direkte samestellingmodus:

    doel almal = : skakel

    doelskakel =
    "target" : "foo.o", stel ("bar") { ... }

    doel saamstel (naam) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Monteertaktiek word bepaal deur spesiale reëls wat gebruik kan word om te bepaal of 'n monteerteiken weer bymekaar moet word. As 'n skakel na die teenwoordigheid van 'n lêer gemaak word, word dit uitdruklik bepaal deur die ooreenstemmende teken ("teiken" vir die reëlnaam en *lêer ("teiken") om die lêer na te gaan).

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

    *file("teiken") : *lêer("foo.o"), *lêer("bar.o") { ... }

  • Die ontwikkelaar kan arbitrêre eienskappe van samestelling taktiek definieer. Die "*lêer"-vlag word by verstek gedefinieer (@{...} dui onderdrukking van uitvoer aan, en "uitgang 99" dui die behoefte aan om te herbou):

    taktiek *lêer (lêernaam) = @{
    toets -f %lêernaam || uitgang 99
    vir f in %

    Bron: opennet.ru

Voeg 'n opmerking