나는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_64
sh
$(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가 일치할 수 있다고 가정하므로 i686
MinGW 아래의 명령이나 변수에 문제가 있는 것 같습니다 i.86
.echo
또한 다음을 시도했지만 만족스럽지 않았습니다.
$(shell echo $(MACHINE) ...)
$(shell echo $((MACHINE)) ...)
테스트하기 전에 변수 확장을 강제로 시도하기도 했습니다.
MACHINE := $(MACHINE)
마지막으로 임시로 사용해 보았지만 아무런 재미도 없었습니다.
MTEXT ?= $(shell $(UNAME) -m)
MACHINE := $(MTEXT)
테스트는 BSD, Linux, OS X 및 Solaris에서 잘 실행됩니다. Cygwin에서도 실행됩니다.
echo
MinGW에서 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)
.