我将所有的代码放在模块中,每个源文件一个模块(除了在tests.f90文件中包含最小程序)。源文件和模块的名称相同,给出等效的名称,例如:
想法:可以使用
当源文件被编译时,是否使用
如果更新file.f90,则应更新相应的file.o文件和可能的file.mod文件。如果更新file.mod,则应使用
实现和问题:我在下面的makefile中实现了这些原则。但是,问题出现在(预期的)情况下,即更新了file.mod但未更新file2.mod的情况下。然后,make会一遍又一遍地运行
我能做什么?是否可以仅在替换file.mod时(即创建的时间)触发依赖项file2.mod,但是文件本身只要考虑最新的
src/computes.f90
,build/computes.o
,build/computes.mod
。使用use
语句将模块链接起来。以下是本项目最好的makefile,但存在一个主要问题,即文件被无限重新考虑。想法:可以使用
-fsyntax-only
快速编译只有.mod文件。当所有.mod文件存在时,.o文件没有内部依赖关系,可以按任何顺序编译,简化多线程编译。当源文件被编译时,是否使用
gfortran -fsyntax-only
,只有在更改时才更新模块文件,而不管相应的对象文件是否已更新。因此,可以具有比相应的.f90文件更旧的.mod文件。如果更新file.f90,则应更新相应的file.o文件和可能的file.mod文件。如果更新file.mod,则应使用
gfortran -fsyntax-only file2.f90
检查依赖于file.mod的file2.mod。只有当更新了file2.mod时,才应编译file2.o(这是耗时的步骤,否则应避免。这是否正确?)。实现和问题:我在下面的makefile中实现了这些原则。但是,问题出现在(预期的)情况下,即更新了file.mod但未更新file2.mod的情况下。然后,make会一遍又一遍地运行
gfortran -fsyntax-only file2.f90
,因为先决条件比没有(也不应该)更新的目标老。我能做什么?是否可以仅在替换file.mod时(即创建的时间)触发依赖项file2.mod,但是文件本身只要考虑最新的
touch
(例如最新修改的时间)即可?我也欢迎为不同的方法提出建议。B = build
S = src
F = gfortran
f = -J$B -I$B
P = program
modfile_names = constypes computes systems tests
obj = $(addprefix $B/, $(modfile_names:=.o))
vpath %.f90 $S
all:
make -j4 $P
$P:$(obj)
$F $f $^ -o $@
$B/%.o:%.f90 $B/%.mod
$F $f -c $< -o $@
$B/%.mod:
$F $f -fsyntax-only $S/$(notdir ${@:.mod=.f90})
$B/tests.mod: $B/constypes.mod $B/computes.mod $B/systems.mod
$B/computes.mod $B/systems.mod: $B/constypes.mod
.phony:clear
clear:
rm $B/* $P