如何使用混合的Fortran F77和F90代码为大型程序的单独源和构建目录编写`make`文件

时间:2014-03-31 16:33:39

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

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

我创建了一个带有命令make.bat的批处理文件ifort "MDL HydroD.F90",它编译了我的代码并生成了mdlhydrod.exe文件。在此过程中,Fortran编译器会创建许多.mod.obj构建文件,这使得难以管理。我想将源文件放在目录Source下,并将库文件放在目录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)

1 个答案:

答案 0 :(得分: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)