Richard Jones (Richard WM Jones), autor , care lucrează la Red Hat, noua unealtă de compilare , 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 sub licența GPLv2+.
:
- 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 , 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.

- Problema furnizării unui singur parametru pentru instrucțiunile de construire.

Î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:

- 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 , 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



