Buz*_*zzy 5 python code-generation build clang scons
我正在尝试使用SCons准备构建系统.我想clang用于代码生成阶段和其他所有的自定义编译器工具链.
默认情况下,SCons配置没有显式(.s)生成程序集文件的步骤.
为了解决这个问题,我创建了自己的Builder汇编文件.
code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s')
env.Append(BUILDERS = {'CodeGenerator':code_generator})
Run Code Online (Sandbox Code Playgroud)
然后Builder我在我的源文件上使用它并将结果传递NodeList给Program.
for file in Glob('*.c'):
sources += env.CodeGenerator(file)
env.Program('say_hello', sources)
Run Code Online (Sandbox Code Playgroud)
当我不修改任何变量时,这很有效.我用了一个可执行文件gcc.
但是,当我尝试替换适当的变量以便SCons使用自定义工具链(使用env.Replace(CC='clang')...)时,只生成一个程序集文件.我的自定义Builder不会在任何其他文件上调用,SCons尝试仅链接一个目标文件(显然会失败)
BuilderSCons手册页上记录了该类的大量关键字参数,但用户手册中未提及。这是 SCons 文档中的弱点之一,并且已经存在了一段时间。
在这种情况下,我相信您正在寻找single_source关键字参数:
指定此构建器每次调用只需要一个源文件。提供多个没有目标文件的源文件会导致隐式调用构建器多次(每个给定的源一次)。
查看Buildersingle_source 的源需要评估为 True (或等效值)。所以你的代码可以通过一个非常小的修改来重写。
env = Environment()
code_generator = Builder(action = '$CC $CCFLAGS -S $SOURCE -o $TARGET',
single_source = 1,
suffix = '.s')
env.Replace(CC= 'clang')
env.Append(BUILDERS = {'CodeGenerator' : code_generator})
sources = env.CodeGenerator(file)
env.Program('say_hello', sources)
Run Code Online (Sandbox Code Playgroud)
对于包含以下文件的目录: foo.c 和 bar.c 会产生输出:
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
clang -S bar.c -o bar.s
as -o bar.o bar.s
clang -S foo.c -o foo.s
as -o foo.o foo.s
clang -o say_hello bar.o foo.o
scons: done building targets.
Run Code Online (Sandbox Code Playgroud)