Makefile에서 빈 변수 이름 오류를 방지하는 방법

Makefile에서 빈 변수 이름 오류를 방지하는 방법

이 makefile의 실행 명령과 함께 버전을 언급할 때마다 해당 버전은 VERSION 변수에 저장되어야 하며, 버전이 언급되지 않으면 기본값을 사용해야 합니다.

이것은 내 Makefile입니다.

export $(BUILDVERSION) = $2
VERS = VABCDE.00.00A002

$(info    BUILDVERSION is "$(BUILDVERSION)")
$(info    vers is "$(VERS)")
ifneq ($(BUILDVERSION),undefined)
        VERSION := $(VERS)
endif

ifneq ($(BUILDVERSION),undefined)
        VERSION := $(BUILDVERSION)
endif
$(info    VERSION is $(VERSION))

사례 1: 실행 인수를 포함하면 이 출력이 표시됩니다.

BUILDVERSION is "VABCDE.00.00A001"
vers is VABCDE.00.00A002
VERSION is "VABCDE.00.00A001"

사례 2: 실행 인수를 포함하지 않으면 이 오류가 발생합니다.

Makefile:1: *** empty variable name.  Stop.
Makefile:1: *** empty variable name.  Stop.

누구든지 내 코드에 문제가 있는지 찾는 데 도움을 주실 수 있나요?

답변1

잘 모르겠습니다. 질문을 이해합니다.

make외부에서 버전 번호를 제공 하고 명령줄에 버전이 제공되지 않은 경우 기본값을 사용하는 작업인 경우 . 그러면 makefile다음과 같아야 합니다.

VERS = VABCDE.00.00A002

$(info    BUILDVERSION is "$(BUILDVERSION)")
$(info    vers is "$(VERS)")

ifdef BUILDVERSION
        VERSION := $(BUILDVERSION)
else
        VERSION := $(VERS)
endif

$(info    VERSION is $(VERSION))

그리고 당신은 그것을 다음과 같이 호출할 것입니다:

make BUILDVERSION="not-default-version"

답변2

export $(BUILDVERSION) = $2

tl;dr; GNU make는 bash가 아닙니다.

는 as를 $(BUILDVERSION)호출한 경우에만 모든 항목으로 확장되며 , 이로 인해 해당 행은 a) 로 정의됩니다.makemake BUILDVERSION=somethingsomething함수형 매크로로 사용될 때 두 번째 인수로 확장되고 $(call something, ...)b)비어 있는somethingmake 규칙에서 실행되는 명령에 명명된 환경 변수입니다 .

BUILDVERSION정의되지 않았거나 빈 문자열로 정의된 경우 해당 empty variable name오류가 발생합니다.

$ make -f - <<'EOT' BUILDVERSION=something
export $(BUILDVERSION) = $2
all:; set | grep ^something; echo XXX $(call something,first,second)
EOT

set | grep ^something; echo XXX second
something=''
XXX second

$2하다~ 아니다make의 명령줄에 전달된 두 번째 인수로 확장하세요. 왜냐하면 ... make는 bash가 아니기 때문입니다.

관련 정보