2013-07-18 2 views
0

Je suis en train de le faire dans mon Makefile:Makefile: Comment rendre une valeur de macro calculée dans une cible disponible pour une autre cible?

VAL= 

TARGET1: 
    VAL= ... #compute value of VAL 
    #run some command that uses the value of VAL 
TARGET2: 
    $(MAKE) TARGET1 
    #run other command that uses the value of VAL 

Mais il se trouve que la valeur de VAL est remis à zéro lorsque TARGET! se termine dans TARGET2. Ainsi, la valeur calculée de VAL n'est pas disponible lorsque j'essaie d'exécuter l'autre commande dans TARGET2. Est-il possible de conserver la valeur calculée dans TARGET1? Merci.

Répondre

0

Vous avez une idée fausse fondamentale. La variable VAL définie dans la recette TARGET1 n'est pas du tout une variable make: c'est une variable shell. Vous pouvez le dire parce que si vous modifiez la syntaxe de l'affectation à quelque chose d'autre qui est encore une affectation de variable make valide mais n'est pas une affectation variable shell valide, comme:

TARGET1: 
     VAL := foo 

il vous donnera une erreur de syntaxe. Fondamentalement dans make, n'importe quelle ligne de recette (les lignes après une cible commençant par un caractère TAB) n'est pas interprétée par make: elles sont passées à un shell qui invoque. Rien de ce qui se passe dans ce shell ne peut avoir d'effet sur la valeur de make, etc.

Vous ne nous donnez pas beaucoup de détails. Vous ne dites pas si la commande utilise la variable de l'environnement ou via la ligne de commande. Vous ne dites pas quelle version de make vous utilisez. Si c'est GNU make, vous avez un certain nombre d'options. Le plus simple est de toujours définir la valeur; si elle nécessite une syntaxe shell, vous pouvez utiliser la fonction shell:

VAL := $(shell #compute value of VAL) 

TARGET1: 
     #run some command that uses $(VAL) 
TARGET2: 
     #run another command that uses $(vAL) 

Avant de vous donner plus de possibilités que nous devons comprendre les exigences: si vous devez avoir la valeur définie dans TARGET1 nous devons savoir pourquoi, avant peut offrir des solutions possibles.

Questions connexes