Python 配置SCON以使用单独的工具生成和组装代码

Python 配置SCON以使用单独的工具生成和组装代码,python,build,code-generation,clang,scons,Python,Build,Code Generation,Clang,Scons,我正在尝试使用SCON准备一个构建系统。我想在代码生成阶段使用clang,在其他方面使用自定义编译器工具链 默认情况下,SCons配置没有生成程序集(.s)文件的显式步骤 为了解决这个问题,我创建了自己的Builder,它会发出程序集文件 code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s') env.Append(BUILDERS = {'CodeGenerato

我正在尝试使用SCON准备一个构建系统。我想在代码生成阶段使用
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
传递给
程序

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

env.Program('say_hello', sources) 
当我不修改任何变量时,这很有效。我使用
gcc
获得一个可执行文件

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

  • 如何使SCON在所有文件上运行生成器并包括这些文件 用于链接的对象文件
  • 有没有更好的方法来完成我的任务 我想做什么?我刚开始和斯科恩合作

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

    在本例中,我相信您正在寻找
    单源
    关键字参数,该参数:

    指定此生成器每次调用只需要一个源文件。 提供多个源文件而不提供目标文件会导致 隐式调用生成器多次(每个源一次) 给定)

    查看
    Builder
    single\u源代码的源代码时,需要计算为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.
    

    即使在建议的修复之后,我仍然面临同样的问题。但是感谢您对手册页中额外文档的评论。你是对的,我只是指用户指南。我将进一步调查并报告是否成功。您使用的是哪个版本的SCON?使用Mac上的自制软件安装:script:v2.1.0.r5357 engine:v2.1.0.r5357我放弃了试图找出为什么构建器没有在所有文件上运行。为了解决这个问题,我创建了另一个单一源代码生成器来构建对象文件,而不是使用程序生成器。不是最理想的解决方案,但目前效果良好。谢谢我试图让大家更清楚地了解一下我从scons看到的输出是什么,但它在自制的scons版本和较旧版本的clang上对我有用。