Un empleado de Red Hat presentó el sistema de compilación Goals. Lanzamiento de GNU Make 4.2

Richard Jones (Richard WM Jones), autor libguestfs, que trabaja en Red Hat, presentó una nueva herramienta de ensamblaje Objetivos, diseñada para abordar las deficiencias y problemas en la herramienta make manteniendo la simplicidad y claridad de los scripts. La herramienta make fue diseñada en 1976 y tiene una serie de deficiencias conceptuales, que en Goals se pretende corregir sin cambiar la idea general.
El código fuente de Goals se distribuye bajo la licencia GPLv2+.

Problemas abordados:

  • Soporte para una sola táctica de resolución de dependencias: 'la instrucción de ensamblaje se ejecuta si el archivo objetivo no existe o es más antiguo que alguna de las dependencias'. En Goals se planea implementar otras tácticas, como comprobar la existencia de URL, comparar el tiempo de modificación con cualquier archivo, evaluar la construcción del paquete en Koji, comparar sumas de verificación, ejecutar conjuntos de pruebas con omisiones selectivas de pruebas.
  • Al procesar los objetivos de ensamblaje, la herramienta make no distingue entre archivos y nombres de reglas, y, como consecuencia, no verifica que al ejecutar una regla realmente se creará el archivo que se declara. Por ejemplo, si existe una regla llamada 'test' que ejecuta scripts de pruebas, y accidentalmente se crea un archivo llamado 'test', las pruebas dejarán de ejecutarse porque make considerará que el objetivo ha sido alcanzado y no requiere más acciones (para eludir este problema en make se puede usar la directiva '.PHONY: test'). Goals separa claramente los archivos de los nombres de reglas.

    Un empleado de Red Hat presentó el sistema de compilación Goals. Lanzamiento de GNU Make 4.2
  • El problema de proporcionar solo un parámetro para las instrucciones de ensamblaje.

    Un empleado de Red Hat presentó el sistema de compilación Goals. Lanzamiento de GNU Make 4.2

    En Goals se propone utilizar un número arbitrario de parámetros nombrados. Por ejemplo, se puede extraer por separado del nombre el indicador de archivo de depuración:

    Un empleado de Red Hat presentó el sistema de compilación Goals. Lanzamiento de GNU Make 4.2
  • Problemas de interacción con el intérprete de shell. Por ejemplo, la necesidad de controlar la escapada de espacios en los nombres de archivos y directorios, el gasto de recursos al iniciar un intérprete de shell separado para ejecutar cada comando, la doble interpretación del símbolo '$' (usado tanto en shell como en make), tener en cuenta los espacios.

    Los problemas mencionados se abordan en Goals utilizando el símbolo '%' en lugar de '$' para las variables de ensamblaje ('$' se reserva solo para shell), aplicando un analizador LALR(1), que requiere enmarcar rutas y nombres de archivo entre comillas y resaltar bloques de código con llaves. Todo el bloque de comando se ejecuta en una instancia de la consola de comandos, y dentro del bloque se permite cualquier formato de código, sin estar atado a espacios especiales.

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

    Después:
    «target»: «foo.o», «bar.o» {
    LAGS $< -o $@
    }

Otras características de Goals:

  • Soporte opcional para asignar nombres y parámetros arbitrarios:

    goal all = : «target»

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

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

  • Dos modos de ejecución: modo make para emparejar objetivos de construcción con nombres de archivo (por ejemplo, el archivo «foo.o» corresponde al objetivo «%name.o»), y modo de ejecución directa de la compilación:

    goal all = : link

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

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

  • La táctica de construcción se determina mediante reglas especiales, las cuales definen la necesidad de reconstruir un objetivo de construcción. Si se vincula a la existencia de un archivo, esto se determina explícitamente a través del indicador correspondiente («target» para el nombre de la regla y *file(«target») para verificar el archivo).

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

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

  • El desarrollador puede definir indicadores arbitrarios de tácticas de construcción. El indicador «*file» está definido por defecto (@{…} indica suprimir la salida, y «exit 99» señala la necesidad de reconstruir):

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

    Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster