使用SCons从数组追加/删除的奇怪行为

时间:2014-09-19 08:19:57

标签: python scons

今天我面临着奇怪的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的次数。

1 个答案:

答案 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用户邮件列表。