Richard Jones (Richard WM Jones), auteur , werkend bij Red Hat, een nieuwe buildtool , gericht op het verhelpen van tekortkomingen en problemen in de make-tool, terwijl de algemene eenvoud en begrijpelijkheid van scripts behouden blijft. De make-tool werd in 1976 ontworpen en heeft een aantal conceptuele tekortkomingen, die met Goals verholpen moeten worden zonder de algemene opzet te veranderen.
De broncode van Goals is gelicentieerd onder GPLv2+.
:
- Ondersteuning voor slechts één afhankelijkheidsresolutietactiek — "de build-instructie wordt uitgevoerd als het doelbestand ontbreekt of ouder is dan een van de afhankelijkheden". In Goals is het de bedoeling om andere tactieken te implementeren, zoals controles op de aanwezigheid van een URL, het vergelijken van de wijzigingstijden met elk bestand, en het evalueren van de pakketbuild in , het vergelijken van checksums en het uitvoeren van testsets met selectief overslaan van tests.
- Bij de verwerking van builddoelen maakt de make-tool geen onderscheid tussen bestanden en regelnamen, en daardoor ontbreekt de controle dat bij het uitvoeren van een regel het bestand waarvoor is opgegeven daadwerkelijk zal worden aangemaakt. Bijvoorbeeld, als er een regel bestaat genaamd "test" die scripts met tests uitvoert, maar er toevallig een bestand met de naam "test" wordt aangemaakt, zullen de tests niet meer worden uitgevoerd, omdat make denkt dat het doel is bereikt en geen verdere acties vereist zijn (om dit probleem in make te omzeilen, kan de richtlijn ".PHONY: test" worden opgegeven). Goals maakt duidelijk onderscheid tussen bestanden en regelnamen.

- Probleem met het verstrekken van slechts één parameter voor buildinstructies.

In Goals wordt voorgesteld om een willekeurig aantal benoembare parameters te gebruiken. Zo kan bijvoorbeeld een label voor het debugbestand apart uit de naam worden gehaald:

- Problemen bij de interactie met de shell-interpreter. Bijvoorbeeld, de noodzaak om spaties in bestands- en padnamen te escapen, het verspillen van middelen aan het starten van een aparte shell-interpreter bij het uitvoeren van elke opdracht, dubbele interpretatie van het symbool "$" (gebruikte zowel in de shell als in make), en het rekening houden met inspringingen.
Deze problemen worden in Goals opgelost door het symbool "%" in plaats van "$" voor buildvariabelen te gebruiken ("$" blijft alleen voor de shell), door het toepassen van een parser , waarbij paden en bestandsnamen tussen aanhalingstekens moeten worden geplaatst en codeblokken met accolades moeten worden gemarkeerd. Het hele blok wordt in één instantie van de commandoregel uitgevoerd, en binnen het blok is willekeurige code-indeling toegestaan, zonder dat speciale spaties vereist zijn.
Was:
target: foo.o bar.o
${CC} ${CFLAGS} $< -o $@Het is geworden:
«target»: «foo.o», «bar.o» {
LAGS < -o %@
}
Andere kenmerken van Goals:
- Optionele ondersteuning voor het opgeven van willekeurige namen en parameters:
goal all = : «target»
goal link =
«target» : «foo.o», «bar.o» { … }goal compile (name) =
«%name.o» : «%name.c», «dep.h» { LAGS -c $^ -o $@ } - Twee uitvoermodi: make-modus voor het koppelen van bouwdoelen aan bestandsnamen (bijvoorbeeld, bestand «foo.o» komt overeen met doel «%name.o»), en directe compilatie-uitvoermodus:
goal all = : link
goal link =
«target» : «foo.o», compile («bar») { … }goal compile (name) =
«%name.o» : «%name.c», «dep.h» { LAGS -c $^ -o $@ } - De bouwstrategie wordt bepaald door speciale regels, waarmee kan worden vastgesteld of een bouwdoel opnieuw moet worden samengesteld. Als er een koppeling aan de aanwezigheid van een bestand is, wordt dit expliciet aangegeven door de bijbehorende indicator («target» voor de naam van de regel en *file(«target») voor het controleren van het bestand).
«target» : «foo.o», «bar.o» { … }
*file(«target») : *file(«foo.o»), *file(«bar.o») { … }
- De ontwikkelaar kan willekeurige indicatoren voor bouwstrategieën definiëren. De indicator «*file» is standaard gedefinieerd (@{…} geeft aan om output te onderdrukken, en «exit 99» geeft aan dat hercompilatie nodig is):
tactic *file (filename) = @{
test -f %filename || exit 99
for f in %Bron: opennet.ru



