La fonction de fichier dans le makefile prend les arguments préfixés par le symbole '@'

10

Cet extrait de code provient du chapitre 8.6 du manuel de makefile GNU.

Que signifie @ $ @. In pour la fonction de fichier arg dans un makefile? et pourquoi les commandes shell comme rm sont-elles préfixées par le symbole '@'

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

La syntaxe de la fonction de fichier est

$(file op filename[,text])

la source

Réponses:

9

Il y a trois utilisations indépendantes d' @ici.

Dans $@, le caractère @est le nom d'une variable automatique qui peut être utilisée dans une règle. La valeur de cette variable est la cible que la règle construit.

Lorsque @est utilisé au tout début d'une ligne de recette (commande), juste après le caractère de tabulation, il empêche l' impression de la commande lorsqu'elle est sur le point d'être exécutée.

Le personnage @ailleurs n'est pas spécial.

Ainsi, dans votre exemple, pour construire program:

  1. La filefonction est invoquée. Il écrit les dépendances de la cible ( $^variable automatique) dans le fichier program.in.
  2. Quelle que soit la commande stockée dans la variable CMDest exécutée, avec les paramètres stockés dans la variable CMDFLAGS, plus le paramètre supplémentaire @program.in. Ce que cela fait dépend de ce qui CMDest.

  3. La commande rm program.inest exécutée, sans l'imprimer au préalable.

Quelques commandes traitent un paramètre commençant par @comme indiquant un fichier à partir duquel lire plus de paramètres. Il s'agit d'une convention DOS qui a vu le jour car DOS avait une limite stricte sur la longueur de la ligne de commande et aucun moyen d'interpoler la sortie d'une commande dans une ligne de commande. Il est rare dans le monde Unix car Unix n'a pas ces limitations. L'effet de la recette est donc probablement le même que

$(CMD) $(CMDFLAGS) $(OBJECTS)
Gilles 'SO- arrête d'être méchant'
la source
2

@ le préfixe en ligne supprime l' écho de la ligne.

Par défaut, makeimprime chaque ligne de Makefileavant son exécution. Lorsque les lignes commencent par @, ces lignes ne seront pas imprimées.

Sans @:

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

Avec @:

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

A noter que seulement @au début de la ligne provoque la suppression de l' écho . >[email protected]ou ne @[email protected]sont que des chaînes normales, et $@y seront étendues:

$ cat hello
hello:
    @echo @[email protected]
$make hello
@hello.in
cuonglm
la source
cette réponse ne dit pas, pourquoi >[email protected]est utilisé comme mode de fichier ... mais il est utile à sa manière .. merci cuonglm ...