[makefile] Makefile에 파일이 있는지 확인하여 삭제할 수있는 방법은 무엇입니까?

내 깨끗한 섹션에서 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.