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