LINUX.ORG.RU

makefile

 , , ,


0

1

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

проект разросся и время компиляции сильно возросло. раньше для проекта использовал 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 или подскажите как добится решения проблемы.


Ну так откуда make узнает, что объектный файл зависит от исходника? И почему у вас объектники зависят друг от друга?

Relan ★★★★★
()
Ответ на: комментарий от Gvidon

а как это сделать? просто дописать

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

$(COMPIL) hello1.$(EX)

?

MuKeP
() автор топика
Ответ на: комментарий от MuKeP

Да, примерно так. Только я не очень понимаю, что ты хочешь сделать, ставя в зависимости ещё и какие-то левые объектники. «hello1.o: db.o» какой смысл имеет?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

$(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)

MuKeP
() автор топика
Ответ на: комментарий от MuKeP

Нет, не правильно. Объектник должен зависеть от исходников, которые используются для его сборки. Разбирайся, короче. Вот тебе, например, короткое руководство: http://mrbook.org/tutorials/make/

Gvidon ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.