【问题标题】:Optional Environment Arguments to SCons BuildersSCons 构建器的可选环境参数
【发布时间】:2014-04-22 19:41:17
【问题描述】:

我注意到对 ObjectLibrary 构建器的调用有时会在末尾使用可选参数,例如

Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')

ObjectLibrarySharedLibrary 可以全部采用任意一组,还是仅限于一组特定的变量?如果是这样,我希望这应该可以节省我们当前在工作中构建的非常大的 SCons。

【问题讨论】:

    标签: environment-variables builder scons build-tools


    【解决方案1】:

    C/C++ 构建器识别一组特定的参数,称为Construction Variables

    这些变量可以在环境中设置,也可以在调用构建器时设置,就像您在问题中所做的那样。在环境中设置它们通常更容易,从而使对构建器的调用更简单,然后只在必要时修改变量。

    这是一个例子:

    env = Environment()
    
    # Notice that CPPPATH, CPPDEFINES, LIBS, and LIBPATH dont include the
    # compiler flags -I, -D, -l, and -L respectively, SCons will add those
    # in a platform independent manner
    env.Append(CCFLAGS=['-g', '-O2'])
    env.Append(CPPPATH=['some/include/path'])
    env.Append(CPPDEFINES=['YOUR_DEFINE'])
    env.Append(LIBS=['pthread'])
    env.Append(LIBPATH=['some/lib/path'])
    
    # All of these builder calls use the construction  
    # variables set on the environment above
    env.Object('hello.c')
    env.Object('goodbye.c')
    env.Program('main.cc')
    

    如果要覆盖特定变量,可以执行以下操作

    env.Object('hello.c', CPPDEFINES='HELLO')
    

    或者,如果您想附加到特定变量,只需一次调用,您可以执行以下操作:

    env.Object('hello.c', CPPDEFINES=[env['CPPDEFINES'], 'HELLO'])
    

    【讨论】:

      【解决方案2】:

      Brady 所说的大部分是正确的。 但是,您可以将任何(数量)Environment() 变量附加到任何构建器的末尾。这些创建了一个 OverrideEnvironment(),然后用于运行构建器。

      如果您要更改 CCCOM 的值和/或任何输入命令行以运行编译器的变量,那么将这些变量添加到构建器调用也会产生一些影响。

      如果您指定一个对当前构建器没有影响的变量,甚至是一个未在 SCons 中的任何位置定义的变量,或者您可能已创建 SCons 的任何构建器,都不会发出警告或错误。

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多