【问题标题】:How to write `make` file for separate source and build directory for large program with mixed Fortran F77 and F90 code如何为具有混合 Fortran F77 和 F90 代码的大型程序编写单独的源代码和构建目录的“make”文件
【发布时间】:2014-03-31 16:33:39
【问题描述】:

我有大约 39 个 Fortran F90 源文件和 35 个 Fortran 77 Lapack 相关文件。我在我的主程序中使用 include 语句来连接所有这些文件。

我使用命令ifort "MDL HydroD.F90" 创建了一个批处理文件make.bat,它编译我的代码并生成mdlhydrod.exe 文件。在此过程中,Fortran 编译器创建了许多 .mod.obj 构建文件,这使得管理变得困难。我想将我的源文件放在Source 目录下,将lapack 库文件放在lapack 目录下,并在Debug 目录下构建文件。

谁能帮我修改我的make.bat文件,让ifort查看Source目录并在Debug目录中构建。

感谢您的帮助。

目前使用make.bat只有一行命令:

File Name: make.bat

ifort  "MDL HydroD.F90"

处理与nmake 一起使用的make 文件(不完整):

File Name: make.mak:

#Make File for MDL HydroD
# Compiler options
FC          :=  ifort
VPATH       :=  src
BINDIR      :=  bin

$(BINDIR):
    mkdir -p $(BINDIR)

clean:
@rm -rf $(BINDIR)

【问题讨论】:

  • 在这个过程中你真的使用了make工具还是你的脚本只是调用了make.bat?
  • 这只是我的文件make.bat。编译时间不会太长,所以一个简单的批处理文件就足够了。
  • 我也在尝试编写一个简单的makefile.mak,它可以与nmake 命令行工具一起使用。但我对此很陌生,还找不到任何适用于 Windows 操作系统的好的教程。如果您能引导我走向正确的道路,那将会很有帮助。
  • 如果您不显示脚本,您如何需要帮助?
  • 显示脚本可能是一个好的开始(特别是如果它涉及的不仅仅是简单的ifort 命令)。如果问题是如何告诉ifort 在哪里可以找到源代码和库,那么这听起来就像ifort 文档或帮助输出应该能够告诉你的那样。

标签: batch-file fortran fortran90 fortran77 intel-fortran


【解决方案1】:

因为您使用了一种奇怪的方式来处理源文件,正如您在 other question 中所展示的那样,所以很难改变这一点。

为了概括,您可以使用 include 语句将所有内容包含在单个源文件中。这对我来说看起来很不幸,我在那里发表了评论。如果你有一个源文件,你必须用一个命令来构建它,没有任何精细控制的地方。这不是 bash 或 bat 脚本与 Makefile 的问题。

如果您不需要对此进行更精细的控制,您可能仍然可以将一些文件included 保留在逻辑上相似的某些组中,但我认为没有太多理由。

删除包含或至少相关的。然后你就可以做

ifort Source/the_source_file1 -c Output/name_of_obj1 -module the_directory_for_modules -I the_directory_for_modules  -other_flags

对于每个文件。然后最后:

ifort Output/name_of_obj1 Output/name_of_obj2 Output/name_of_obj3 .... -o the_result

在 Scons(我会使用)中,它会是这样的(在几个虚拟文件上测试)。文件Sconstruct

import os

env = Environment(tools=['default','ifort'])

env.Append(ENV = {'PATH' : os.environ['PATH']})
try:
  env.Append(ENV = {'LIBRARY_PATH' : os.environ['LIBRARY_PATH']})
except:
  pass

env.Append(F90FLAGS='-g -fast') #whatever flags you need
env.Append(FORTRANFLAGS='-g -fast') #whatever flags you need

outdir = "Output/"

srcdir = "Sources/"

lapackdir = "lapack/"


objs = []
for file in os.listdir(srcdir):
  objs += env.Object(target=outdir+os.path.splitext(file)[0], source=srcdir+file)

for file in os.listdir(lapackdir):
  objs += env.Object(target=outdir+os.path.splitext(file)[0], source=lapackdir+file)

env.Append(FORTRANMODDIR = outdir)

objs = filter(lambda o: str(o)[-4:] != '.mod', objs)

prg = env.Program(target="bin/result.exe", source= objs)

Default(prg)

【讨论】:

  • 感谢@vladimir-f 在我的两个帖子中的回复。根据您的回复,我知道我应该以适当的顺序为每个 Fortran 代码编写 ifort 命令以创建 Object 文件,然后将它们链接到创建 .exe 文件。我想知道是否可以制作像this 这样的make 文件,它会自动搜索src 目录中的所有源文件,还是因为代码之间存在依赖顺序而无法实现?
  • 使用 Fortran 模块,您必须注意正确的顺序和依赖性。这不是make 擅长自动做的事情。我个人不再将 make 用于 Fortran,因为 stackoverflow.com/questions/tagged/scons 好多了。
  • 感谢您向我介绍 SCons。稍后我将在我的代码中学习并实现它。出于即时目的,我认为您在批处理文件中编写多个 ifort 命令的想法会起作用。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 2012-02-29
  • 2015-08-14
  • 2016-05-15
  • 2013-02-14
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多