Vous ne pouvez tout simplement pas faire cela. Il n'y a aucun moyen¹ le processus de création peut changer l'environnement de son parent (ou son répertoire actuel, auquel vous pourriez penser ensuite).
En fait, encore moins se passe que vous ne le pensez.
- Toutes les
make
implémentations ne reflètent pas l'affectation à la PATH
variable make dans l'environnement; GNU make (présent sur Linux et d'autres systèmes) le fait, mais BSD make ne le fait pas.
- Chaque ligne de commande sous une cible s'exécute dans un sous-shell distinct. (Sauf dans certains BSD plus anciens, les implémentations sont faites.)
export PATH
ligne s'exécute donc sur un shell qui se termine immédiatement après. Non pas que cette ligne ferait quoi que ce soit en premier lieu - si elle PATH
est définie à ce stade, c'est parce qu'elle est déjà dans l'environnement du shell.
Make est pour construire des choses automatiquement. Si vous souhaitez définir des variables pour votre environnement interactif, ce n'est pas l'outil que vous devriez regarder. Au lieu de cela, écrivez un extrait de shell et sourcez- le dans le shell actuel:
. ./define-my-variables.sh
Dans votre makefile, sourcez le script dans chaque sous-shell . Vous pouvez utiliser une barre oblique inverse pour exécuter une commande longue; rappelez-vous que
- La séquence backslash-newline est supprimée par make, donc le shell ne verra pas de nouvelle ligne là-bas.
- N'oubliez pas de préfixer chaque ligne par un onglet.
- Le comportement d'erreur de Make consiste à abandonner si une commande échoue. Le shell ne fera pas cela par défaut, et l'échec de toute commande, mais la dernière passera inaperçue par défaut, vous devez donc exécuter
set -e
.
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ Remarque obligatoire: aucun sens. Même invoquer à distance chdir
via ptrace
un débogueur ne fonctionnera pas comme avec la plupart des shells car ils n'aiment pas que leur répertoire actuel soit changé sous leurs pieds.
Gilles 'SO- arrête d'être méchant'
la source
Tu ne peux pas. Il n'est pas possible pour un sous-processus (comme
make
) de modifier l'environnement de son processus parent.Vous pourriez faire quelque chose comme
Où la
pathupdate
cible ressemble:la source
Votre réponse se trouve ici: https://stackoverflow.com/a/8942216/367461
Fondamentalement, vous devez faire ceci:
J'ai testé cela sur Fedora 23 avec GNU Make 4.0, et cela fonctionne bien pour moi.
la source
.SHELL: name=sh path=/path/to/wrapper-script
puis créer un script wrapper commeexport FOO=bar; exec bash "$@"
Je suis sur le point de poser cette même question parce que je n'ai pas pu faire fonctionner l'autre exemple de réponse.
Cependant, j'ai réussi à obtenir la solution de travail pour moi en utilisant la
eval
commande. Je ne sais pas trop pourquoi cela n'a pas été publié plus tôt.la source
export PATH=…
endo_something:
ligne, vous n'avez pas besoineval
.Vous pouvez faire en sorte que Make s'appelle récursivement avec un environnement modifié, en tant que tel:
Si vous souhaitez utiliser un extrait de shell:
la source