【问题标题】:How to compile in two steps using SCons?如何使用 SCons 分两步编译?
【发布时间】:2016-02-01 11:59:02
【问题描述】:

我想使用 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

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

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

【问题讨论】:

  • 请提供更多信息,了解您到目前为止所做的具体尝试。您的 Builders 看起来如何,您如何初始化和调用它们?您收到的错误消息究竟是什么,或者您目前正在处理哪个细节问题? (例如:您的文件是否已构建,但依赖项不正确,以至于“干净”运行会留下文件?)

标签: c scons


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2016-03-23
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多