我注意到调用Object
和Library
构建器有时会在最后使用可选参数,例如
Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')
CanObject
和all 采用任意一组Library
,SharedLibrary
还是仅限于一组特定的变量?如果是这样,我希望这应该可以节省我们当前在工作中构建的非常大的 SCons。
我注意到调用Object
和Library
构建器有时会在最后使用可选参数,例如
Object('hello.c', CCFLAGS='-DHELLO')
Object('goodbye.c', CCFLAGS='-DGOODBYE')
CanObject
和all 采用任意一组Library
,SharedLibrary
还是仅限于一组特定的变量?如果是这样,我希望这应该可以节省我们当前在工作中构建的非常大的 SCons。
C/C++ 构建器识别一组特定的参数,称为构造变量。
这些变量可以在环境中设置,也可以在调用构建器时设置,就像您在问题中所做的那样。在环境中设置它们通常更容易,从而使对构建器的调用更简单,然后只在必要时修改变量。
这是一个例子:
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'])
布雷迪所说的大部分是正确的。但是,您可以将任何(数量)Environment() 变量附加到任何构建器的末尾。这些创建了一个 OverrideEnvironment(),然后用于运行构建器。
如果您要更改 CCCOM 的值和/或任何输入命令行以运行编译器的变量,那么将这些变量添加到构建器调用也会产生一些影响。
如果您指定一个对当前构建器没有影响的变量,或者甚至是一个未在 SCons 中的任何位置定义的变量,或者您可能创建的任何构建器,SCons 都不会发出警告或错误。