Module Makefile:避免为新文件夹编译Fortran模块

Module Makefile:避免为新文件夹编译Fortran模块,module,makefile,fortran,Module,Makefile,Fortran,我有一个使用模块的Fortran程序,即它在编译期间创建.mod-文件。 我还编写了一个Makefile,它使用src/中的所有.f90-文件,将所有创建的.o-文件放在obj/中,二进制文件放在当前文件夹中,一切正常 现在,我在不同的文件夹中重新编译我的程序,以进行不同的计算(例如calc1/),也就是说,我将Makefile复制到calc1/,在calc1/中键入makeall,它所做的只是链接,因为对象文件已经存在。但是,如果程序包含任何模块,编译器需要相应的.mod-文件出现在calc1

我有一个使用模块的Fortran程序,即它在编译期间创建
.mod
-文件。 我还编写了一个
Makefile
,它使用
src/
中的所有
.f90
-文件,将所有创建的
.o
-文件放在
obj/
中,二进制文件放在当前文件夹中,一切正常

现在,我在不同的文件夹中重新编译我的程序,以进行不同的计算(例如
calc1/
),也就是说,我将
Makefile
复制到
calc1/
,在
calc1/
中键入
makeall
,它所做的只是链接,因为对象文件已经存在。但是,如果程序包含任何模块,编译器需要相应的
.mod
-文件出现在
calc1/
中。到目前为止,我重新编译了所有内容(
makecleanlall
),但随着程序的增长,这需要花费太多的时间

我提出的一个可能的解决方案是为二进制文件设置一个特定的文件夹(
bin/
)。但这并不是一个可行的选择,因为我在队列中有作业,这显然需要一个稳定的二进制文件,同时我也在尝试新功能

因此,我正在寻找一种解决方案,以某种方式处理
.mod
-文件,类似于
.o
-文件,例如,将它们放在
obj/
中。我希望(大多数?)编译器会指定一个选项来更改模块文件路径。使用
gfortran
,选项为
-J
-M
(从手册页):

我认为大多数编译器在
-I

编辑

从gfortran 4.6开始,
-M
不再受支持。使用
-J


根据我的一个配置脚本,标志是
-module
用于
ifort
pgf90
,尽管我最近几乎从未使用过这些编译器,所以其他人应该确认…

我知道Make,但我不知道Fortran(ha!)。编译器是否在当前目录中生成
mod
文件?它们是否有可预测的名称(例如
foo.f90
=>
foo.mod
)?你能用编译器的参数控制它们的名称吗?好的,
mod
文件在当前目录中创建,并按照文件中给定的名称命名,例如
foo.f90
包含
模块条
,然后文件将命名为
bar.mod
。这在编译期间无法控制,因为名称在其他文件中使用,即在
main.f90
i write
use bar
中。已确认。对于
ifort
,它是
-module
。谢谢你的帮助!
-Jdir
-Mdir
       This option specifies where to put .mod files for compiled modules.  It is also
       added to the list of directories to searched by an "USE" statement.

       The default is the current directory.

       -M is deprecated to avoid conflicts with existing GCC options.