我期待編寫自定義SCons的生成器,一個自定義生成器:編寫執行外部命令和Python功能
- 執行一個外部命令產生
foo.temp
- 然後執行一個Python函數操作
foo.temp
並生成最終的輸出文件
我已經提到了以下兩節,但我不確定將它們「粘合」在一起的正確方法。
我知道Command
接受的採取的措施清單。但我該如何正確處理該中間文件?理想情況下,中間文件對用戶是不可見的 - 整個Builder似乎都是以原子方式運行的。
這是我想出來的,似乎工作。但是.bin
文件未被自動刪除。
from SCons.Action import Action
from SCons.Util import is_List
from SCons.Script import Delete
_objcopy_builder = Builder(
action = 'objcopy -O binary $SOURCE $TARGET',
suffix = '.bin',
single_source = 1
)
def _add_header(target, source, env):
source = str(source[0])
target = str(target[0])
with open(source, 'rb') as src:
with open(target, 'wn') as tgt:
tgt.write('MODULE\x00\x00')
tgt.write(src.read())
return 0
_addheader_builder = Builder(
action = _add_header,
single_source = 1
)
def Elf2Mod(env, target, source, *args, **kw):
def check_one(x, what):
if not is_List(x):
x = [x]
if len(x) != 1:
raise StopError('Only one {0} allowed'.format(what))
return x
target = check_one(target, 'target')
source = check_one(source, 'source')
# objcopy a binary file
binfile = _objcopy_builder.__call__(env, source=source, **kw)
# write the module header
_addheader_builder.__call__(env, target=target, source=binfile, **kw)
# delete the intermediate binary file
# TODO: Not working
Delete(binfile)
return target
def generate(env):
"""Add Builders and construction variables to the Environment."""
env.AddMethod(Elf2Mod, 'Elf2Mod')
print 'Added Elf2Mod to env {0}'.format(env)
def exists(env):
return True
感謝您的輸入。我已經寫了一個似乎在工作的僞造者(看我的編輯)。但我不確定這是否正確。在生成不同的頭文件時也需要原始的ELF文件。 –
我意識到更簡單的解決方案可能是放寬「不可見的中間文件」要求,並且只生成一個.bin作爲構建的一部分。然後使用.elf和.bin生成自定義模塊。 –
或者,由於操作邏輯上.elf - > .module,應該使用發射器來指示.bin文件是副作用嗎? –