makefile

Компьютеры программирование программы Linux

Возникла проблема.

проект разросся и время компиляции сильно возросло.
раньше для проекта использовал makefile, где все компилировалось "скопом" без учета того, изменен ли был файл или нет.

теперь решил сделать все по-человечески и взялся за написание makefile на пробной задаче.

читал как делать это тут http://linux.yaroslavl.ru/docs/prog/gnu_make_3-79_russian_manual.html

вот мой makefile

TARGET=hello.x
COMPILER=ifort
CFLAGS=-O3
COMPIL=$(COMPILER) -c $(CFLAGS)
OBJS= db.o hello.o hello1.o hello2.o hello3.o
EX=f90

$(TARGET): $(OBJS)
$(COMPILER) $(CFLAGS) $(OBJS) -o $(TARGET)

db.o:
$(COMPIL) db.$(EX)

hello.o: db.o hello3.o
$(COMPIL) hello.$(EX)

hello1.o: db.o
$(COMPIL) hello1.$(EX)

hello2.o: db.o
$(COMPIL) hello2.$(EX)

hello3.o: db.o
$(COMPIL) hello3.$(EX)

clean:
rm *.o
rm *.mod


db.f90 - файл, в котором написан модуль с переменными для всех остальных файлов.
hello3.f90 - файл, в котором написана функция, вызываемая из hello.f90

вот и все зависимости.

если я меняю что-то в файлах и пишу make, то мне выдается ответ:
make: `hello.x' не требует обновления.
хотя изменения внесены.

удаляю hello.x
он снова пересобирается из существующих объектных файлов без перекомпилирования изменившихся файлов.

для ускорения компиляции проекта я хотел бы составить ряд зависимостей и компилировать только те файлы, которые зависят от измененного файла.

подскажите где я неправ в makefile или подскажите как добится решения проблемы.

Примечание:
если что, то табуляции там стоят перед командами.

Примечание:
ckpunTkuDDuc,
спасибо, что откликнулись

должно быть так

$(TARGET): $(OBJS)
$(COMPILER) $(CFLAGS) $(OBJS) -o $(TARGET)

db.o: db.$(EX)
$(COMPIL) db.$(EX)

hello.o: db.$(EX) hello3.$(EX)
$(COMPIL) hello.$(EX)

hello1.o: db.$(EX)
$(COMPIL) hello1.$(EX)

hello2.o: db.$(EX)
$(COMPIL) hello2.$(EX)

hello3.o: db.$(EX)
$(COMPIL) hello3.$(EX)

?

Примечание:
то есть линковать он будет каждый раз?

Примечание:
последний вопрос:

%.o: %.$(EX)
$(COMPILER) -c $(CFLAGS) $< -o $@

что значит "$< -o $@" ?

Примечание:
Огромное спасибо!
Ответы:
В зависимостях внутри цели надо указывать те цели, от которых она зависит. В вашем случае для целей hello?.o не прописано зависимостей от соответствующих исходников, поэтому make не учитывает их дату/время последнего изменения.
>то есть линковать он будет каждый раз?
разумеется, линковка требуется когда меняется хотя бы один из объектников


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.