2015-11-29 4 views
0

Вот мой код:Почему Makefile обнаруживает файл, даже если он не существует?

%.o: %.cpp 
    @mkdir -p bin/obj/$(@D) 
ifeq ($(wildcard bin/obj/[email protected]),) 
    $(CC) -c -o bin/obj/[email protected] $< $(CFLAGS) $(FLAGS) 
else 
    @echo "bin/obj/[email protected] exists" 
endif 

И у меня есть проблема, когда каталог OBJ существует, я всегда получаю ложь.

Я говорю об этом состоянии:

($ (подстановочные бен/объект/$ @))

Я не знаю, как это исправить.

Makefile всегда печатает этот файл, даже если я удаляю его с диска.

Работает только при удалении каталога obj.

Как это исправить?

ответ

2

Проблема заключается в том, что Make оценивает условное выражение перед выполнением правила, когда [email protected] не был определен (и когда файл еще не был создан). Подстановочный знак вычисляет значение $(wildcard /bin/obj/), которое будет генерировать «bin/obj /», если каталог существует, и я полагаю, что это так.

Существует несколько способов решить эту проблему. Самым прямым является установка условного обозначения в команде, так что Make передает его в оболочку:

%.o: %.cpp 
    @mkdir -p bin/obj/$(@D) 
    @if [ -e bin/obj/[email protected] ]; then echo it exists; else $(CC) ...; fi 
Смежные вопросы