programing

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

projobs 2021. 1. 14. 07: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)'

이제 Makefile을 다양한 방법으로 실행하면 예상대로 작동 합니다 (명령 줄이나 환경에서 foo설정하지 않은 경우에만 나타납니다 T).

$ make
: 'foo'

$ make T=bar
: 'bar'

$ T=bar make
: 'bar'

make 명령 줄에 지정된 변수는 makefile에 지정된 값을 재정의합니다 .

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

그리고:

make TMPDIR=whatever
whatever

일반적으로 makefile이 환경 변수에 의존하는 것은 좋지 않습니다. 이것이 make 명령 줄에서 변수를 전달하는 것이 선호되는 이유입니다.


또 다른 방법은 make or함수 를 사용하는 것입니다.

X := $(or ${X},${X},abc)

all :
    @echo ${X}

make
abc

X=def make 
def

사실, ?=할당 을 사용하는 것만을 고수해야 합니다.


다음은 간단한 해결책입니다.

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

all:
  @echo $(TMPDIR)

which works for both scenarios: TMPDIR=new/path make and make TMPDIR=new/path.


One of the thing you could do is:

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)

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

반응형