我厌倦了这种行为。所以在 SConstruct 文件中,我们有最后一个字符串,如下所示:
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编译器。
在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名称重命名为#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
当然编译的顺序很重要。但为什么它取决于variant_dir名称?看起来像一个错误,但也许我做错了。
P.S。此行为不依赖于duplicate
变量值
P.P.S.在Windows上使用带有Python 2.7的SCons 2.0.1和带有Python 2.5.1的Mac OS X进行测试。
答案 0 :(得分:1)
这是对旧帖子的回复,但我遇到了同样的问题,需要深入寻找解决方案。
首先,您的构建顺序可能已关闭,因为Fortran的依赖项扫描程序无法正常工作。尝试运行
scons [your_arguments] -n --tree=all | less
它实际上不会编译任何东西,只会向你显示命令,最后会按照Scons看到的那样打印依赖树。
可能的解决方案:
尝试添加该行(我为上下文添加了您的源代码):
env.Replace(FORTRANMODDIR = '#Mod')
env.Replace(FORTRANPATH = '.' ]
Export('env')
据我了解,路径是相对于"虚拟" SConscript文件的位置(即src目录或变种build
目录),这应该将包含源文件的目录添加到扫描程序的搜索路径。
在我的scons版本(2.3.0)中,我无法使用duplicate=0
参数,因为它会自动将原始源目录插入模块路径,导致命令行看起来像-module build/ -module src/
(ifort)并且基本上覆盖了我的偏好,不会使源目录混乱。但这可能是一个错误。