Scons检查编译器选项

时间:2014-04-24 09:26:06

标签: scons compiler-flags

我想在Scons中检查我的编译器是否支持某些选项(例如 -fcilkplus)。我设法做到的唯一方法是以下顺序 操作:

env.Prepend(CXXFLAGS = ['-fcilkplus'], LIBS = ['cilkrts'])

然后我启动自定义检查器:

def CheckCilkPlusCompiler(context):
    test = """
    #include <cilk/cilk.h>
    #include <assert.h>
    int fib(int n) {
      if (n < 2) return n;
      int a = cilk_spawn fib(n-1);
      int b = fib(n-2);
      cilk_sync;
      return a + b;
    }
    int main() {
      int result = fib(30);
      assert(result == 832040);
      return 0;
    }
    """
    context.Message('Checking Cilk++ compiler ... ')
    result = context.TryRun(test, '.cpp')
    context.Result(result[0])
    return result[0]

现在如果它失败了,我必须删除两个选项额外标志-fcilkplus 来自环境变量的cilkrts。有没有更好的方法呢?

问题在于我无法从上下文中访问env 因此,我无法克隆它。

1 个答案:

答案 0 :(得分:0)

您可以按如下方式使用check the availability of a library with SCons

env = Environment()
conf = Configure(env)
if not conf.CheckLib('cilkrts'):
    print 'Did not find libcilkrts.a, exiting!'
    Exit(1)
else:
    env.Prepend(CXXFLAGS = ['-fcilkplus'], LIBS = ['cilkrts'])

env = conf.Finish()

你也可以check the availability of a header如下:

env = Environment()
conf = Configure(env)
if conf.CheckCHeader('cilk/cilk.h'):
    env.Prepend(CXXFLAGS = ['-fcilkplus'], LIBS = ['cilkrts'])
env = conf.Finish()

更新

我刚刚意识到,您可以按如下方式访问Configure对象上的环境:

conf.env.Append(...)