내 깨끗한 섹션에서 Makefile
영구적으로 삭제하기 전에 파일이 있는지 확인하려고합니다. 이 코드를 사용하지만 오류가 발생합니다.
무슨 일이야?
if [ -a myApp ]
then
rm myApp
fi
이 오류 메시지가 나타납니다
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
답변
그러나 두 번째 상위 답변은을 언급 ifeq
하지만 이것들은 대상의 이름과 같은 수준에 있어야한다고 언급하지 않습니다. 예를 들어 파일이 존재하지 않는 경우에만 파일을 다운로드하는 경우 다음 코드를 사용할 수 있습니다.
download:
ifeq (,$(wildcard ./glob.c))
curl … -o glob.c
endif
# THIS DOES NOT WORK!
download:
ifeq (,$(wildcard ./glob.c))
curl … -o glob.c
endif
답변
많은 사람들이 이것을 위해 쉘 스크립팅을 사용하는 것을 보는 것은 이상합니다. 기본 makefile 구문을 사용하는 방법을 찾고 있었는데, 대상 외부에서 이것을 작성하기 때문입니다. 이 wildcard
기능을 사용하여 파일이 존재하는지 확인할 수 있습니다.
ifeq ($(UNAME),Darwin)
SHELL := /opt/local/bin/bash
OS_X := true
else ifneq (,$(wildcard /etc/redhat-release))
OS_RHEL := true
else
OS_DEB := true
SHELL := /bin/bash
endif
최신 정보:
나는 정말로 나를 위해 일하는 방법을 찾았다.
ifneq ("$(wildcard $(PATH_TO_FILE))","")
FILE_EXISTS = 1
else
FILE_EXISTS = 0
endif
답변
문제는 명령을 여러 줄로 나눌 때입니다. 따라서 \
위와 같이 계속해서 줄 끝에서 를 사용 하거나 &&
bash 의 연산자를 사용하여 한 줄로 모든 것을 얻을 수 있습니다 .
그런 다음 test
명령을 사용 하여 파일이 존재하는지 테스트 할 수 있습니다 ( 예 :
test -f myApp && echo File does exist
-f file
파일이 존재하고 일반 파일 인 경우 참입니다.
-s file
파일이 존재하고 크기가 0보다 크면 True입니다.
또는하지 않습니다 :
test -f myApp || echo File does not exist
test ! -f myApp && echo File does not exist
는 test
에 해당 [
명령을 실행합니다.
[ -f myApp ] && rm myApp # remove myApp if it exists
원래 예제에서와 같이 작동합니다.
help [
또는 help test
추가 구문을 참조하십시오 .
답변
계속하려면 줄 끝에 백 슬래시가 필요할 수 있습니다 (아마도 make 버전에 따라 다름).
if [ -a myApp ] ; \
then \
rm myApp ; \
fi;
답변
또는 원하는대로 한 줄에 넣으 make
십시오.
if [ -a myApp ]; then rm myApp; fi;
답변
세미콜론 누락
if [ -a myApp ];
then
rm myApp
fi
그러나 오류 메시지를 방지하기 위해 삭제하기 전에 존재 여부를 확인한다고 가정합니다. 그렇다면 rm -f myApp
어떤 “강제”삭제를 사용할 수 있습니다 . 즉 파일이 존재하지 않으면 오류가 발생하지 않습니다.
답변
FILE1 = /usr/bin/perl
FILE2 = /nofile
ifeq ($(shell test -e $(FILE1) && echo -n yes),yes)
RESULT1=$(FILE1) exists.
else
RESULT1=$(FILE1) does not exist.
endif
ifeq ($(shell test -e $(FILE2) && echo -n yes),yes)
RESULT2=$(FILE2) exists.
else
RESULT2=$(FILE2) does not exist.
endif
all:
@echo $(RESULT1)
@echo $(RESULT2)
실행 결과 :
bash> make
/usr/bin/perl exists.
/nofile does not exist.