IT

Makefile에 파일이 있는지 확인하여 수있는 방법은 무엇입니까?

lottoking 2020. 7. 15. 07:15
반응형

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있습니다. 예를 들어 파일이 존재하지 않는 경우에만 파일을 다운로드하는 경우 다음 코드를 사용할 수 있습니다.

if fi
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

계속 앞으로 줄 끝에 백 슬래시가 필요할 수 있습니다. (아마도 버전에 따라 다름).

if [ -a myApp ] ; \
then \
     rm myApp ; \
fi;

문제는 명령을 여러 줄로 나눌 때입니다. 따라서 \위와 같이 계속해서 줄 끝에서 사용 하거나 &&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;

세미콜론 누락

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.

한 줄 솔루션 :

   [ -f ./myfile ] && echo exists

오류 조치가있는 한 줄 솔루션 :

   [ -f ./myfile ] && echo exists || echo not exists

make clean지시문에 사용 된 예 :

clean:
    @[ -f ./myfile ] && rm myfile || true

그리고 make clean항상 오류 메시지없이 작동합니다!


줄을 계속하기 위해 \를 사용하는 @ mark-wilkins의 답변과; 쉘에서 종료하거나 @kenorb에서 한 줄로 변경하는 것과 함께 문제를 해결합니다.

원래 문제에 대한 더 간단한 답이 있습니다 (@ alexey-polonsky가 지적했듯이). rm에 -f 플래그를 사용하여 오류가 발생하지 않도록합니다.

rm -f myApp

이것은 더 간단하고 빠르며 더 안정적입니다. 슬래시와 빈 변수로 끝나지 않도록주의하세요.

rm -f / $ (myAppPath) # 절대로하지 않고

시스템이 삭제 될 수 있습니다.


test ! -f README.md || echo 'Support OpenSource!' >> README.md

"README.md가 계속 아무 작업도 수행하지 않고 계속 종료합니다."

&&대신 사용 ||하면 파일이 없을 때 오류가 발생합니다.

Makefile:42: recipe for target 'dostuff' failed
make: *** [dostuff] Error 1

참고 URL : https://stackoverflow.com/questions/5553352/how-do-i-check-if-file-exists-in-makefile-so-i-can-delete-it

반응형