2013-03-12 2 views
1

Я пытаюсь написать make-файл Fortran: есть один «главный» файл, но я поместил свои модули в отдельные файлы .f90. Прикрепленный файл makefile работает, однако, даже если я не делаю никаких изменений, он заставляет перекомпилировать. Я запускаю x86-64 Linux с gfortan 4.7.2 и GNU Make 3.81.Fortran makefile перекомпилирует каждый раз

FC = gfortran 

FCFLAGS += -ffree-line-length-none -finit-local-zero 

#FCFLAGS += -fbounds-check -ffpe-trap=invalid 

all: new 

new: ALE.o curvilinear.o new.o 
    $(FC) $(FCFLAGS) -o new new.o ALE.o curvilinear.o 

new.o: ALE.mod curvilinear.mod new.f90 
    $(FC) $(FCFLAGS) -c new.f90 

ALE.o: ALE.f90 
    $(FC) $(FCFLAGS) -c ALE.f90 

ALE.mod: ALE.o ALE.f90 

curvilinear.o: ALE.o curvilinear.f90 
    $(FC) $(FCFLAGS) -c curvilinear.f90 

curvilinear.mod: curvilinear.o curvilinear.f90 

clean: 
    rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o 

Выход:

$ make clean 
rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o 
$ make 
gfortran -ffree-line-length-none -finit-local-zero -c ALE.f90 
gfortran -ffree-line-length-none -finit-local-zero -c curvilinear.f90 
gfortran -ffree-line-length-none -finit-local-zero -c new.f90 
gfortran -ffree-line-length-none -finit-local-zero -o new new.o ALE.o curvilinear.o 
$ make 
gfortran -ffree-line-length-none -finit-local-zero -c new.f90 
gfortran -ffree-line-length-none -finit-local-zero -o new new.o ALE.o curvilinear.o 

Почему не "новый" перетранслируется, когда не были внесены изменения?

ответ

1

В зависимости от вашего Makefile, new.o зависит от ALE.mod и curvilinear.mod.

Я думаю, что этот файл никогда не существует, поскольку у них есть зависимости, но нет правила их создания.

Действительно, при попытке построить new, make не найден *.mod. Следовательно, make управляет правилами, чтобы сделать их, но нет правила. Тем не менее, make полагает, что он их построил и продолжает операцию сборки, считая, что эти зависимости *.mod были просто восстановлены и, таким образом, являются последними, вызывая восстановление new.

Чтобы исправить это, вы должны заменить строку

new.o: ALE.mod curvilinear.mod new.f90 

по

new.o: new.f90 
+0

Thanks; вы совершенно правы, мне не нужно иметь файлы .mod в make-файле. Удаление их дает «правильное» поведение для make. –

2

ответ Didier, вероятно, уже решает ваш вопрос, но я хотел бы добавить приятное и чистое предложение для Фортрана Makefiles (пример для одной основной программы):

# Main program 
all: program 
program: mod1.o mod2.o mod3.o 

# Fortran module dependencies 
mod1.o: mod2.o mod3.o 

# Binary/object rules 
%: %.o 
     $(FC) $(FCFLAGS) -o [email protected] $^ $(LDFLAGS) 

%.o: %.f90 
     $(FC) $(FCFLAGS) -c $< 
Смежные вопросы