Je veux écrire un Makefile qui exécuterait des tests. Les tests sont dans un répertoire './tests' et les fichiers exécutables à tester sont dans le répertoire './bin'.
Lorsque j'exécute les tests, ils ne voient pas les fichiers exécutables, car le répertoire ./bin n'est pas dans le $ PATH.
Quand je fais quelque chose comme ça:
EXPORT PATH=bin:$PATH
make test
tout fonctionne. Cependant, je dois changer le $ PATH dans le Makefile.
Contenu Makefile simple:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Il imprime correctement le chemin, mais ne trouve pas le fichier x.
Lorsque je fais cela manuellement:
$ export PATH=bin:$PATH
$ x
tout va bien alors.
Comment pourrais-je changer le $ PATH dans le Makefile?
../test/test_to_run
? Désolé si j'ai mal compris la question..
. Ceci n'est probablement pas pratique cependant.Réponses:
Avez-vous essayé la
export
directive de Make lui-même (en supposant que vous utilisez GNU Make)?En outre, il y a un bogue dans votre exemple:
Premièrement, la valeur en cours d'
echo
édition est une expansion dePATH
variable effectuée par Make, pas par le shell. S'il imprime la valeur attendue, je suppose que vous avez défini laPATH
variable quelque part plus tôt dans votre Makefile, ou dans un shell qui a appelé Make. Pour éviter un tel comportement, vous devez échapper aux dollars:Deuxièmement, dans tous les cas, cela ne fonctionnera pas car Make exécute chaque ligne de la recette dans un shell séparé . Cela peut être changé en écrivant la recette sur une seule ligne:
la source
$(PATH)
obtiendra la valeur dePATH
du shell invoquant make. Selon le manuel , "Chaque variable d'environnement qui fait voit quand il démarre est transformée en une variable make avec le même nom et la même valeur."PATH
est correctement reflétée dans les variables (echo $(PATH)
) et dans les environnements de commandes (env
,which python
,bash -c python
), mais ne semble pas être utilisé lors de la localisation de l'exécutable pour la commande: la commandepython
gere encore Exécutable Python sur l'originalPATH
.Par conception, l'
make
analyseur exécute les lignes dans des invocations de shell séparées, c'est pourquoi en changeant la variable (par exemplePATH
) sur une ligne, le changement peut ne pas être appliqué pour les lignes suivantes (voir cet article ).Une façon de contourner ce problème est de convertir plusieurs commandes en une seule ligne (séparées par
;
), ou d'utiliser une cible spéciale One Shell (.ONESHELL
, à partir de GNU Make 3.82).Vous pouvez également fournir une
PATH
variable au moment où le shell est appelé. Par exemple:la source
$(shell)
invocations! : D Exemple: pastebin.com/Pii8pmkDLes changements de chemin semblent persistants si vous définissez d'abord la variable SHELL dans votre makefile:
Je ne sais pas si c'est un comportement souhaité ou non.
la source
which
etenv
maintenant prenez le nouveau PATH, mais l'exécution directe d'un binaire n'est toujours pas trouvée dans le PATH modifié, seulement dans l'original.Ce que je fais généralement est de fournir explicitement le chemin d'accès à l'exécutable:
J'utilise également cette technique pour exécuter des binaires non natifs sous un émulateur comme QEMU si je suis en compilation croisée:
Si make utilise le shell sh, cela devrait fonctionner:
la source
Pour définir la
PATH
variable, dans le Makefile uniquement, utilisez quelque chose comme:la source