今天我面临着奇怪的SCons行为。
我的问题如下(如果有更好的解决方法,我对SCons很新): 我的SCons脚本正在构建.cu cuda文件和.cpp c ++文件。对于c ++文件,我需要-std = c ++ 0x标志,因为我们正在做c ++ 11,但是nvcc并不喜欢那个标志。
所以我需要做的是在编译C ++文件时添加临时标志,并在编译cuda文件时删除它。
我试过这样的事情:
def defaultLibConstructObjs(self,targetName,env,avoided=[]):
constructedObjects=[]
oldcppflags=env["CPPFLAGS"]
print(env["CPPFLAGS"])
for ext in ["cu","c","cpp"]:
if ext == "cu":
prefix = ext
else:
prefix = ""
if ext == "cpp":
env["CPPFLAGS"]+=env["CPPONLYFLAGS"]
constructedObjects.append(self.constructObjs(targetName,env,ext,prefix,avoided))
env["CPPFLAGS"]=oldcppflags
return constructedObjects
所以我希望env["CPPFLAGS"]
在每个循环回合时都保持不变,但每次我的cpponlyflags
(在这种情况下为-std=c++0x
)都会被添加,所以我最终会得到一个列出我调用defaultLibConstructObjs -std=c++0x
的次数。
答案 0 :(得分:2)
这看起来有点像你不仅是SCons的新手,也是Python的新手。 ;)用
oldcppflags=env["CPPFLAGS"]
您在变量中存储了对环境的“引用”,但不创建其内容的完整副本。这就是为什么你的环境无论如何都要改变......
关于您的实际问题:在您的顶级SConstruct中设置两个环境的SConsish方式越多:
cuda_env = Environment(...) # default, without the offending flags
std_env = cuda_env.Clone() # create a copy
std_env.Append(CPPFLAGS=['-std=c++0x'])
然后你可以将它们传递给你的子文件夹SConscripts(参见导出/导入方法)并使用
cuda_env.Program('foo', Glob('*.cu'))
,或者
std_env.Library('bar', Glob('*.cpp'))
就像你需要它一样。注意,即使在同一个SConscript中,如何自由混合哪些文件由哪个环境创建!例如,与autotools一样,构建环境没有强加文件夹的边界。 祝你的项目顺利,如果你有进一步的问题,可以考虑转到scons-users@scons.org上的SCons用户邮件列表。