Isang empleyado ng Red Hat ang nagpakita ng Goals assembly system. Paglabas ng GNU Make 4.2

Richard WM Jones, may-akda libguestfs, nagtatrabaho sa Red Hat, ipinakilala bagong build utility Layunin, na naglalayong alisin ang mga pagkukulang at problema sa utility ng paggawa habang pinapanatili ang pangkalahatang pagiging simple at madaling maunawaan ng mga script. Ang make utility ay idinisenyo noong 1976 at may ilang mga pagkukulang sa konsepto; Plano ng mga layunin na alisin ang mga pagkukulang na ito nang hindi binabago ang pangkalahatang konsepto.
Source code ng mga layunin ipinamahagi ni lisensyado sa ilalim ng GPLv2+.

Mga nalutas na problema:

  • Suporta para lamang sa isang taktika sa pagresolba ng dependency - "ang pagtuturo ng pagpupulong ay pinapatakbo kung ang target na file ay nawawala o mas luma sa isa sa mga dependency." Plano ng Mga Layunin na magpatupad ng iba pang mga taktika, tulad ng pagsuri sa pagkakaroon ng URL, paghahambing ng mga oras ng pagbabago sa anumang file, pagsusuri sa package build in kōji, paghahambing ng mga checksum, pagpapatakbo ng mga kaso ng pagsubok na may piling paglaktaw ng mga pagsubok.
  • Kapag nagpoproseso ng mga target ng build, hindi pinaghihiwalay ng make ang mga file at mga pangalan ng panuntunan, at bilang resulta, walang pag-check na kapag nagpapatakbo ng isang panuntunan, ang file na sinasabing nilikha nito ay talagang gagawin. Halimbawa, kung mayroon kang panuntunan na tinatawag na "pagsubok" na nagpapatakbo ng mga script na may mga pagsubok, isang file na pinangalanang "pagsubok" ay hindi sinasadyang nalikha, pagkatapos ay hindi na tatawagin ang mga pagsubok, dahil isasaalang-alang ng make na ang target ay binuo at hindi nangangailangan anumang aksyon (para sa Upang malutas ang problema sa paggawa, maaari mong tukuyin ang ".PHONY: test" na direktiba). Ang mga layunin ay tahasang naghihiwalay ng mga file at pangalan ng panuntunan.

    Isang empleyado ng Red Hat ang nagpakita ng Goals assembly system. Paglabas ng GNU Make 4.2

  • Problema sa pagbibigay lamang ng isang parameter para sa mga tagubilin sa pagpupulong.

    Isang empleyado ng Red Hat ang nagpakita ng Goals assembly system. Paglabas ng GNU Make 4.2

    Binibigyang-daan ka ng Mga Layunin na gumamit ng arbitrary na bilang ng mga pinangalanang parameter. Halimbawa, maaari mong hiwalay na i-extract ang sign ng isang debug file mula sa pangalan:

    Isang empleyado ng Red Hat ang nagpakita ng Goals assembly system. Paglabas ng GNU Make 4.2

  • Mga problema sa pakikipag-ugnayan sa shell interpreter. Halimbawa, ang pangangailangan na kontrolin ang pagtakas ng mga puwang sa mga pangalan ng file at direktoryo, ang pag-aaksaya ng mga mapagkukunan sa paglulunsad ng isang hiwalay na interpreter ng shell kapag isinasagawa ang bawat utos, ang dobleng interpretasyon ng karakter na "$" (ginagamit sa parehong shell at make), isinasaalang-alang ang mga indentasyon.

    Ang mga problemang ito ay nalulutas sa Mga Layunin sa pamamagitan ng paggamit ng simbolo na β€œ%” sa halip na β€œ$” para sa mga variable ng pagpupulong (β€œ$” ay nananatili lamang para sa shell), gamit ang isang parser LALR(1), na nangangailangan sa iyo na palibutan ang mga landas at mga pangalan ng file na may mga quote at i-highlight ang mga bloke ng code na may mga kulot na brace. Ang buong command block ay inilunsad sa isang pagkakataon ng command shell, at sa loob ng block, pinapayagan ang arbitrary code formatting, nang walang reference sa mga espesyal na espasyo.

    Ito ay:
    target: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Ito ay naging:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Iba pang mga tampok ng Mga Layunin:

  • Opsyonal na suporta para sa pagtukoy ng mga arbitrary na pangalan at parameter:

    layunin lahat = : "target"

    link ng layunin =
    "target" : "foo.o", "bar.o" { ... }

    pagsasama-sama ng layunin (pangalan) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Dalawang mode ng paglulunsad: gumawa ng mode upang tumugma sa mga target ng build sa mga filename (halimbawa, ang file na "foo.o" ay tumutugma sa target na "%name.o"), at direct compilation mode:

    layunin lahat = : link

    link ng layunin =
    "target" : "foo.o", compile ("bar") { ... }

    pagsasama-sama ng layunin (pangalan) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Ang mga taktika ng pagpupulong ay tinutukoy ng mga espesyal na panuntunan na maaaring magamit upang matukoy ang pangangailangan na muling buuin ang isang target na pagpupulong. Kung ang isang link ay ginawa sa pagkakaroon ng isang file, ito ay tahasang tinutukoy sa pamamagitan ng kaukulang sign (β€œtarget” para sa pangalan ng panuntunan at *file (β€œtarget”) para sa pagsuri sa file).

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

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

  • Maaaring tukuyin ng developer ang mga arbitrary na katangian ng mga taktika sa pagpupulong. Ang flag na "*file" ay tinukoy bilang default (@{...} ay nagpapahiwatig ng pagsugpo sa output, at ang "exit 99" ay nagpapahiwatig ng pangangailangan para sa muling pagtatayo):

    taktika *file (filename) = @{
    pagsubok -f %filename || labasan 99
    para sa f sa %

    Pinagmulan: opennet.ru

Magdagdag ng komento