Un empleat de Red Hat va presentar el sistema de muntatge de Goals. Llançament de GNU Make 4.2

Richard WM Jones, autor libguestfs, treballant a Red Hat, introduït nova utilitat de muntatge Objectius, amb l'objectiu d'eliminar deficiències i problemes en la utilitat de make tot mantenint la senzillesa i la comprensió generals dels scripts. La utilitat make va ser dissenyada l'any 1976 i té una sèrie de deficiències conceptuals. Objectius planeja eliminar aquestes mancances sense canviar el concepte general.
Codi font dels objectius Distribuït per amb llicència GPLv2+.

Problemes solventes:

  • Suport per a només una tàctica de resolució de dependències: "la instrucció de muntatge s'executa si falta el fitxer de destinació o és més antic que una de les dependències". Objectius té previst implementar altres tàctiques, com ara comprovar la presència d'un URL, comparar els temps de modificació amb qualsevol fitxer, avaluar el paquet integrat. OMS, comparació de sumes de control, execució de casos de prova amb salts selectius de proves.
  • Quan es processen els objectius de compilació, make no separa els fitxers i els noms de les regles i, com a resultat, no s'ha de comprovar que quan s'executa una regla, es crearà realment el fitxer que diu que s'ha creat. Per exemple, si teniu una regla anomenada "test" que executa scripts amb proves, es crea accidentalment un fitxer anomenat "test", llavors les proves ja no es cridaran, ja que make considerarà que l'objectiu està construït i no requereix qualsevol acció (per solucionar el problema en make, podeu especificar la directiva “.PHONY: prova”). Objectius separa explícitament els fitxers i els noms de les regles.

    Un empleat de Red Hat va presentar el sistema de muntatge de Goals. Llançament de GNU Make 4.2

  • Problema amb proporcionar només un paràmetre per a les instruccions de muntatge.

    Un empleat de Red Hat va presentar el sistema de muntatge de Goals. Llançament de GNU Make 4.2

    Objectius us permet utilitzar un nombre arbitrari de paràmetres anomenats. Per exemple, podeu extreure per separat el signe d'un fitxer de depuració del nom:

    Un empleat de Red Hat va presentar el sistema de muntatge de Goals. Llançament de GNU Make 4.2

  • Problemes d'interacció amb l'intèrpret de l'intèrpret d'ordres. Per exemple, la necessitat de controlar l'escapada d'espais als noms de fitxers i directoris, el malbaratament de recursos en llançar un intèrpret d'intèrpret d'ordres separat quan s'executa cada ordre, la doble interpretació del caràcter "$" (utilitzat tant a l'intèrpret d'ordres com a make), tenint en compte les sagnies.

    Aquests problemes es resolen a Objectius utilitzant el símbol "%" en comptes de "$" per a les variables d'assemblatge ("$" roman només per a l'intèrpret d'ordres), utilitzant un analitzador. LALR(1), que requereix que envolteu els camins i els noms dels fitxers amb cometes i ressalteu els blocs de codi amb claus. Tot el bloc d'ordres es llança en una instància de l'intèrpret d'ordres i, dins del bloc, es permet el format de codi arbitrari, sense fer referència a espais especials.

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

    Es va convertir en:
    "target": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Altres característiques de Goals:

  • Suport opcional per especificar noms i paràmetres arbitraris:

    goal all = : "objectiu"

    enllaç objectiu =
    "target": "foo.o", "bar.o" { ... }

    compilar objectiu (nom) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Dos modes de llançament: el mode de creació per fer coincidir els objectius de compilació amb els noms de fitxer (per exemple, el fitxer "foo.o" coincideix amb l'objectiu "%name.o") i el mode de compilació directa:

    objectiu tot = : enllaç

    enllaç objectiu =
    "target": "foo.o", compila ("bar") { ... }

    compilar objectiu (nom) =
    "%name.o" : "%name.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Les tàctiques de muntatge estan determinades per regles especials que es poden utilitzar per determinar la necessitat de tornar a muntar un objectiu de muntatge. Si es fa un enllaç a la presència d'un fitxer, això es determina explícitament mitjançant el signe corresponent ("destí" per al nom de la regla i *fitxer ("destí") per comprovar el fitxer).

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

    *fitxer("destí"): *fitxer("foo.o"), *fitxer("bar.o") { ... }

  • El desenvolupador pot definir atributs arbitraris de les tàctiques de muntatge. La marca "*fitxer" es defineix per defecte (@{...} indica la supressió de la sortida, i la "sortida 99" indica la necessitat de reconstruir-la):

    tàctica *fitxer (nom de fitxer) = @{
    prova -f %filename || sortida 99
    per f en %

    Font: opennet.ru

Afegeix comentari