【问题标题】:Makefile to compile Fortran source files in different directoriesMakefile 编译不同目录下的 Fortran 源文件
【发布时间】:2012-11-26 21:39:00
【问题描述】:

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

这是所需的项目结构(类似于 Java 的深度嵌套树会更好)

dir1/src/*.f95
dir1/make/Makefile_lib1.any
dir1/make/Makefile_lib1.win
dir1/make/Makefile_lib1.unix

dir2/src/*.f
dir2/make/Makefile_lib2.any
dir2/make/Makefile_lib2.win
dir2/make/Makefile_lib2.unix

...

dir_main/src/*.f or *.f95
dir_main/make/Makefile_main.any
dir_main/make/Makefile_main.win
dir_main/make/Makefile_main.unix

我想调用make Makefile_main.unix,它会设置任何特定于 Unix 的变量,然后包括 Makefile_main.anyMakefile_lib1.any、...

(类似于在 Windows 上制作)

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

SRCS  := $(wildcard $(SRC_DIR)/*.$(SRC_EXT))

现在我正在努力解决如何使所有依赖项在 Fortran 95 中每个源生成 *.o*.mod

有没有办法在编译时在目录之间切换,以便所有目标/依赖项的名称中都没有 dir-path?请注意,我是从 Eclipse 项目所在的其他服务目录调用make。有什么建议如何进行吗?

我真的不想做只有一个目录的通常 Fortran 风格 所有的乱七八糟的代码。

【问题讨论】:

  • 如果您有dir2/src/foo.f,您希望foo.ofoo.mod 去哪里? “区域”目录之间是否存在依赖关系?
  • 有很多更好的方法来做我认为你想做的事情,其中​​许多在一些相关问题中进行了概述,并且可能有几十个指南可用,只需很短的谷歌。您使用 fortran 的事实是无关紧要的。一个可能有助于您搜索的词是“recursive”,如“recursive makefiles”。

标签: makefile fortran dependency-management directory


【解决方案1】:

您可以采取两种主要策略。

您可以在每个子目录中放置一个 makefile 并让它支持 allclean 等目标,然后使用顶级 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...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多