Как проверить, существует ли файл в 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

Ответ 1

Во втором верхнем ответе упоминается ifeq, однако в нем не упоминается, что они должны находиться на том же уровне, что и имя цели, например, для загрузки файла, только если он в данный момент не существует, можно использовать следующий код :

download:
ifeq (,$(wildcard ./glob.c))
    curl … -o glob.c
endif

Ответ 2

Странно видеть так много людей, использующих сценарии оболочки для этого. Я искал способ использовать собственный синтаксис 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

Ответ 3

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

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

Ответ 4

Проблема в том, что вы разделяете свою команду на несколько строк. Таким образом, вы можете использовать \ в конце строк для продолжения, как описано выше, или вы можете получить все в одной строке с помощью оператора && в bash.

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

test -f myApp && echo File does exist

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

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

или нет:

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 для дальнейшего синтаксиса.

Ответ 5

Или просто поместите его на одну строку, так как make ему нравится:

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

Ответ 6

Отсутствие точки с запятой

if [ -a myApp ];
then
  rm myApp
fi

Однако, я предполагаю, что вы проверяете существование перед удалением, чтобы предотвратить сообщение об ошибке. Если это так, вы можете просто использовать rm -f myApp, который "заставляет" удалить, т.е. Не выдает ошибку, если файл не существует.

Ответ 7

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.

Ответ 8

Однострочное решение:

   [ -f ./myfile ] && echo exists

Однострочное решение с ошибкой:

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

Пример, используемый в моих директивах make clean:

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

И make clean всегда работает без сообщений об ошибках!

Ответ 9

Ответы похожи на ответ @mark-wilkins, использующий\для продолжения строк и; прекратить их в оболочке или как в @kenorb, изменив это на одну строку, это хорошо, и это решит эту проблему.

там более простой ответ на исходную проблему (как указал @alexey-polonsky). Используйте флаг -f для rm, чтобы он не вызывал ошибку

rm -f myApp

это проще, быстрее и надежнее. Просто будьте осторожны, чтобы не получить косую черту и пустую переменную

rm -f/$ (myAppPath) # НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО

Вы можете удалить свою систему.

Ответ 10

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

"Если README.md не существует, ничего не делать (и успешно завершить работу). В противном случае добавьте текст в конец".

Если вы используете && вместо || тогда вы генерируете ошибку, когда файл не существует:

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