Impjegat ta’ Red Hat ippreżenta s-sistema ta’ assemblaġġ ta’ Goals. Ħruġ ta' GNU Make 4.2

Richard WM Jones, awtur libguestfs, li taħdem fir-Red Hat, daħħal utilità ta 'assemblaġġ ġdid Għanijiet, immirat biex jelimina n-nuqqasijiet u l-problemi fl-utilità ta 'make filwaqt li jżommu s-sempliċità ġenerali u l-fehim tal-iskripts. L-utilità make ġiet iddisinjata fl-1976 u għandha numru ta 'nuqqasijiet kunċettwali Għanijiet pjanijiet biex jeliminaw dawn in-nuqqasijiet mingħajr ma jinbidel il-kunċett ġenerali.
Kodiċi tas-sors tal-għanijiet imqassma minn liċenzjat taħt GPLv2+.

Problemi solvuti:

  • Appoġġ għal tattika waħda biss għar-riżoluzzjoni tad-dipendenza - "l-istruzzjoni tal-assemblaġġ titmexxa jekk il-fajl fil-mira jkun nieqes jew ikun eqdem minn waħda mid-dipendenzi." Għanijiet jippjanaw li jimplimentaw tattiċi oħra, bħall-iċċekkjar għall-preżenza ta 'URL, it-tqabbil tal-ħinijiet tal-modifika ma' kwalunkwe fajl, l-evalwazzjoni tal-pakkett build in kōji, paragun ta 'checksums, tmexxija ta' każijiet tat-test bi qbiż selettiv tat-testijiet.
  • Meta tipproċessa l-miri tal-bini, make ma tisseparax fajls u ismijiet tar-regoli, u bħala riżultat, m'hemm l-ebda kontroll li meta tmexxi regola, il-fajl li jiddikjara li jinħoloq fil-fatt jinħoloq. Pereżempju, jekk għandek regola msejħa "test" li tmexxi skripts bit-testijiet, jinħoloq aċċidentalment fajl bl-isem "test", allura t-testijiet ma jibqgħux jissejħu, peress li make se tqis li l-mira hija mibnija u ma teħtieġx kwalunkwe azzjoni (għal Biex taħdem madwar il-problema fil make, tista 'tispeċifika d-direttiva ".PHONY: test"). L-għanijiet jisseparaw b'mod espliċitu l-fajls u l-ismijiet tar-regoli.

    Impjegat ta’ Red Hat ippreżenta s-sistema ta’ assemblaġġ ta’ Goals. Ħruġ ta' GNU Make 4.2

  • Problema li tipprovdi parametru wieħed biss għall-istruzzjonijiet tal-assemblaġġ.

    Impjegat ta’ Red Hat ippreżenta s-sistema ta’ assemblaġġ ta’ Goals. Ħruġ ta' GNU Make 4.2

    Għanijiet jippermettilek tuża numru arbitrarju ta 'parametri msemmija. Pereżempju, tista' tiġbed separatament is-sinjal ta' fajl ta' debug mill-isem:

    Impjegat ta’ Red Hat ippreżenta s-sistema ta’ assemblaġġ ta’ Goals. Ħruġ ta' GNU Make 4.2

  • Problemi fl-interazzjoni mal-interpretu tal-qoxra. Pereżempju, il-ħtieġa li tikkontrolla l-ħarba ta 'spazji fl-ismijiet tal-fajls u tad-direttorju, il-ħela ta' riżorsi fuq it-tnedija ta 'interpretu tal-qoxra separat meta tesegwixxi kull kmand, l-interpretazzjoni doppja tal-karattru "$" (użat kemm fil-qoxra kif ukoll fil-għamla), filwaqt li jitqiesu l-inċiżjonijiet.

    Dawn il-problemi jiġu solvuti fl-Għanijiet billi tuża s-simbolu “%” minflok “$” għall-varjabbli tal-assemblaġġ (“$” jibqa’ biss għall-qoxra), bl-użu ta’ parser LALR(1), li teħtieġ li ddawwar il-mogħdijiet u l-ismijiet tal-fajls bi kwotazzjonijiet u tenfasizza blokki tal-kodiċi b'ċingi kaboċċi. Il-blokk tal-kmand kollu huwa mniedi f'istanza waħda tal-qoxra tal-kmand, u fi ħdan il-blokk, l-ifformattjar tal-kodiċi arbitrarju huwa permess, mingħajr referenza għal spazji speċjali.

    Kien:
    mira: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Sar:
    "mira": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Karatteristiċi oħra tal-Għanijiet:

  • Appoġġ mhux obbligatorju biex jiġu speċifikati ismijiet u parametri arbitrarji:

    għan kollu = : "mira"

    rabta tal-għan =
    "target" : "foo.o", "bar.o" { ... }

    għan jikkompila (isem) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Żewġ modi tat-tnedija: il-modalità make biex tqabbel il-miri tal-bini mal-ismijiet tal-fajls (pereżempju, il-fajl "foo.o" jaqbel mal-mira "%name.o"), u l-mod ta' kumpilazzjoni diretta:

    għan kollha = : link

    rabta tal-għan =
    "target" : "foo.o", ikkumpila ("bar") { ... }

    għan jikkompila (isem) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • It-tattiċi tal-assemblaġġ huma ddeterminati minn regoli speċjali li jistgħu jintużaw biex jiddeterminaw il-ħtieġa li terġa 'tiġbor mira tal-assemblaġġ. Jekk issir rabta mal-preżenza ta 'fajl, allura dan jiġi ddeterminat b'mod espliċitu permezz tas-sinjal korrispondenti ("mira" għall-isem tar-regola u * fajl ("mira") għall-iċċekkjar tal-fajl).

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

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

  • L-iżviluppatur jista 'jiddefinixxi attributi arbitrarji ta' tattiċi ta 'assemblaġġ. Il-bandiera "*file" hija definita b'mod awtomatiku (@{...} tindika t-trażżin tal-output, u "ħruġ 99" tindika l-ħtieġa għall-bini mill-ġdid):

    tattika *file (isem tal-fajl) = @{
    test -f %filename || ħruġ 99
    għal f f'%

    Sors: opennet.ru

Żid kumment