Fortran 为什么SCON构建的成功取决于variant_dir名称?

Fortran 为什么SCON构建的成功取决于variant_dir名称?,fortran,scons,Fortran,Scons,我对这种行为感到厌烦至死。因此,在sconstuct文件中,我们有最后一个字符串,如下所示: import compilers, os env = Environment(ENV = os.environ, TOOLS = ['default']) def set_compiler(compiler_name): env.Replace(FORTRAN = compiler_name) env.Replace(F77 = compiler_name) env.Repl

我对这种行为感到厌烦至死。因此,在sconstuct文件中,我们有最后一个字符串,如下所示:

import compilers, os

env = Environment(ENV = os.environ, TOOLS = ['default'])

def set_compiler(compiler_name):
    env.Replace(FORTRAN = compiler_name)
    env.Replace(F77 = compiler_name)
    env.Replace(F90 = compiler_name)
    env.Replace(F95 = compiler_name)

def set_flags(flags):
    env.Replace(FORTRANFLAGS = flags)
    env.Replace(F77FLAGS = flags)
    env.Replace(F90FLAGS = flags)
    env.Replace(F95FLAGS = flags)

mod_dir_prefix = {
    "gfortran": "-J ",
    "ifort": "-???",
    "pgfortran": "-module " 
}

flags = {
    ("gfortran", "debug"): "-O0 -g -Wall -Wextra -pedantic -fimplicit-none -fbounds-check -fbacktrace",
    ("gfortran", "release"): "-O3",
    ("pgfortran", "debug"): "-O0 -g -C -traceback",
    ("pgfortran",  "release"): "-O4"
}

if not GetOption('clean'):
    print "\nAvailable Fortran compilers:\n"

    for k, v in compilers.compilers_dict().iteritems():
        print "%10s : %s" % (k, v)

    compiler = raw_input("\nChoose compiler: ")

    set_compiler(compiler)

    debug_or_release = raw_input("\nDebug or release: ")

    set_flags(flags[(compiler, debug_or_release)])

    env.Replace(FORTRANMODDIRPREFIX = mod_dir_prefix[compiler])

    env.Replace(LINK = compiler)
    env.Replace(LINKCOM = "$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS")
    env.Replace(LINKFLAGS = "")

env.Replace(FORTRANMODDIR = '#Mod')
Export('env')

SConscript('Sources/SConscript', variant_dir='Build', duplicate=0)
py是我自己的模块,用于查找一些可用的Fortran编译器

在Sources文件夹中,我们有两个Fortran源文件

来源\SConscript

Import('env')
env.Program('app', Glob('*.f90'))
Scons支持Fortran,一切正常

gfortran -o Temp\kinds.o -c -O3 -JMod Sources\kinds.f90
gfortran -o Temp\math.o -c -O3 -JMod Sources\math.f90
gfortran -o Temp\sorts.o -c -O3 -JMod Sources\sorts.f90
gfortran -o Temp\utils.o -c -O3 -JMod Sources\utils.f90
gfortran -o Temp\main.o -c -O3 -JMod Sources\main.f90
gfortran -o Temp\app.exe Temp\kinds.o Temp\main.o Temp\math.o Temp\sorts.o Temp\utils.o
scons: done building targets.
重命名variant_dir name后,比如说
#Bin
#Build
我们会收到错误消息:

gfortran -o Bin\kinds.o -c -O3 -JMod Sources\kinds.f90
gfortran -o Bin\main.o -c -O3 -JMod Sources\main.f90
Sources\main.f90:3.11:

  USE sorts
           1
Fatal Error: Can't open module file 'sorts.mod' for reading at (1): No such file or directory
当然,汇编的顺序很重要。但是为什么它取决于变量的名称呢?看起来像个虫子,但也许我做错了什么

注意:此行为不依赖于
replicate
变量值。

P.P.S.在Windows和Python 2.7上使用SCons 2.0.1进行测试,在Mac OS X和Python 2.5.1上使用测试。

这是对一个旧线程的回复,但我遇到了几乎相同的问题,需要四处寻找解决方案

首先,您的构建顺序可能已关闭,因为Fortran的依赖项扫描程序无法正常工作。试着跑步

scons [your_arguments] -n --tree=all | less
它实际上不会编译任何东西,但会向您显示命令,最后会打印Scons看到的依赖关系树

一种可能的解决办法:

尝试添加行(我为上下文添加了源代码):


环境替换(FORTRANMODDIR='#Mod')
环境替换(FORTRANPATH='.']
导出('env')

据我所知,路径与SConscript文件的“虚拟”位置(即src目录或variant
build
目录)相关,这应将包含源文件的目录添加到扫描仪的搜索路径中


在我的scons版本(2.3.0)中,我不能使用
duplicate=0
参数,因为它会自动将原始源目录插入模块路径,导致命令行看起来像
-module build/-module src/
(ifort)基本上覆盖了我的偏好,即不要使源目录混乱。不过这可能是一个bug。

@kemiisto:这足以驱使你去做。@高性能标记:我和make来自不同的时代。甚至不考虑没有自动依赖性分析的构建工具。CMake太重,同时又太严格ictive对我来说不够灵活。你能显示源代码/SConscript文件吗?你是否尝试使用“Temp”或“Bin”作为变量目录?而不是“#Temp”和“#Bin”。@dantje:我尝试使用没有#符号的变量目录名称。没关系。我会编辑我的问题以包含SConscript文件。F90扫描仪显然无法检测use语句在includes()中是这样的吗?