Un angajat Red Hat a prezentat sistemul de compilare Goals. Lansarea GNU Make 4.2

Richard Jones (Richard WM Jones), autor libguestfs, care lucrează la Red Hat, a prezentat noua unealtă de compilare Obiective, destinată să abordeze deficiențele și problemele unealtelor make, păstrând în același timp simplitatea și claritatea scripturilor. Unealta make a fost proiectată în 1976 și are o serie de neajunsuri concepute, în Goals se propune eliminarea acestei neajunsuri, fără a schimba conceptul general.
Codul sursă al Goals se răspândește sub licența GPLv2+.

Probleme abordate:

  • Suport pentru o singură tactică de rezolvare a dependențelor — „instrucțiunea de compilare se execută dacă fișierul țintă este absent sau dacă este mai vechi decât oricare dintre dependențe”. În Goals se intenționează implementarea și altor tactici, cum ar fi verificarea existenței URL-ului, compararea timpului de modificare cu orice fișier, evaluarea construirii pachetului în Koji, compararea sumelor de control, rularea seturilor de teste cu omisiuni selective ale testelor.
  • Atunci când procesează obiectivele de construire, unealta make nu distinge între fișiere și numele regulilor, iar ca urmare, lipsește verificarea că, atunci când regula este executată, fișierul declarat va fi efectiv creat. De exemplu, dacă există o regulă numită „test”, care execută scripturi cu teste, și se creează din greșeală un fișier numit „test”, testele nu vor mai fi apelate, deoarece make va considera că obiectivul este construit și nu necesită executarea unor acțiuni (pentru a evita problema în make, se poate specifica directiva „.PHONY: test”). Goals separă clar fișierele de numele regulilor.

    Un angajat Red Hat a prezentat sistemul de compilare Goals. Lansarea GNU Make 4.2
  • Problema furnizării unui singur parametru pentru instrucțiunile de construire.

    Un angajat Red Hat a prezentat sistemul de compilare Goals. Lansarea GNU Make 4.2

    În Goals se propune utilizarea unui număr arbitrar de parametri numiți. De exemplu, se poate extrage separat din nume caracteristica fișierului de depanare:

    Un angajat Red Hat a prezentat sistemul de compilare Goals. Lansarea GNU Make 4.2
  • Problemele de interacțiune cu interpretul shell. De exemplu, necesitatea de a controla escaparea spațiilor în numele fișierelor și directoarelor, consumul de resurse pentru a porni un interpret shell separat la fiecare comandă, interpretarea dublă a simbolului „$” (utilizat atât în shell, cât și în make), gestionarea indentării.

    Problemele menționate sunt rezolvate în Goals prin utilizarea simbolului „%” în loc de „$” pentru variabilele de construire („$” rămâne doar pentru shell), aplicând un parser LALR(1), care necesită încadrarea căilor și numelui fișierelor între ghilimele și delimitarea blocurilor de cod cu acolade. Întregul bloc este executat într-o singură instanță a shell-ului, iar în interiorul blocului este permis un format aleatoriu al codului, fără legătură cu spațiile speciale.

    A fost:
    target: foo.o bar.o
    ${CC} ${CFLAGS} <$ -o $@

    A devenit:
    «target»: «foo.o», «bar.o» {
    LAGS < -o %@
    }

Alte caracteristici ale Goals:

  • Suport opțional pentru specificarea numelui și parametrilor arbitrar:

    goal all = : «target»

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

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

  • Două moduri de execuție: modul make pentru corelarea obiectivelor de construire cu numele fișierelor (de exemplu, fișierul «foo.o» corespunde obiectivului «%name.o»), și modul de execuție directă a compilării:

    goal all = : link

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

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

  • Tactica de construire este definită prin reguli speciale, prin intermediul cărora se poate determina necesitatea recompilării obiectivului. Dacă se face referire la existența unui fișier, aceasta este definită explicit printr-un semn corespunzător («target» pentru numele regulii și *file(«target») pentru verificarea fișierului).

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

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

  • Dezvoltatorul poate defini semne arbitrare pentru tacticile de construire. Semnul «*file» este definit implicit (@{…} indică supresia ieșirii, iar «exit 99» semnalează necesitatea recompilării):

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

    Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster