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

Richard WM Jones, autor libguestfs, trabajando en Red Hat, presentado nueva utilidad de montaje Goals, destinado a eliminar deficiencias y problemas en la utilidad de make manteniendo al mismo tiempo la simplicidad general y la comprensibilidad de los scripts. La utilidad make fue diseñada en 1976 y tiene una serie de deficiencias conceptuales; Goals planea eliminar estas deficiencias sin cambiar el concepto general.
Código fuente de objetivos distribuido por Licenciado bajo GPLv2+.

Problemas resueltos:

  • Soporte para una sola táctica de resolución de dependencias: "la instrucción ensambladora se ejecuta si falta el archivo de destino o es anterior a una de las dependencias". Goals planea implementar otras tácticas, como verificar la presencia de una URL, comparar los tiempos de modificación con cualquier archivo, evaluar la compilación del paquete Koji, comparación de sumas de verificación, ejecución de casos de prueba con omisión selectiva de pruebas.
  • Al procesar objetivos de compilación, make no separa los archivos y los nombres de las reglas y, como resultado, no se verifica que, al ejecutar una regla, el archivo que dice haber sido creado realmente se cree. Por ejemplo, si tiene una regla llamada "prueba" que ejecuta scripts con pruebas, se crea accidentalmente un archivo llamado "prueba", entonces las pruebas ya no se llamarán, ya que make considerará que el objetivo está compilado y no requiere cualquier acción (para solucionar el problema en make, puede especificar la directiva “.PHONY: test”). Goals separa explícitamente archivos y nombres de reglas.

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

  • Problema al proporcionar solo un parámetro para las instrucciones de ensamblaje.

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

    Goals le permite utilizar una cantidad arbitraria de parámetros con nombre. Por ejemplo, puede extraer por separado el signo de un archivo de depuración del nombre:

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

  • Problemas al interactuar con el intérprete de shell. Por ejemplo, la necesidad de controlar el escape de espacios en los nombres de archivos y directorios, el desperdicio de recursos al iniciar un intérprete de shell separado al ejecutar cada comando, la doble interpretación del carácter "$" (usado tanto en shell como en make), teniendo en cuenta las sangrías.

    Estos problemas se resuelven en Goals usando el símbolo “%” en lugar de “$” para las variables de ensamblaje (“$” permanece solo para el shell), usando un analizador LALR (1), que requiere que rodee las rutas y los nombres de los archivos entre comillas y resalte los bloques de código con llaves. Todo el bloque de comandos se inicia en una instancia del shell de comandos y, dentro del bloque, se permite el formato de código arbitrario, sin referencia a espacios especiales.

    Fue
    objetivo: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Se convirtió en:
    "destino": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Otras características de Metas:

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

    objetivo todo = : "objetivo"

    enlace objetivo =
    "objetivo": "foo.o", "bar.o" {...}

    compilación de objetivos (nombre) =
    "%nombre.o" : "%nombre.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Dos modos de inicio: modo de creación para hacer coincidir los objetivos de compilación con los nombres de archivos (por ejemplo, el archivo "foo.o" coincide con el objetivo "%name.o") y el modo de compilación directa:

    objetivo todo =: enlace

    enlace objetivo =
    "objetivo": "foo.o", compilar ("barra") {...}

    compilación de objetivos (nombre) =
    "%nombre.o" : "%nombre.c", "dep.h" { %CC %CFLAGS -c $^ -o $@ }

  • Las tácticas de montaje están determinadas por reglas especiales que se pueden utilizar para determinar la necesidad de volver a montar un objetivo de montaje. Si se establece un enlace a la presencia de un archivo, esto se determina explícitamente mediante el signo correspondiente (“destino” para el nombre de la regla y *archivo (“destino”) para verificar el archivo).

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

    *archivo("destino") : *archivo("foo.o"), *archivo("bar.o") { ... }

  • El desarrollador puede definir atributos arbitrarios de tácticas de montaje. El indicador "*file" está definido de forma predeterminada (@{...} indica la supresión de la salida y "exit 99" indica la necesidad de reconstruir):

    táctica *archivo (nombre de archivo) = @{
    prueba -f %nombre de archivo || salida 99
    para f en %

    Fuente: opennet.ru

Añadir un comentario