Je voudrais changer ce Makefile:
SHELL := /bin/bash
PATH := node_modules/.bin:$(PATH)
boot:
@supervisor \
--harmony \
--watch etc,lib \
--extensions js,json \
--no-restart-on error \
lib
test:
NODE_ENV=test mocha \
--harmony \
--reporter spec \
test
clean:
@rm -rf node_modules
.PHONY: test clean
à:
SHELL := /bin/bash
PATH := node_modules/.bin:$(PATH)
boot:
@supervisor \
--harmony \
--watch etc,lib \
--extensions js,json \
--no-restart-on error \
lib
test: NODE_ENV=test
test:
mocha \
--harmony \
--reporter spec \
test
clean:
@rm -rf node_modules
.PHONY: test clean
Malheureusement, le second ne fonctionne pas (le processus de nœud s'exécute toujours avec la valeur par défaut NODE_ENV
.
Qu'est-ce que j'ai raté?
shell
makefile
environment-variables
target
bodokaiser
la source
la source
Unfortunately
commentaire découle d'un malentendu entre une variable d'environnement et uneMakefile
variable. La meilleure façon de prouver qu'une variable d'environnement a été définie est d'interroger cette variable d'environnement dans un autre programme qui l'make
appellera. Ilecho $(BLAH)
suffit d'évaluer le mécanisme clé / valeur de Makefile dans le Makefile. En python, vous pouvezprint(os.getenv("MURDOC"))
vraiment interroger la variable d'environnement.Réponses:
Les variables Make ne sont pas exportées dans l'environnement des processus make invokes ... par défaut. Cependant, vous pouvez utiliser des make
export
pour les forcer à le faire. Changement:pour ça:
(en supposant que vous ayez une version suffisamment moderne de GNU make> = 3.77).
la source
all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>
affiche l'extension correcte pour la première ligne, mais uniquementecho
pour la seconde.PROJ_ROOT
n'est pas défini après l'exécution de make. Les espaces autour=
donnent un "mauvais nom de variable" pour l'exportation. Avoir la première ligne comme prérequis comme dans votre exemple donne "les commandes commencent avant la première cible"all:
, ce qui n'est pas dans mon exemple. Mon exemple est destiné à être utilisé tel qu'il est écrit: il définit une variable spécifique à la cible, PAS l' ajout d'une commande à la recette. De plus, vous ne pouvez pas utiliser une recette et une variable spécifique à une cible en même temps: vous devez écrire la cible deux fois. Consultez le deuxième exemple de la question et posez une nouvelle question si cela ne permet pas de l'expliquer: il n'y a pas assez d'espace ou de mise en forme dans les commentaires.Comme l'a souligné MadScientist , vous pouvez exporter des variables individuelles avec:
Ou exporter des variables pour une cible spécifique ( variables spécifiques à la cible ):
Vous pouvez également spécifier la
.EXPORT_ALL_VARIABLES
cible à - vous l'avez deviné! - EXPORTER TOUTES LES CHOSES !!!:voir .EXPORT_ALL_VARIABLES
la source
MY_VAR
s: l'un est la variable makefile accessible en tant que${MY_VAR}
et l'autre est la variable exportée bash, accessible en tant que$$MY_VAR
Je n'avais besoin que des variables d'environnement localement pour appeler ma commande de test, voici un exemple de définition de plusieurs variables d'environnement dans un shell bash et d'échappatoire au signe dollar
make
.la source
Je réécrirais le test cible d'origine, en veillant à ce que la variable nécessaire soit définie DANS LE MÊME SOUS-PROCESSUS que l'application à lancer:
la source