我對這種行爲感到厭倦。因此,在SConstruct文件中,我們有最後一個字符串像這樣的:爲什麼SCons的成功取決於variant_dir的名字?
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 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
當然編制事項的順序:
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
我們得到錯誤信息後。但爲什麼它取決於variant_dir名稱?看起來像一個錯誤,但也許我做錯了什麼。
P.S.此行爲不取決於duplicate
變量值。
P.P.S.在Windows上用Python 2.7和Mac OS X用Python 2.5.1測試SCons 2.0.1。
@ kemiisto:這足以驅使你做出。 – 2010-10-12 19:33:54
@高性能標誌:我和品牌來自不同的時代。沒有自動依賴分析的構建工具甚至沒有考慮到。 CMake太重了,同時又太嚴格了,對我來說也不夠靈活。 – Wildcat 2010-10-12 20:09:52
你可以顯示Sources/SConscript文件嗎?您是否嘗試過使用「Temp」或「Bin」作爲變體的Dirs?而不是'#Temp'和'#Bin'。 – dantje 2010-10-19 16:27:19