Un dipendente Red Hat ha presentato il sistema di assemblaggio degli obiettivi. Rilascio di GNU Make 4.2

Richard WM Jones, autore libguestfs, lavorando presso Red Hat, presentata nuova utilità di assemblaggio Obiettivi, mirato a eliminare carenze e problemi nell'utilità di make mantenendo la semplicità e la comprensibilità complessive degli script. L'utilità make è stata progettata nel 1976 e presenta una serie di carenze concettuali; Goals prevede di eliminare queste carenze senza modificare il concetto generale.
Codice sorgente degli obiettivi distribuito da concesso in licenza con GPLv2+.

Risolti i problemi:

  • Supporto per una sola tattica di risoluzione delle dipendenze: "l'istruzione di assembly viene eseguita se il file di destinazione manca o è più vecchio di una delle dipendenze". Obiettivi prevede di implementare altre tattiche, come verificare la presenza di un URL, confrontare i tempi di modifica con qualsiasi file, valutare il pacchetto build in Quale, confronto dei checksum, esecuzione di casi di test con salto selettivo dei test.
  • Durante l'elaborazione delle destinazioni di compilazione, make non separa i file e i nomi delle regole e, di conseguenza, non esiste alcun controllo che, durante l'esecuzione di una regola, il file che dichiara di essere creato venga effettivamente creato. Ad esempio, se hai una regola chiamata "test" che esegue script con test, viene creato accidentalmente un file chiamato "test", quindi i test non verranno più chiamati, poiché make considererà che il target è costruito e non richiede alcun azione (per aggirare il problema in make, è possibile specificare la direttiva “.PHONY: test”). Gli obiettivi separano esplicitamente i nomi di file e regole.

    Un dipendente Red Hat ha presentato il sistema di assemblaggio degli obiettivi. Rilascio di GNU Make 4.2

  • Problema nel fornire un solo parametro per le istruzioni di assemblaggio.

    Un dipendente Red Hat ha presentato il sistema di assemblaggio degli obiettivi. Rilascio di GNU Make 4.2

    Gli obiettivi ti consentono di utilizzare un numero arbitrario di parametri denominati. Ad esempio, puoi estrarre separatamente il segno di un file di debug dal nome:

    Un dipendente Red Hat ha presentato il sistema di assemblaggio degli obiettivi. Rilascio di GNU Make 4.2

  • Problemi di interazione con l'interprete della shell. Ad esempio, la necessità di controllare l'escape degli spazi nei nomi di file e directory, lo spreco di risorse nel lanciare un interprete shell separato durante l'esecuzione di ciascun comando, la doppia interpretazione del carattere "$" (utilizzato sia nella shell che nel make), tenendo conto delle rientranze.

    Questi problemi vengono risolti in Goals utilizzando il simbolo “%” invece di “$” per le variabili assembly (“$” rimane solo per la shell), utilizzando un parser LALR(1), che richiede di racchiudere percorsi e nomi di file tra virgolette ed evidenziare i blocchi di codice tra parentesi graffe. L'intero blocco di comandi viene avviato in un'istanza della shell dei comandi e all'interno del blocco è consentita la formattazione arbitraria del codice, senza riferimento a spazi speciali.

    Era:
    destinazione: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    È diventato:
    "bersaglio": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Altre caratteristiche degli obiettivi:

  • Supporto opzionale per specificare nomi e parametri arbitrari:

    obiettivo tutto =: "obiettivo"

    collegamento obiettivo =
    "bersaglio" : "foo.o", "bar.o" { ... }

    compilazione obiettivo (nome) =
    "%nome.o" : "%nome.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Due modalità di avvio: modalità make per abbinare le destinazioni di compilazione ai nomi dei file (ad esempio, il file "foo.o" corrisponde alla destinazione "%name.o") e modalità di compilazione diretta:

    obiettivo tutto =: collegamento

    collegamento obiettivo =
    "target" : "foo.o", compile ("bar") { ... }

    compilazione obiettivo (nome) =
    "%nome.o" : "%nome.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Le tattiche di assemblaggio sono determinate da regole speciali che possono essere utilizzate per determinare la necessità di riassemblare un bersaglio di assemblaggio. Se viene creato un collegamento alla presenza di un file, ciò viene determinato esplicitamente tramite il segno corrispondente (“target” per il nome della regola e *file (“target”) per il controllo del file).

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

    *file("target") : *file("foo.o"), *file("bar.o") { ... }

  • Lo sviluppatore può definire attributi arbitrari delle tattiche di assemblaggio. Il flag "*file" è definito per impostazione predefinita (@{...} indica la soppressione dell'output e "exit 99" segnala la necessità di ricostruire):

    tattica *file (nome file) = @{
    prova -f %nomefile || uscita 99
    per f in %

    Fonte: opennet.ru

Aggiungi un commento