Pracownik Red Hat zaprezentował system budowy Goals. Wydanie GNU Make 4.2

Richard Jones (Richard WM Jones), autor libguestfs, pracujący w firmie Red Hat, przedstawił nowe narzędzie do budowania Cele, którego celem jest usunięcie wad i problemów w narzędziu make przy zachowaniu ogólnej prostoty i zrozumiałości skryptów. Narzędzie make zostało zaprojektowane w 1976 roku i ma szereg koncepcyjnych niedoróbek, które w Cele planuje się usunąć, nie zmieniając ogólnej koncepcji.
Kod źródłowy Celów rozpowszechniany na licencji GPLv2+.

Rozwiązywane problemy:

  • Wsparcie tylko jednej taktyki rozwiązywania zależności — „instrukcja budowlana jest uruchamiana, jeśli plik docelowy nie istnieje lub jest starszy niż jedna z zależności”. W Cele planuje się wdrożenie innych taktyk, takich jak sprawdzanie dostępności URL, porównywanie czasu modyfikacji z dowolnym plikiem, ocena budowy pakietu w Koji, porównywanie sum kontrolnych, uruchamianie zestawów testowych z selektywnym pomijaniem testów.
  • Podczas przetwarzania celów budowania narzędzie make nie rozdziela plików i nazw reguł, a w konsekwencji brak jest weryfikacji, że przy uruchomieniu reguły rzeczywiście zostanie utworzony plik, którego utworzenie jest zadeklarowane. Na przykład, jeśli przy istnieniu reguły o nazwie „test”, uruchamiającej skrypty z testami, przypadkowo zostanie utworzony plik o nazwie „test”, testy przestaną być wywoływane, ponieważ make uzna, że cel został zbudowany i nie wymaga wykonywania jakichkolwiek działań (aby obejść problem w make, można wskazać dyrektywę „.PHONY: test”). Cele wyraźnie rozdzielają pliki i nazwy reguł.

    Pracownik Red Hat zaprezentował system budowy Goals. Wydanie GNU Make 4.2
  • Problem z podawaniem tylko jednego parametru dla poleceń budowlanych.

    Pracownik Red Hat zaprezentował system budowy Goals. Wydanie GNU Make 4.2

    W Cele zaproponowano użycie dowolnej liczby nazwanych parametrów. Na przykład, można oddzielić z nazwy cechę pliku debugowania:

    Pracownik Red Hat zaprezentował system budowy Goals. Wydanie GNU Make 4.2
  • Problemy z interakcją z interpreterem shell. Na przykład, potrzeba kontrolowania eskapowania spacji w nazwach plików i katalogach, marnowanie zasobów na uruchamianie oddzielnego interpretera shell przy wykonywaniu każdej komendy, podwójna interpretacja symbolu „$” (używanego zarówno w shellu, jak i w make), uwzględnienie wcięć.

    Wymienione problemy są rozwiązywane w Celach przez użycie symbolu „%” zamiast „$” dla zmiennych budowlanych („$” pozostaje tylko dla shell), przy zastosowaniu parsera LALR(1), który wymaga otaczania ścieżek i nazw plików cudzysłowami oraz umieszczania bloków kodu w nawiasach klamrowych. Cały blok jest uruchamiany w jednym egzemplarzu powłoki, a wewnątrz bloku dopuszczalne jest dowolne formatowanie kodu, bez powiązania z określonymi spacjami.

    Było:
    target: foo.o bar.o
    ${CC} ${CFLAGS} <$ -o $@

    Stało się:
    «target»: «foo.o», «bar.o» {
    LAGS < -o %@
    }

Inne cechy Goals:

  • Opcjonalne wsparcie dla definiowania dowolnych nazw i parametrów:

    goal all = : «target»

    goal link =
    «target» : «foo.o», «bar.o» { … }

    goal compile (name) =
    «%name.o» : «%name.c», «dep.h» { LAGS -c $^ -o $@ }

  • Dwa tryby uruchamiania: tryb make do mapowania celów budowania na nazwy plików (na przykład plik «foo.o» odpowiada celowi «%name.o»), oraz tryb bezpośredniego uruchomienia kompilacji:

    goal all = : link

    goal link =
    «target» : «foo.o», compile («bar») { … }

    goal compile (name) =
    «%name.o» : «%name.c», «dep.h» { LAGS -c $^ -o $@ }

  • Taktyka budowy jest definiowana przez specjalne zasady, za pomocą których można określić potrzebę ponownego budowania celu budowania. Jeśli istnieje powiązanie z istnieniem pliku, jest to wyraźnie określane przez odpowiedni wskaźnik («target» dla nazwy zasady i *file(«target») dla sprawdzenia pliku).

    «target» : «foo.o», «bar.o» { … }

    *file(«target») : *file(«foo.o»), *file(«bar.o») { … }

  • Programista może definiować dowolne wskaźniki taktyk budowania. Wskaźnik «*file» jest domyślnie zdefiniowany (@{…} wskazuje na tłumienie wyjścia, a «exit 99» sygnalizuje potrzebę ponownego budowania):

    tactic *file (filename) = @{
    test -f %filename || exit 99
    for f in %

    Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster