Как проверить, существует ли файл в Makefile?



в чистом разделе моего makefle я пытаюсь проверить, существует ли файл перед удалением навсегда. Я использую этот код, но я получаю ошибки.



что с ним не так?



 if [ -a myApp ]
then
rm myApp
fi


Я получаю это сообщение об ошибке



 f [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
804   8  

8 ответов:

второй верхний ответ упоминает 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 ifeq (,$(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

для продолжения может потребоваться обратная косая черта в конце строки (хотя, возможно, это зависит от версии make):

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

вы можете просто использовать test команда для проверки наличия файла, например:

test -f myApp && echo File does exist

-f file true, если файл существует и является обычным файлом.

-s file True, если файл существует и имеет размер больше нуля.

или нет:

test -f myApp || echo File does not exist
test ! -f myApp && echo File does not exist

The test эквивалентно . Смотрите: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 всегда работает без каких-либо сообщений об ошибке!

Comments

    Ничего не найдено.