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.