【问题标题】:Library builder not triggering on modified file in SCons库构建器未触发 SCons 中的修改文件
【发布时间】:2016-03-15 13:53:45
【问题描述】:

我必须使用两步编译来构建目标。

第一步:.c -> .asm 第二步:.asm -> .o

我正在从一些 .o 文件创建一个库。

我的实现如下:

第一步:

c_to_asm_builder = SCons.Builder.Builder(action = SCons.Defaults.CAction,
                                emitter = {},
                                suffix = '.asm',
                                src_suffix = ['.c','.cpp'],
                                src_builder = '',
                                source_scanner = SCons.Tool.CScanner
                                )
env['Builders']['CTOASM'] = c_to_asm_builder

第二步:

suffixesASM = ['.asm', '.s']
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
for suffix in suffixesASM:
    static_obj.add_action(suffix, SCons.Defaults.ASAction)

然后我如下调用建设者:

   env.CTOASM(['file1.c', 'file2.c', 'file3.c'], CFLAGS = '-flag')
   env.Object(['file1.asm', 'file2.asm', 'file3.asm'], ASFLAGS = '-flag')

我正在创建一个这样的库:

env.Library('name', ['file1.o', 'file2.o'])

编译时一切正常。

问题出现在以下情况:

我更改了 file1.c 的内容。我希望 file1.c 能够通过这些步骤:

file1.c -> file1.asm -> file1.o 然后 name.a 要重新创建的库。

会发生什么:

只有 c_to_asm_builder 会被更改重新触发(file1.c -> file1.asm)。对象构建器 (file1.asm -> file1.o) 不会重新触发,库构建器和程序构建器也不会重新触发。

我不知道我错过了什么。我知道对于我在另一个项目中配置的单步编译,对象构建器和库构建器以某种方式相互了解。

如何让库和程序构建器了解对象和 CTOASM 构建器?

【问题讨论】:

    标签: scons


    【解决方案1】:

    您没有指定发射器,所以要么写一个,要么明确列出您的预期目标...

    asm = env.CTOASM(['file1.asm', 'file2.asm', 'file3.asm'], 
                     ['file1.c', 'file2.c', 'file3.c'], CFLAGS = '-flag')
    obj = env.Object(['file1.o', 'file2.o', 'file3.o'], asm, ASFLAGS = '-flag')
    lib = env.Library('name', obj)
    

    这是关于如何将发射器添加到构建器的一个很好的参考。 https://bitbucket.org/scons/scons/wiki/ToolsForFools 只需向下滚动到“使用发射器”。

    【讨论】:

    • 我试过这个,我仍然得到相同的行为。不知何故,库构建器没有链接到我的对象构建器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2014-10-03
    • 2013-09-07
    相关资源
    最近更新 更多