Makefile에서 자식 프로세스의 환경 변수를 설정하는 방법


135

이 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

불행히도 두 번째는 작동하지 않습니다 (노드 프로세스는 여전히 기본값으로 실행됩니다) NODE_ENV.

내가 놓친 게 무엇입니까?

답변:


153

Make 변수는 기본적으로 프로세스 호출 환경으로 내 보내지 않습니다. 그러나 make를 사용 export하여 강제로 그렇게 할 수 있습니다. 변화:

test: NODE_ENV = test

이에:

test: export NODE_ENV = test

(당신은 충분히 현대적인 GNU make> = 3.77 버전을 가지고 있다고 가정합니다).


3
GNU make 3.81 all: <\n\t>export PROJ_ROOT=$(CURDIR)<\n\t>echo $(PROJ_ROOT)<\n>을 사용하고 첫 번째 행에 대한 올바른 확장을 출력하지만 echo두 번째 행에 대해서만 올바른 확장을 출력합니다 . PROJ_ROOTmake를 실행 한 후 설정되지 않았습니다. 공백 =은 내보내기에 "잘못된 변수 이름"을 제공합니다. 예제에서와 같이 첫 번째 행을 전제 조건으로 지정하면 "명령이 첫 번째 대상보다 먼저 시작됩니다"
Gauthier

8
물론 @Gauthier. 내가 쓴 것이 아닙니다. 에 <\ n \ t>를 추가했는데 all:,이 예는 아닙니다. 내 예제는 작성된대로 사용하기위한 것입니다 : 그것은 명령에 레시피를 추가 하지 않고 대상 특정 변수를 정의하고 있습니다. 또한 대상에서 레시피와 대상 특정 변수를 동시에 사용할 수 없습니다. 대상을 두 번 작성해야합니다. 질문의 두 번째 예를 참조하여 설명이 도움이되지 않는 경우 새 질문을하십시오. 주석에 공간이나 서식이 충분하지 않습니다.
MadScientist

1
여러 변수는 어떻습니까?
holms

1
괜찮아요.하지만 당신은 그것을 목표의 머리에 추가했습니다. 대상과 관련하여 목록을 표시해도 작동하지 않습니까? 그것은 나를 위해 작동하지 않기 때문에
holms

2
대상별 변수는 GNU make 3.77에 추가되었습니다. GNU make 3.81부터 내보낼 수 있습니다. git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

79

매드 사이언티스트는 지적 , 당신은 개별 변수를 내보낼 수 있습니다 :

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 참조


2
이상하게도 나는 (지금은 확실하지 왜 ..) 그 이전에이 일을 보여 테스트를 ... 한 난 다시 가서 내가 추측 코멘트를 삭제할 수 있습니다 ..
AnthonyC

3
@AnthonyC 두 개의 MY_VARs 가 있기 때문에 작동합니다 . 하나는 makefile 변수로 액세스 ${MY_VAR}하고 다른 하나는 bash exportd 변수입니다.$$MY_VAR
Sergei

유능한. 그러나 변수 세트 만 내보내는 방법을 찾을 수 없습니다.
Eric Chen

15

테스트 명령을 호출하기 위해 로컬 환경 변수 만 필요했습니다. 여기 bash 쉘에서 여러 환경 변수를 설정하고 달러 기호를 이스케이프 처리하는 예제가 make있습니다.

SHELL := /bin/bash

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

6
설명을 포함하도록 답변을 수정하십시오. 코드 전용 답변은 향후 SO 독자를 교육하는 데 거의 도움이되지 않습니다. 귀하의 답변은 품질이 낮다는 평가 대기열에 있습니다.
mickmackusa

ThorSummoner,이 솔루션은 위의 접근 방식만큼 유연하지 않습니다. 예를 들어, 명령 호출에 대한 하나의 규칙과 환경 변수를 설정하여 해당 동작을 수정하는 몇 가지 규칙을 원할 수 있습니다. 고려 : test : cmd perf : export PERF = "yes"perf : test 'cmd'가 복잡하면 (그리고 일반적으로)이 방법은 유지 관리가 훨씬 쉽습니다. cmd 규칙에서 환경 변수를 설정하는 방법은이를 어렵게 만듭니다.
Keith Hanlan

1

필요한 대상 변수가 동일한 응용 프로그램으로 시작 응용 프로그램으로 정의되어 있는지 확인하면서 원래 대상 테스트를 다시 작성합니다.

test:
    ( NODE_ENV=test mocha --harmony --reporter spec test )
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.