Python 配置SCON以使用单独的工具生成和组装代码
我正在尝试使用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
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上对我有用。