La función de archivo en el archivo MAKE toma argumentos con el prefijo '@'

10

Este extracto del código es del Capítulo 8.6 del manual del archivo MAKU de GNU.

¿Qué significa @ $ @. In para la función de archivo arg en un archivo MAKE? y por qué los comandos de shell como rm tienen el prefijo '@'

program: $(OBJECTS)
     $(file >[email protected],$^)
     $(CMD) $(CMDFLAGS) @[email protected]
     @rm [email protected]

La sintaxis de la función de archivo es

$(file op filename[,text])

fuente

Respuestas:

9

Hay tres usos no relacionados de @aquí.

En $@, el carácter @es el nombre de una variable automática que se puede usar en una regla. El valor de esa variable es el objetivo que está construyendo la regla.

Cuando @se usa al comienzo de una línea de receta (comando), justo después del carácter de tabulación, hace que el comando no se imprima cuando está a punto de ejecutarse.

El personaje en @otro lugar no es especial.

Por lo tanto, en su ejemplo, para construir program:

  1. La filefunción se invoca. Escribe las dependencias del destino ( $^variable automática) en el archivo program.in.
  2. Cualquier comando almacenado en la variable CMDse ejecuta, con los parámetros almacenados en la variable CMDFLAGS, más el parámetro adicional @program.in. Lo que esto hace depende de lo que CMDsea.

  3. El comando rm program.inse ejecuta, sin imprimirlo primero.

Algunos comandos tratan un parámetro que comienza con la @indicación de un archivo desde el cual leer más parámetros. Esta es una convención de DOS que surgió porque DOS tenía un límite estricto en la longitud de la línea de comando y no había forma de interpolar la salida de un comando en una línea de comando. Es poco común en el mundo de Unix ya que Unix no tiene estas limitaciones. Por lo tanto, el efecto de la receta es probablemente el mismo que

$(CMD) $(CMDFLAGS) $(OBJECTS)
Gilles 'SO- deja de ser malvado'
fuente
2

El prefijo @ en línea suprime el eco de la línea.

Por defecto, makeimprime cada línea Makefileantes de que se ejecute. Cuando las líneas comienzan con @, esas líneas no se imprimirán.

Sin @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

Con @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Una nota que solo @al comienzo de la línea causa supresión de ecos . >[email protected]o @[email protected]son solo cadenas normales, y $@en él se expandirán:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
Cuonglm
fuente
esta respuesta no dice, por qué >[email protected]se usa como modo de archivo ... pero es útil a su manera ... gracias cuonglm ...