Makefile编译不同目录中的Fortran源文件

Makefile编译不同目录中的Fortran源文件,makefile,fortran,dependency-management,directory,Makefile,Fortran,Dependency Management,Directory,这是我的问题:我已经使用Java很多年了,我喜欢有很多目录来分隔代码的不同区域。对于我当前的项目,我正在编写Fortran代码,它应该在Windows和Unix/Linux下编译。对于Windows,我使用Eclipse/Photran和MinGW/gfortran工具来设置makefile 下面是所需的项目结构(类似Java的深层嵌套树会更好) 我想调用Makefile\u main.unix,它将设置任何unix特定的变量,然后包括Makefile\u main.any,Makefile\u

这是我的问题:我已经使用Java很多年了,我喜欢有很多目录来分隔代码的不同区域。对于我当前的项目,我正在编写Fortran代码,它应该在Windows和Unix/Linux下编译。对于Windows,我使用Eclipse/Photran和MinGW/gfortran工具来设置makefile

下面是所需的项目结构(类似Java的深层嵌套树会更好)

我想调用
Makefile\u main.unix
,它将设置任何unix特定的变量,然后包括
Makefile\u main.any
Makefile\u lib1.any

(类似于在窗户上制作)

我到了可以看到给定目录中所有源文件的阶段,例如

SRCS  := $(wildcard $(SRC_DIR)/*.$(SRC_EXT))
现在,我正在努力研究如何像Fortran 95中那样生成所有依赖项,每个源代码生成
*.o
*.mod

在编译时是否有方法在目录之间切换,以便所有目标/依赖项的名称中都没有目录路径?注意,我正在从Eclipse项目所在的其他服务目录调用
make
。对如何进行有何建议

我真的不想像通常的Fortran风格那样只拥有一个目录
所有的混乱和代码一起。

您可以采取两种主要策略

您可以在每个子目录中放置一个makefile,并使其支持诸如
all
clean
等目标,然后使用顶级makefile的递归make调用在每个子目录中创建相同的目标(例如
all

或者,您可以在一次make调用中处理这一切,而无需递归,但随后您必须使用包含子目录名称的相对路径。就我个人而言,我不认为这有什么问题,并且我维护了一个基于这种方法的makefile系统

假设
SRC
被正确地设置为每个需要编译的源的相对路径列表,那么在您的情况下可以做些什么

# This replaces the SRC_EXT suffix with .o in each filename
OBJ = $(SRC:%.$(SRC_EXT)=%.o)

$(BINARY_NAME): $(OBJ)
    ...link command...

%.o: %.$(SRC_EXT)
    ...compile command...

如果您有
dir2/src/foo.f
,您希望
foo.o
foo.mod
去哪里?“区域”目录之间是否存在依赖关系?有很多更好的方法可以实现我认为您想要实现的目标,其中许多方法在一些相关问题中进行了概述,而且可能有几十种指南可以在短时间内通过谷歌找到。事实上,您正在使用fortran与此无关。“递归”一词可能对搜索有所帮助,如“递归生成文件”。
# This replaces the SRC_EXT suffix with .o in each filename
OBJ = $(SRC:%.$(SRC_EXT)=%.o)

$(BINARY_NAME): $(OBJ)
    ...link command...

%.o: %.$(SRC_EXT)
    ...compile command...