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

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

Que signifie @ $ @. In pour la fonction de file arg dans un makefile? et pourquoi les commands 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 file est

 $(file op filename[,text]) 

Il y a trois utilisations non liées de @ ici.

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

Lorsque @ est utilisé au tout début d'une ligne de recette (command), juste après le caractère de tabulation, la command ne doit pas être imprimée lorsqu'elle est sur le point d'être exécutée.

Le caractère @ ailleurs n'est pas spécial.

Ainsi, dans votre exemple, pour build le program :

  1. La fonction de file est invoquée. Il écrit les dependencies de la cible ( $^ variable automatique) dans le file program.in .
  2. Quelle que soit la command stockée dans la variable CMD est exécutée, avec les parameters stockés dans la variable CMDFLAGS , plus le paramètre supplémentaire @program.in . Ce que cela fait dépend de ce que CMD est.

  3. La command rm program.in est exécutée, sans l'imprimer en premier.

Quelques commands traitent un paramètre commençant par @ comme indiquant un file à partir duquel lire plus de parameters. C'est une convention DOS qui est née parce que DOS avait une limite ssortingcte sur la longueur de command line et aucun moyen d'interpoler la sortie d'une command dans une command line. Il est rare dans le monde Unix depuis Unix n'a pas ces limitations. L'effet de la recette est donc probablement le même que

 $(CMD) $(CMDFLAGS) $(OBJECTS) 

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

Par défaut, make imprime chaque ligne de Makefile avant de l'exécuter. 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 

Une note que seul @ au démarrage de la ligne provoque la suppression de l' écho . >[email protected] ou @[email protected] sont que des strings normales, et $@ en elle sera étendue:

 $ cat hello hello: @echo @[email protected] $make hello @hello.in