Zaposlenik Red Hata predstavio je sistem sastavljanja ciljeva. Izdanje GNU Make 4.2

Richard WM Jones, autor libguestfs, radi u Red Hatu, uveo novi uslužni program za montažu Ciljevi, čiji je cilj uklanjanje nedostataka i problema u korisnosti make uz zadržavanje ukupne jednostavnosti i razumljivosti skripti. Uslužni program make je dizajniran 1976. godine i ima brojne konceptualne nedostatke; Goals planira eliminirati ove nedostatke bez promjene općeg koncepta.
Izvorni kod ciljeva distribuira licenciran pod GPLv2+.

Rješivi problemi:

  • Podrška samo za jednu taktiku rješavanja ovisnosti - "instrukcija asemblera se pokreće ako ciljna datoteka nedostaje ili je starija od jedne od ovisnosti." Ciljevi planiraju implementaciju drugih taktika, kao što je provjera prisutnosti URL-a, upoređivanje vremena modifikacije sa bilo kojom datotekom, procjena ugrađenog paketa kōji, poređenje kontrolnih suma, pokretanje test slučajeva sa selektivnim preskakanjem testova.
  • Prilikom obrade ciljeva izgradnje, make ne odvaja datoteke i imena pravila, i kao rezultat toga, nema provjere da će prilikom pokretanja pravila datoteka za koju tvrdi da je kreirana zapravo biti kreirana. Na primjer, ako imate pravilo pod nazivom "test" koje pokreće skripte s testovima, slučajno se kreira datoteka pod nazivom "test", tada se testovi više neće pozivati, jer će make smatrati da je cilj izgrađen i da ne zahtijeva bilo koju radnju (da biste zaobišli problem u make, možete navesti direktivu “.PHONY: test”). Ciljevi eksplicitno razdvajaju nazive datoteka i pravila.

    Zaposlenik Red Hata predstavio je sistem sastavljanja ciljeva. Izdanje GNU Make 4.2

  • Problem sa davanjem samo jednog parametra za uputstva za sastavljanje.

    Zaposlenik Red Hata predstavio je sistem sastavljanja ciljeva. Izdanje GNU Make 4.2

    Ciljevi vam omogućavaju da koristite proizvoljan broj imenovanih parametara. Na primjer, možete zasebno izdvojiti znak datoteke za otklanjanje grešaka iz imena:

    Zaposlenik Red Hata predstavio je sistem sastavljanja ciljeva. Izdanje GNU Make 4.2

  • Problemi u interakciji s shell interpreterom. Na primjer, potreba za kontrolom bježanja razmaka u imenima datoteka i direktorija, rasipanje resursa na pokretanje zasebnog tumača ljuske pri izvršavanju svake naredbe, dvostruko tumačenje znaka “$” (koristi se i u shell i make), uzimajući u obzir udubljenja.

    Ovi problemi se rješavaju u ciljevima korištenjem simbola “%” umjesto “$” za varijable sklopa (“$” ostaje samo za ljusku), koristeći parser LALR(1), što zahtijeva da putanje i imena datoteka okružite navodnicima i istaknete blokove koda vitičastim zagradama. Cijeli komandni blok se pokreće u jednoj instanci komandne ljuske, a unutar bloka je dozvoljeno proizvoljno formatiranje koda, bez pozivanja na posebne razmake.

    Bilo je:
    cilj: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

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

Ostale karakteristike golova:

  • Opciona podrška za određivanje proizvoljnih imena i parametara:

    cilj sve = : "cilj"

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

    cilj kompajlirati (ime) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Dva načina pokretanja: način rada za usklađivanje ciljeva izgradnje s imenima datoteka (na primjer, datoteka "foo.o" odgovara cilju "%name.o") i način izravne kompilacije:

    cilj sve = : link

    cilj link =
    "target" : "foo.o", kompajliraj ("bar") { ... }

    cilj kompajlirati (ime) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Taktike sklapanja određuju se posebnim pravilima koja se mogu koristiti za utvrđivanje potrebe za ponovnim sastavljanjem montažne mete. Ako je napravljena veza sa prisustvom datoteke, onda se to eksplicitno određuje kroz odgovarajući znak (“cilj” za ime pravila i *file (“cilj”) za provjeru datoteke).

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

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

  • Programer može definirati proizvoljne atribute taktike sklapanja. Oznaka "*file" je definirana po defaultu (@{...} označava potiskivanje izlaza, a "exit 99" signalizira potrebu za ponovnom izgradnjom):

    taktika *file (ime fajla) = @{
    test -f %ime datoteke || izlaz 99
    za f u %

    izvor: opennet.ru

Dodajte komentar