Zaposlenik Red Hata predstavio je sustav za sklapanje Goals. Izdanje GNU Make 4.2

Richard WM Jones, autor libguestfs, radeći u Red Hatu, podnijeti novi uslužni program za montažu Golovi, s ciljem uklanjanja nedostataka i problema uslužnog programa make uz zadržavanje ukupne jednostavnosti i jasnoće skripti. Uslužni program make dizajniran je 1976. godine i ima niz konceptualnih nedostataka. Ciljevi imaju za cilj riješiti te nedostatke bez promjene cjelokupnog koncepta.
Izvorni kod ciljeva distribuira licenciran pod GPLv2+.

Rješavanje problema:

  • Podrška za samo jednu taktiku rješavanja ovisnosti - "instrukcija za izgradnju se pokreće ako ciljna datoteka nedostaje ili je starija od jedne od ovisnosti." Goals planira implementirati i druge taktike, kao što je provjera prisutnosti URL-a, usporedba vremena modifikacije s bilo kojom datotekom i procjena izgradnje paketa. kōji, usporedba kontrolnih zbrojeva, pokretanje testnih paketa sa selektivnim preskakanjem testova.
  • Prilikom obrade ciljeva izgradnje, make ne razlikuje datoteke i nazive pravila, te stoga ne postoji provjera koja bi osigurala da će datoteka koju tvrdi da stvara zapravo biti stvorena kada se pravilo pokrene. Na primjer, ako pravilo pod nazivom "test" pokrene testne skripte i datoteka pod nazivom "test" se slučajno stvori, testovi će se prestati pozivati ​​jer će make pretpostaviti da je cilj izgrađen i da ne zahtijeva nikakve radnje. (Da biste to zaobišli, možete odrediti direktivu ".PHONY:test" u make.) Goals eksplicitno razlikuje datoteke i nazive pravila.

     Zaposlenik Red Hata predstavio je sustav za sklapanje Goals. Izdanje GNU Make 4.2
  • Problem s navođenjem samo jednog parametra za upute za sastavljanje.

     Zaposlenik Red Hata predstavio je sustav za sklapanje Goals. Izdanje GNU Make 4.2

    Ciljevi omogućuju korištenje neograničenog broja imenovanih parametara. Na primjer, možete zasebno izdvojiti zastavicu datoteke za otklanjanje pogrešaka iz naziva:

     Zaposlenik Red Hata predstavio je sustav za sklapanje Goals. Izdanje GNU Make 4.2
  • Problemi u interakciji s interpreterom ljuske. Na primjer, potreba za kontrolom izbjegavanja razmaka u nazivima datoteka i direktorija, opterećenje resursima pokretanja zasebnog interpretera ljuske za svaku naredbu, dvostruko tumačenje simbola "$" (koristi se i u ljusci i u make-u) i uvlačenje.

    Spomenuti problemi su riješeni u Ciljevima korištenjem simbola "%" umjesto "$" za asemblerske varijable ("$" ostaje samo za ljusku), korištenjem parsera LALR(1), što zahtijeva navođenje putanja i imena datoteka te razgraničenje blokova koda vitičastim zagradama. Cijeli naredbeni blok izvršava se u jednoj instanci naredbene ljuske, a unutar bloka dopušteno je proizvoljno formatiranje koda, bez ograničenja posebnim razmacima.

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

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

Ostale značajke ciljeva:

  • Dodatna podrška za određivanje prilagođenih naziva i parametara:

    cilj sve = : "cilj"

    ciljna veza =
    "cilj" : "foo.o", "bar.o" { ... }

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

  • Dva načina pokretanja: make način za usklađivanje ciljeva izgradnje s nazivima datoteka (npr. datoteka "foo.o" odgovara cilju "%name.o") i način izravnog kompajliranja:

    cilj sve = : poveznica

    ciljna veza =
    "cilj" : "foo.o", kompajliraj ("bar") { ... }

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

  • Taktike izgradnje definirane su posebnim pravilima koja se mogu koristiti za određivanje treba li cilj izgradnje ponovno izgraditi. Ako je potrebna prisutnost datoteke, to se eksplicitno navodi pomoću odgovarajuće zastavice ("target" za naziv pravila i *file("target") za provjeru datoteka).

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

    *datoteka("cilj") : *datoteka("foo.o"), *datoteka("bar.o") { ... }

  • Programer može definirati prilagođene zastavice strategije izgradnje. Zastavica "*file" definirana je prema zadanim postavkama (@{…} označava supresiju izlaza, a "exit 99" signalizira potrebu za ponovnom izgradnjom):

    taktika *datoteka (naziv datoteke) = @{
    test -f %naziv_datoteke || izlaz 99
    za f u %

    Izvor: opennet.ru

Dodajte komentar