Make의 $(shell...)을 통해 makefile 변수를 에코하는 방법

Make의 $(shell...)을 통해 makefile 변수를 에코하는 방법

나는GNU 메이크파일. makefile에는 몇 가지 테스트가 있습니다(링크된 파일의 약 65번째 줄).

UNAME = uname

MACHINE ?= $(shell $(UNAME) -m)
SYSTEM ?= $(shell $(UNAME) -s)

IS_X86 = $(shell echo $MACHINE | $(EGREP) -c "i.86|x86|i86|amd64")
IS_X86_64 = $(shell echo $MACHINE | $(EGREP) -c "_64|d64")

MinGW 및 해당 쉘에서는 makefile을 올바르게 설정할 수 없습니다 IS_X86. 테스트 블록 뒤에 다음을 추가하면:IS_X86_64sh

$(info MACHINE: $(MACHINE))
$(info SYSTEM: $(SYSTEM))
$(info IS_X86: $(IS_X86))
$(info IS_X86_64: $(IS_X86_64))

그 대가로 내가 얻는 것은 다음과 같습니다.

$ make
MACHINE: i686
SYSTEM: MINGW32_NT-6.1
IS_X86: 0
IS_X86_64: 0

MinGW가 일치할 수 있다고 가정하므로 i686MinGW 아래의 명령이나 변수에 문제가 있는 것 같습니다 i.86.echo

또한 다음을 시도했지만 만족스럽지 않았습니다.

$(shell echo $(MACHINE) ...)
$(shell echo $((MACHINE)) ...)

테스트하기 전에 변수 확장을 강제로 시도하기도 했습니다.

MACHINE := $(MACHINE)

마지막으로 임시로 사용해 보았지만 아무런 재미도 없었습니다.

MTEXT ?= $(shell $(UNAME) -m)
MACHINE := $(MTEXT)

테스트는 BSD, Linux, OS X 및 Solaris에서 잘 실행됩니다. Cygwin에서도 실행됩니다.

echoMinGW에서 echo makefile 변수를 사용하기 위한 팁은 무엇입니까?

답변1

bash가 아닌 mingw 환경에서 이상한 쉘을 사용하고 있는 것 같습니다. 아니면 egrep의 이상한 버전입니다.

이러한 egrep 셸 호출을 GNU make 조건문으로 바꾸면 이 문제를 해결할 수 있습니다. 예를 들면 다음과 같습니다.

ifeq (,$(filter %686 %x86 %i86 %amd64,$(MACHINE)))
  IS_X86 = 0
else
  IS_X86 = 1
endif

또는 다음을 기반으로 뭔가를 만들 수도 있습니다.$(findstring ...)또는 다른 GNU make text 함수.

현재 문제를 해결하는 것 외에도 이러한 GNU make 언어 기능을 사용하는 것이 left 및 right 를 분기하는 것보다 더 효율적입니다 $(shell).

관련 정보