首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SCons构建的成功取决于variant_dir名称?

为什么SCons构建的成功取决于variant_dir名称?
EN

Stack Overflow用户
提问于 2010-10-12 11:07:03
回答 1查看 1.2K关注 0票数 3

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

代码语言:javascript
复制
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)

compilers.py是我自己的模块,可以找到一些可用的Fortran编译器。

在“源”文件夹中,我们有两个Fortran源文件。

Sources\SConscript

代码语言:javascript
复制
Import('env')
env.Program('app', Glob('*.f90'))

Scon支持Fortran,一切都很好。

代码语言:javascript
复制
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名称重命名为#Bin#Build后,将得到错误消息:

代码语言:javascript
复制
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

当然,汇编的顺序很重要。但是为什么它依赖于variant_dir的名字呢?好像是个虫子,但也许我做错了什么。

这种行为不依赖于duplicate变量值。

P.P.S.在WindowsPython2.7上用SCons 2.0.1进行测试,用Python2.5.1测试Mac。

EN

回答 1

Stack Overflow用户

发布于 2014-03-27 14:22:34

这是对一个旧线程的答复,但我实际上也遇到了同样的问题,需要仔细研究以找到解决方案。

首先,您的构建顺序可能是关闭的,因为Fortran的依赖项扫描器不能正常工作。试着跑

代码语言:javascript
复制
scons [your_arguments] -n --tree=all | less

它实际上不会编译任何东西,只会显示命令,最后会打印依赖树,就像Scon看到的那样。

一种可能的解决办法:

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

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

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

在我的scon版本(2.3.0)中,我不能使用duplicate=0参数,因为它会自动将原始源目录插入到模块路径中,从而使命令行看起来像-module build/ -module src/ (ifort),并且本质上重写了我的首选项,使源目录不混乱。不过,这可能是个窃听器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3913976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档