Fortran90 Makefile带有预编译和模块

时间:2014-10-24 13:39:50

标签: makefile fortran fortran90 precompile pre-compilation

我正在尝试编写一个 Makefile 来编译一个 Fortran90 项目,该项目包含几个包含子程序和模块的源文件。为了使事情变得更复杂,我使用预编译(从*.for文件创建*.F个文件)。我找不到任何答案,但这可能是因为我对Makefile语法的不同风格感到困惑。

我创建了一个精简版本来重现我的问题(可在https://github.com/stineb/stackoverflow上找到)。这包含一个主程序(sayhello.F),两个子程序位于不同的源文件(schleppe.Fschnuppi.F)中,两个模块位于不同的源文件中(words_schleppe.mod.F和{{1 }})。可执行文件是words_schnuppi.mod.F

我能够使用简单的Makefile构建它并避免预编译。这个文件(Makefile_simple)如下所示:

hello

但是,我的项目会比这个大一点,所以我想利用更复杂的Makefile的神秘功能来定义规则。至关重要的是:我想将源文件FCOM=gfortran EXE = hello standard: $(FCOM) -c words_schleppe.mod.F $(FCOM) -c words_schnuppi.mod.F $(FCOM) -c schleppe.F $(FCOM) -c schnuppi.F $(FCOM) words_schleppe.mod.o words_schnuppi.mod.o schleppe.o schnuppi.o sayhello.F -o $(EXE) .PHONY: clean clean: rm $(EXE) *.o *.mod 预编译为*.F。这是我无法定义规则来从模块创建.for文件并构建整个事物的地方。无视模块,我确实使用以下Makefile(我的github存储库上的.mod)运行它:

Makefile_complex

为了在构建中包含模块,我需要添加什么?依赖关系如下:FCOM=gfortran CPPFLAGS=-e COMPFLAGS= EXE=hello SOURCES=sayhello.F schleppe.F schnuppi.F OBJS=$(SOURCES:.F=.o) all: $(OBJS) # this may also be replaced by the ar command (creating archive) $(FCOM) $(OBJS) -o $(EXE) %.for: %.F rm -f $*.for $(FCOM) $(CPPFLAGS) $*.F > $*.for $(OBJS): %.o: %.for $(FCOM) -c -o $@ $(COMPFLAGS) $*.for # clean: remove .for, .o, .do, and .stb files .PHONY: clean clean: -rm -f *.for *.o *.stb *.mod < - subroutine schleppe;和module words_schleppe< - subroutine schnuppi

帮助,有人吗? 非常感谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!简单地说,all:的规则必须包含模块源文件,这些必须先于其他源文件。另外,必须添加从模块源文件创建目标文件的规则。工作的Makefile如下所示:

FCOM=gfortran

CPPFLAGS=-E
COMPFLAGS=

EXE=hello

SOURCES=sayhello.F schleppe.F schnuppi.F
MODS=words_schleppe.F words_schnuppi.F

OBJS=$(SOURCES:.F=.o)
MODOBJS=$(MODS:.F=.o)

# this may also be replaced by the ar command (creating archive)
all: $(MODOBJS) $(OBJS)
    $(FCOM) $(OBJS) $(MODOBJS) -o $(EXE)

%.for: %.F
    rm -f $*.for
    $(FCOM) $(CPPFLAGS) $*.F > $*.for

$(MODOBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

$(OBJS): %.o: %.for
    $(FCOM) -c -o $@ $(COMPFLAGS) $*.for

# clean: remove .for, .o, .do, and .stb files
.PHONY: clean
clean:
    -rm -f *.for *.o *.stb *.mod