配置SCons以使用单独的工具进行代码生成和组装

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我在我的源文件上使用它并将结果传递NodeListProgram.

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尝试仅链接一个目标文件(显然会失败)

  1. 如何让SCons在所有文件上运行构建器并包含那些用于链接的目标文件?
  2. 有没有更好的方法来完成我想要做的事情?我刚刚开始使用SCons.

And*_*ker 3

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)