如何在makefile中具有.mod的正确顺序

时间:2019-06-13 08:28:45

标签: makefile fortran

我正在尝试在Fortran中为我的项目创建一个Makefile,并使其可用于当前项目。经过多次尝试,我得出的Mkefile如下。问题是在某些情况下它可以正常工作,但现在我有了以下文件:

main.f90,initial.f90,parameters.f90,functions.f90

第一个有我的程序,其他是我有子例程的模块。问题是,初始文件需要参数才能起作用,但Makefile决定尝试在参数之前编译初始文件。有没有办法让我以正确的顺序选择它们?

vpath %.o obj
vpath %.mod mod 

TOP_DIR = .
MOD_DIR = $(TOP_DIR)/mod
OBJ_DIR = $(TOP_DIR)/obj

SOURCES = $(wildcard *.f90)
OBJECTS := $(patsubst %.f90, $(OBJ_DIR)/%.o, $(SOURCES))
ALL_MODULES = $(patsubst %.f90, %.mod, $(SOURCES))
MODULES = $(filter-out main.mod, $(ALL_MODULES))

FFLAGS = -O3 -J$(MOD_DIR) -march=native  -fimplicit-none  -Wall  -Wline-truncation  -fwhole-file  

.PHONY: main clean

main: main.out
./main.out

main.out: $(MODULES) $(OBJECTS)
gfortran $(FFLAGS) $(OBJECTS) -o main.out

$(OBJ_DIR)/%.o : %.f90
gfortran  $(FFLAGS) $^ -c $@

%.mod: %.f90
gfortran  $(FFLAGS) -c $^

clean:
rm -f $(OBJ_DIR)/*.o *.out $(MOD_DIR)/*.mod

2 个答案:

答案 0 :(得分:0)

以依赖性顺序列出源文件,而不是自动列出:SOURCES = parameters.f90 initial.f90 functions.f90

将模块和程序的源分开:main.f90通常不会生成.mod文件,这将破坏您拥有的简单的Makefile。

我还建议您使用其他构建系统(例如cmake),但是对于小型项目,如果愿意,可以使用Makefile获得。

答案 1 :(得分:0)

使用现代Fortran编译顺序非常重要。使用makefile时,对于任何不重要的事情,都太麻烦了以至于无法手动跟踪依赖项。输入各种工具来生成这些依赖项列表。我已经成功使用makedepf90,它可以作为EPEL(对于RHEL / CentOS)和Debian / Ubuntu中的软件包使用。

如果将列表保存在单独的文件中,甚至可以制定一个makefile规则来重新生成依赖项列表,例如:

include depend.mk

# Dependencies generated by "makedepf90" tool.
depend depend.mk:
        cd $(srcdir) && makedepf90 $(yourprogramname_SOURCES) >depend.mk

上面的BTW既可以用于普通makefile,也可以用于自动make(在这种情况下,您将上面的代码片段放入Makefile.am中)