2014-01-05 3 views
0

Рассмотрим следующий Makefile:Две цели без зависимостей

TARGET=fmake 
TARGET2=test_second 
fmake: $(TARGET2).c foo.c\ 
    $(TARGET).c test.h clean 
    $(CC) -o $(TARGET) $(TARGET).c foo.c 
    $(CC) -o $(TARGET2) $(TARGET2).c 
foo.c: 
    echo Some text 
clean: 
    rm -f fmake test_second 
CC=$(VAR2) 
VAR2=gcc 

После того, как команда make Баш следующий дисплей

rm -f fmake test_second 
gcc -o fmake fmake.c foo.c 
gcc -o test_second test_second.c 

Как сказал here foo.c не обрабатываются, потому что нет никаких зависимостей для этой цели. Но и foo.c, и clean не имеют зависимостей, но чистый processed. Зачем?

ответ

2

Поскольку существует файл с именем foo.c, тогда как файл с именем clean не существует. Поэтому Make думает, что нужно сделать. Обратите внимание, что clean действительно должен быть объявлен как phony target.

+0

Насколько я понял ваш ответ, сначала создайте инструменты 'make', которые ищут зависимости, объявленные в рассматриваемой цели, и если существуют зависимости, тогда начните обрабатывать один из них. Если для конкретной зависимости не существует правила, тогда начинайте обновление файла с именем dependencie. Если в нашей цели нет зависимостей, тогда 'make' ищет файл, имя которого является целевым именем. Если файл не найден, это правило обрабатывается. Правильно ли я понимаю? Но что с «целью по умолчанию»? Всегда ли обрабатывается цель по умолчанию? –

+1

@Dmitrii: Проще говоря, Make только запускает правило для цели, если либо оно не существует (и не является ложным), либо «старше», чем его зависимости. Это правило применяется к * всем * целям, включая цели верхнего уровня. –

+0

Большое спасибо! Теперь я это понимаю. –

Смежные вопросы