web-dev-qa-db-ja.com

Makefileで子プロセスの環境変数を設定する方法

この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

残念ながら、2番目のものは動作しません(ノードプロセスはまだデフォルトのNODE_ENVで実行されます。

私は何を取りこぼしたか?

97
bodokaiser

Make変数は、デフォルトでmake make ...が呼び出すプロセスの環境にエクスポートされません。しかし、makeのexportを使ってそれらを強制することができます。変化する:

test: NODE_ENV = test

これに:

test: export NODE_ENV = test

(GNU makeの十分に新しいバージョンがあると仮定して)。

127
MadScientist

MadScientistが指摘したように として、あなたは個々の変数を次のようにエクスポートすることができます。

export MY_VAR = foo  # Available for all targets

特定のターゲットの変数をエクスポートする( ターゲット固有の変数 ):

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

.EXPORT_ALL_VARIABLESターゲットを、あなたがそれを推測したものに指定することもできます。

.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

。EXPORT_ALL_VARIABLES を参照してください。

37
Shammel Lee

テストコマンドを実行するためにローカル変数だけが必要でした。これはbashシェルで複数の環境変数を設定し、ドル記号をmakeでエスケープする例です。

Shell := /bin/bash

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