如何在Fortran

时间:2018-11-05 14:25:37

标签: makefile fortran gnu-make gfortran

我的makefile当前如下所示:

#Source file locations
VPATH = :../AHMCodePara

#Compiler
CC = mpifort

#Debugging Flags
#Flags =

#Regular flags
Flags = -Ofast -mkl=sequential

# File name labels
FF =
DE =
Const =
OBJDIR = OBJ

# make object directory
$(OBJDIR):
        -mkdir $(OBJDIR)
CC += -module $(OBJDIR)

#Object File List
Inputs =
Tools = $(OBJDIR)/$(Const)Inputs.o
Diag$(DE) = $(Tools)
PreAnalysis = $(Tools) $(OBJDIR)/Tools.o
DOSsetupPara$(DE) = $(PreAnalysis) $(OBJDIR)/PreAnalysis.o $(OBJDIR)/Diag$(DE).o
$(Const)AHMRGv3 = $(Tools) $(OBJDIR)/Diag$(DE).o $(OBJDIR)/DOSsetupPARA$(DE).o

#Object File List
obj = $(OBJDIR)/$(Const)Inputs.o $(OBJDIR)/Diag$(DE).o $(OBJDIR)/Tools.o \
$(OBJDIR)/PreAnalysis.o $(OBJDIR)/DOSsetupPARA$(DE).o $(OBJDIR)/$(Const)AHMRGv3.o

# dependence files
$(OBJDIR)/%.o: %.f90 $(%)
#       @$(%)
        @-rm -f #<~
        $(CC) -c $< -o $@ $(Flags)

All: V3.e

# Target
V3.e: $(obj)
        $(CC) $(Flags) -o $@ $^

clean:
        rm $(OBJDIR)/*.o $(OBJDIR)/*.mod

它曾经与此相似:

LOC = ../../AHMCode/
CC = gfortran
#Debugging
#Flags = -O0 -g -fcheck=all -Wall -llapack
#Normal
Flags = -O3 -I/usr/lib/ -L/usr/lib/ -lblas -llapack
FF = _Old
IG = #IGNORE or nothing
TT = #TYPE or nothing
V3$(FF).e: Inputs.o Tools.o PreAnalysis.o DOSsetup$(IG).o Diag$(TT).o AHMRGv3_Manyruns.o
        $(CC) $(Flags) AHMRGv3_Manyruns.o Diag$(TT).o DOSsetup$(IG).o PreAnalysis.o Tools.o Inputs.o -o V3$(FF).e

Inputs.o: Inputs.f90
        $(CC) $(Flags) -c Inputs.f90

Tools.o: $(LOC)Tools.f90 Inputs.o
        $(CC) $(Flags) -c $(LOC)Tools.f90

PreAnalysis.o: $(LOC)PreAnalysis.f90 Inputs.o Tools.o
        $(CC) $(Flags) -c $(LOC)PreAnalysis.f90

DOSsetup$(IG).o: $(LOC)DOSsetup$(IG).f90 Inputs.o Tools.o PreAnalysis.o Diag$(TT).o
        $(CC) $(Flags) -c $(LOC)DOSsetup$(IG).f90

Diag$(TT).o: $(LOC)Diag$(TT).f90 Inputs.o
        $(CC) $(Flags) -c $(LOC)Diag$(TT).f90

AHMRGv3_Manyruns.o: AHMRGv3_ManyRuns.f90 DOSsetup$(IG).o Diag$(TT).o Inputs.o
        $(CC) $(Flags) -c AHMRGv3_Manyruns.f90

clean:
        rm *.o *.mod

我要在这些Makefile中比较的部分是.o文件定义。在第二个makefile文件中,我用手写了所有这些内容,并且效果很好。我的第二个Makefile的目的是做同样的事情,但是效率更高。

依赖关系引起了问题。最初对makefile进行更改时,我根本没有放置任何依赖项。这导致了我将更新Inputs而相关文件无法重新编译的问题(例如Tools.o)。这是预期的,因此我一直在寻找以新颖有效的方式添加依赖项的方法,以强制相关文件重新编译。

如您所见,我尝试创建与.f90和.o同名的变量以使用$(%)。这似乎有点过时(我真的不认为它会起作用),但不幸的是并没有解决我的问题。

从原始的makefile中可以看到,依赖项不遵循任何模式。同样,您可以看到我正在编译Fortran,并且我很确定-gen-dep不会执行任何操作,如果执行的话,我会做错了。

由于大多数人使用C ++,因此有关该问题的现有问题非常无助。

编辑:我“修复”了我的问题。它不是最有效的,并且不会自动生成依赖关系,但是我喜欢它,因为它没有很多重复的行。

#Object File List
oInpt =
oTool = $(OBJDIR)/$(Const)Inputs.o
oPreA = $(oTool) $(OBJDIR)/Tools.o
oDOSs = $(oPreA) $(OBJDIR)/PreAnalysis.o $(OBJDIR)/Diag$(DE).o
oDiag = $(oTool)
oMain = $(oTool) $(OBJDIR)/Diag$(DE).o $(OBJDIR)/DOSsetupPARA$(DE).o
obj = $(OBJDIR)/$(Const)Inputs.o $(OBJDIR)/Tools.o $(OBJDIR)/PreAnalysis.o $(OBJDIR)/Diag$(DE).o \
$(OBJDIR)/DOSsetupPARA$(DE).o $(OBJDIR)/$(Const)AHMRGv3.o


# dependence files
$(OBJDIR)/$(Const)Inputs.o: $(oInpt)
$(OBJDIR)/Tools.o: $(oTool)
$(OBJDIR)/PreAnalysis.o: $(oPreA)
$(OBJDIR)/Diag$(DE).o: $(oDiag)
$(OBJDIR)/DOSsetupPARA$(DE).o: $(oDOSs)
$(OBJDIR)/$(Const)AHMRGv3.o: $(oMain)
$(OBJDIR)/%.o: %.f90
        @-rm -f #<~
        $(CC) -c $< -o $@ $(Flags)

All: V3.e
# Target
V3.e: $(obj)
        $(CC) $(Flags) -o $@ $^

我为每个目标制定了多个规则。一个默认规则实际上可以编译.o文件,另一个默认规则可以指定每个.f90文件的依赖性。

0 个答案:

没有答案