GNU Make는 이미 존재하는 경우에만 매크로를 환경 변수로 내보냅니다.

GNU Make는 이미 존재하는 경우에만 매크로를 환경 변수로 내보냅니다.

다음을 고려하세요 Makefile:

X = macro-X-value
foo:
        echo $$X $(X)

여기서 목적은 X환경 변수와 매크로의 이름 역할을 하는 것입니다. 다음을 사용할 때 bmake예상대로 작동합니다 .

$ env X=env-X-value /usr/bin/bmake
  echo $X macro-X-value
  env-X-value macro-X-value

$ env -i /usr/bin/bmake
  echo $X macro-X-value
  macro-X-value

그러나 GNU Make(v.4.2.1)를 사용하면 동작이 매우 이상해집니다.

$ env X=env-X-value /usr/bin/gmake
  echo $X macro-X-value
  macro-X-value macro-X-value

$ env -i /usr/bin/gmake
  echo $X macro-X-value
  macro-X-value

gmake그래서 수출가치가 있는거 같네요매크로 X~처럼 환경 변수 X, 하지만오직외부 환경일 때이미 출구 X.

이에 대한 정보를 찾을 수 없습니다.POSIX 설명. 사실 또 다른 요점이 있습니다.

매크로는 실행 중인 명령 환경으로 내보내지지 않습니다. […]

이 동작이 문서화되어 있나요? 이것은 버그입니까? 비활성화할 수 있나요?

답변1

내가 매뉴얼에서 읽은 바에 따르면, GNU make는 변수를 쉘처럼 취급합니다. 시작되면 환경의 변수를 내부 세트로 가져오고, 명령을 실행할 때 내보내기용으로 표시된 변수를 환경으로 내보냅니다. 이는 모든 변수가 포함된 테이블이 하나만 있고 동일한 이름의 환경 변수와 비환경 변수를 가질 수 없음을 의미합니다.

6.10 환경의 변수:

make의 변수는 make가 실행되는 환경에서 가져올 수 있습니다. make가 시작될 때 표시되는 모든 환경 변수는 동일한 이름과 값을 가진 make 변수로 변환됩니다.

그리고5.7.2 하위 브랜드에 변수 전달:

명시적으로 요청하지 않는 한 make는 원래 환경에 정의되었거나 명령줄에 설정된 경우에만 변수를 내보냅니다. [...] 특정 변수를 하위 make로 내보내려면 다음과 같이 내보내기 지시문을 사용합니다.

export variable …

변수를 내보내지 않으려면 다음과 같이 unexport 지시어를 사용하세요.

unexport variable …

제가 테스트한 바에 따르면 unexport X프로세스가 시작된 환경에서 내부 변수를 완전히 제거하는 것만으로는 내부 변수와 다른 값을 유지할 수 있는 방법이 없는 것 같습니다.


사용.POSIX내장된 목표하지만 이 동작은 바뀌지 않는 것 같습니다.의견인 것 같습니다.어떤 경우에도 POSIX 동작에 대해 너무 엄격한 Make는 없습니다.

관련 정보