2013-03-12 125 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 $<