2016-03-15 20 views
2

我必須使用兩步編譯來編譯目標。圖書館編譯器不能在SCons中的修改文件上觸發

第一步:.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構建器?

回答

0

你沒有指定一個發射器,所以無論是寫一個,或者明確地列出你的預期目標......

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 只需向下滾動到「使用發射器」。

+0

我試過這個,我仍然得到相同的行爲。不知何故庫構建器不鏈接到我的對象構建器。 –

+0

你可以發佈一個最簡單的工作示例嗎? –