2016-05-10 3 views
0

Следующий простой фиктивной цели для Makefile не удается: отображаетсяMakefile Фиктивные цели не в состоянии с помощью команды тест

dir=/etc 
file=fstab 
install: 
     -test ! -f $(dir)/$(file) 

Ошибка:

make install 
-I/root/module 
test ! -f /etc/fstab 
make: [install] Error 1 (ignored) 

Если удалить ! символ из условия, нет вопрос. Может кто-нибудь помочь мне разобраться с этой проблемой? Я надеюсь, что это ошибка в bash/Makefile.

+2

Не вы просто получить статус выхода' test', так как '/ и т.д./fstab', скорее всего, существует? Что ты пытаешься сделать? – chepner

+0

Пожалуйста, объясните, в чем проблема. Тогда мы можем помочь вам разобраться. Похоже, все работает правильно для меня. – MadScientist

+0

Да, я пытаюсь это сделать. Я знаю, что/etc/fstab существует всегда. Но для любого файла, который выходит, эта проверка отображает ошибку «make: [install] Error 1 (ignored)». –

ответ

0

Ваш рецепт:

-test ! -f $(dir)/$(file) 

удастся (возвращение 0), если $(dir)/$(file) не существует и упускает (возвращает ненулевой), если $(dir)/$(file) существует. Из-за префикса - make проигнорирует сбой, по умолчанию сообщит, что он игнорирует сбой, и будет продолжать работу вместо остановки.

Посмотрите:

Makefile

dir=/etc 
file=fstab 

.PHONY: all install 

all: install 
    echo "Success" 

install: 
    -test ! -f $(dir)/$(file) 

Выполнить это:

$ make 
test ! -f /etc/fstab 
Makefile:8: recipe for target 'install' failed 
make: [install] Error 1 (ignored) 
echo "Success" 
Success 

bash не нарушена. make не сломан. Нет ничего плохого.

Если вы даже не хотите видеть make «s прогрессбар и диагностический вывод затем вы можете заставить их замолчать:

$ make --silent 
Success 
+0

Таким образом, файл существует, команда test возвращает 0 и, следовательно, сообщение об ошибке (make: [install] Ошибка 1 (игнорируется)). Поправьте меня, если я ошибаюсь. –

+0

№ Команда успешна, если она возвращает 0, неудачно, если она возвращает не-0. (Это не является своеобразной интерпретацией 'make': это интерпретация Unix-подобных ОС, их оболочек, команд и системных вызовов с начала времени.) Команда' test' терпит неудачу, поскольку файл существует, возвращая 1. Make игнорирует эту ошибку (код возврата 1) из-за префикса '-'; он сообщает, что он игнорирует эту ошибку, и она продолжается. –

+0

Как мне запустить --silent по умолчанию? – dlite922