Как проверить, существует ли файл в 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
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 filetrue, если файл существует и является обычным файлом.
-s fileTrue, если файл существует и имеет размер больше нуля.или нет:
test -f myApp || echo File does not exist test ! -f myApp && echo File does not existThe
testэквивалентно . Смотрите:help [илиhelp testдля дальнейшего синтаксис.
отсутствует точка с запятой
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