2013-03-12 55 views
1

我正在尝试编写一个Fortran makefile:有一个“main”文件,但我已将模块放在单独的.f90文件中。附加的makefile可以工作,但是即使我不做任何更改,它也会强制重新编译。我使用gfortan 4.7.2和GNU Make 3.81运行x86-64 Linux。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.modcurvilinear.mod

我想这些文件不存在,因为他们有依赖关系,但没有规则使他们。

确实,当试图构建new时,make未找到*.mod文件。因此,make运行规则来制作它们,但没有规则。但是,make认为它构建了它们,并继续构建操作,认为这些*.mod依赖关系已被重建,因此最近触发了重建new

为了解决这个问题,你应该更换线

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

new.o: new.f90 
+0

谢谢;你是对的,我不需要在makefile中有.mod文件。删除它们会为制作提供“正确”的行为。 – 2013-03-12 16:25:44

2

迪迪埃的答案可能已经解决你的问题,但我想补充的Fortran语言的makefile一个非常干净的建议(例如一个主程序):

# 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 $<