web-dev-qa-db-fra.com

Comment définir la variable d'environnement du processus enfant dans Makefile

J'aimerais 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 noeud fonctionne toujours avec la valeur par défaut NODE_ENV.

Qu'est-ce que j'ai raté?

104
bodokaiser

Les variables Make ne sont pas exportées dans l'environnement de processus make invokes ... par défaut. Cependant, vous pouvez utiliser make export pour les forcer à le faire. Changement:

test: NODE_ENV = test

pour ça:

test: export NODE_ENV = test

(en supposant que vous avez une version suffisamment moderne de GNU make).

130
MadScientist

Comme MadScientist a souligné , vous pouvez exporter des variables individuelles avec:

export MY_VAR = foo  # Available for all targets

Ou exportez des variables pour une cible spécifique ( variables spécifiques à une cible ):

my-target: export MY_VAR_1 = foo
my-target: export MY_VAR_2 = bar
my-target: export MY_VAR_3 = baz

my-target: dependency_1 dependency_2
  echo do something

Vous pouvez également spécifier la cible .EXPORT_ALL_VARIABLES pour — vous l'avez deviné! —EXPORTER TOUTES LES CHOSES !!!:

.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3

voir . EXPORT_ALL_VARIABLES

45
Shammel Lee

Je n'avais besoin que des variables d'environnement localement pour appeler ma commande de test. Voici un exemple montrant la configuration de plusieurs vars d'environnement dans un shell bash et échappant au signe dollar dans make.

Shell := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/
13
ThorSummoner