code

ENV 변수 또는 기본값을 사용하여 Makefile 변수 정의

starcafe 2023. 4. 23. 10:59
반응형

ENV 변수 또는 기본값을 사용하여 Makefile 변수 정의

저는 간단한 일을 하려고 합니다.

TMPDIR ?= /tmp

test:
    @echo $(TMPDIR)

실행 시 동작합니다.

$ make test
/tmp

다음을 실행해도 동작합니다.

$ make test -e TMPDIR=~/tmp
/home/user/tmp

다음 작업에도 사용할 수 있도록 하려면 어떻게 해야 합니까?

$ TMPDIR=~/tmp make test
/home/user/tmp

위의 코멘트를 팔로업하기 위해 예를 제시하겠습니다.

T ?= foo
all:
        : '$(T)'

Make file을 다양한 방법으로 실행하면 예상대로 동작합니다.foo내가 설정하지 않는 한해서T명령줄 또는 환경 중 하나)에서 다음을 수행합니다.

$ make
: 'foo'

$ make T=bar
: 'bar'

$ T=bar make
: 'bar'

명령줄에 지정된 변수는 makefile에 할당된 값을 덮어씁니다.

TMPDIR := "/tmp"
test:
    @echo $(TMPDIR)

그 후:

make TMPDIR=whatever
whatever

일반적으로 makefile은 환경변수에 의존하면 재현 불가능한 빌드로 이어질 수 있기 때문에 잘못된 관행으로 간주됩니다.이것이 전달 변수가 오버라이드되는 이유입니다.make명령줄을 명시적으로 사용하는 것이 좋습니다.

간단한 해결책은 다음과 같습니다.

SHELL  := env TMPDIR=$(TMPDIR) $(SHELL)
TMPDIR ?= "/tmp"

all:
  @echo $(TMPDIR)

두 시나리오 모두에서 동작합니다.TMPDIR=new/path make그리고.make TMPDIR=new/path.

할 수 있는 일 중 하나는 다음과 같습니다.

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)

언급URL : https://stackoverflow.com/questions/24263291/define-a-makefile-variable-using-a-env-variable-or-a-default-value

반응형