如何使用SCons分两步编译?

How to compile in two steps using SCons?

我想使用 SCons 按照以下步骤编译文件:

.c -> .asm(汇编文件) -> .o

我试图为此定义不同的构建器。

我设法做了类似的事情:.asm -> .o 和 .c -> .o

我不知道如何让 SCons 识别从 .c 文件生成的 .asm 文件,然后使用对象生成器。

是否有可能为此使用当前的 SCons 实现?

编辑: 这是我试过的:

-> 定义两个构建器:构建器 1 (c_to_asm) 旨在执行 .c -> .asm 步骤 Builder 2 (asm_to_o) 旨在执行 .asm -> .o 。在为我的 SConscript 中定义的所有文件执行这两个构建器之后,我希望程序构建器创建最终的可执行文件。

SCons.Tool.createProgBuilder(env)

c_to_asm = SCons.Builder.Builder(action = {},
                                 emitter = {}, 
                                 prefix = '', 
                                 suffix = '.asm',
                                 src_builder = '',
                                 source_scanner = '',
                                 single_source = 1)
c_to_asm_action = SCons.Action.Action('c to asm command line', 'Executing .c to .asm builder')

c_to_asm.add_action('.c', c_to_asm_action)


asm_to_o = SCons.Builder.Builder(action = {},
                                 emitter = {},
                                 prefix = '',
                                 suffix = '.o',
                                 src_builder = ['CTOASM'],
                                 source_scanner = '',
                                 single_source = 1)

asm_to_o_action = SCons.Action.Action('asm to o command line', 'Executing .asm to .o builder...')
asm_to_o.add_action('.asm', asm_to_o_action)





env['BUILDERS']['CTOASM'] = c_to_asm
env['BUILDERS']['Object'] = asm_to_o

我看到了每个构建器的执行字符串,但没有执行任何命令。

我不知道如何确定这些构建器执行操作的顺序以及如何触发这些构建器。

你的方法有点复杂。从我的头顶我会尝试这样的事情(未经测试,但希望能给你一个继续的方向):

import SCons.Action
import SCons.Builder
# Automatically inits "nasm" Tool, if it is in the $PATH
env = Environment()

c_to_asm_action = SCons.Action.Action('c to asm command line', 'Executing .c to .asm builder')
c_to_asm = SCons.Builder.Builder(action = c_to_asm_action,
                                 suffix = '.asm',
                                 single_source = 1)

env['BUILDERS']['CTOASM'] = c_to_asm

# Creates first.asm and second.asm
env.CTOASM(['first.c', 'second.c'])
# Compiles final program, finds the newly created ASM files via Glob
env.Program('foo', Glob('*.asm') + list_of_your_other_sources_and_libs)