gpt4 book ai didi

python - 配置 SCons 以使用单独的工具进行代码生成和汇编

转载 作者:太空狗 更新时间:2023-10-30 01:23:55 24 4
gpt4 key购买 nike

我正在尝试使用 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})

然后我在我的源文件上使用这个 Builder 并将生成的 NodeList 传递给 Program

for file in Glob('*.c'):
sources += env.CodeGenerator(file)

env.Program('say_hello', sources)

当我不修改任何变量时,这很有效。我使用 gcc 获得了一个可执行文件。

但是,当我尝试替换适当的变量以便 SCons 使用自定义工具链(使用 env.Replace(CC='clang')...)时,只会生成一个程序集文件.我的自定义 Builder 未在任何其他文件上调用,并且 SCons 尝试仅与一个目标文件链接(这显然失败了)

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

最佳答案

在 SCons man page 中记录了 Builder 类的大量关键字参数, 用户手册中没有提及。这是 SCons 文档中的弱点之一,并且已经存在了一段时间。

在这种情况下,我相信您正在寻找 single_source 关键字参数,它:

Specifies that this builder expects exactly one source file per call. Giving more than one source file without target files results in implicitely calling the builder multiple times (once for each source given).

查看 Builder single_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)

对于包含以下文件的目录: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.

关于python - 配置 SCons 以使用单独的工具进行代码生成和汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8253443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com