2010-10-12 37 views
3

我對這種行爲感到厭倦。因此,在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。

+1

@ kemiisto:這足以驅使你做出。 – 2010-10-12 19:33:54

+2

@高性能標誌:我和品牌來自不同的時代。沒有自動依賴分析的構建工具甚至沒有考慮到。 CMake太重了,同時又太嚴格了,對我來說也不夠靈活。 – Wildcat 2010-10-12 20:09:52

+0

你可以顯示Sources/SConscript文件嗎?您是否嘗試過使用「Temp」或「Bin」作爲變體的Dirs?而不是'#Temp'和'#Bin'。 – dantje 2010-10-19 16:27:19

回答

1

這是對一箇舊線程的回覆,但我有幾乎相同的問題,需要挖掘解決方案。

首先,您的構建順序可能已關閉,因爲用於Fortran的依賴關係掃描程序無法正常工作。嘗試運行

scons [your_arguments] -n --tree=all | less 

,不會實際編譯任何東西,但給你的命令,最後將打印的依賴關係樹爲使用SCons看到它。

一種可能的解決方案:

嘗試添加線(I加入您的來源爲上下文):

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

據我明白,路徑是相對於的「虛擬」位置SConscript文件(即src目錄或變體build目錄),這應該將包含源文件的目錄添加到掃描程序的搜索路徑。

在我的版本scons的(2.3.0),我不能使用duplicate=0說法,因爲它會自動將原始源目錄複製到模塊路徑,從而導致命令行看起來像-module build/ -module src/(ifort)和基本覆蓋我的不要混淆源目錄。不過,這可能是一個錯誤。

相關問題