2015-05-27 18 views
0

我是Scons的新手,我試圖弄清楚我是否可以將它用於我的用例。我有一個腳本,其主要作用是採取一個單一的輸入,並在給定的目錄中產生多個輸出文件。然而,它也需要一個額外的輸入和一個額外的輸出,如Builder的其他特定源代碼和目標

script --special-in some.foo --special-in some.bar input.foo output.dir/ 

some.*文件的名稱可以從輸入文件名稱(這裏input.foo)來計算。由一條規則產生的文件被其他規則使用。

documentation我發現有一個可以創建自定義的建設者在

bld = Builder(action = 'foobuild $TARGETS - $SOURCES', 
       suffix = '.foo', 
       src_suffix = '.input', 
       emitter = modify_targets) 

其中emitter增加了額外的目標和源。但是,我無法找到應該如何區分主要來源/目標與特殊目標/目標,這些需要通過特定選項來通過 - 我不能像上述示例那樣使用$TARGETS$SOURCES。我大概可以使用generator和索引到sourcetarget,但這看起來有點冒失。我有更好的方法嗎?

+0

目前還不清楚你想達到什麼目的。你可以發佈一個例子(或幾個)你的Builder調用應該如何看起來像理想,以及應該由它產生的命令行嗎?在上面的例子中,我只看到了輸入文件和基本上你聲稱覆蓋的「some。*」文件。所以我想知道你的「特殊」選項在哪裏發揮作用...... – dirkbaechle

回答

1

從你所描述的,你應該同時使用一個發射器和一個發生器,就像你在問題結束時說的那樣。 「主」源/目標將成爲源/目標列表中的第一個元素。這似乎並不哈克給我,但我可能只是習慣了......

答案是從一個工作示例總是更好......

這裏是SConstruct做你的描述。我不確定你計劃如何計算some.foosome.barinput.foo,所以在這個例子中我計算input.barinput.bazinput.foo,並且只是追加output.dir到目標列表。

import os 

def my_generator(source, target, env, for_signature): 
    command = './script ' 
    command += ' '.join(['--special-in %s' % str(i) for i in source[1:]]) 
    command += ' ' 
    command += ' '.join([str(t) for t in target]) 
    return command 

def my_emitter(target, source, env): 
    source += ['%s%s' % (os.path.splitext(
     str(source[0]))[0], ext) for ext in ['.bar', '.baz']] 
    target += ['output.dir'] 
    return target, source 

bld = Builder(generator=my_generator, 
       emitter=my_emitter) 

env = Environment(BUILDERS={'Foo':bld}) 
env.Foo('output.foo', 'input.foo') 

在Linux上運行...

>> touch input.bar input.baz input.foo 

>> echo "#\!/bin/sh" > script && chmod +x script 

>> tree 
. 
├── input.bar 
├── input.baz 
├── input.foo 
├── SConstruct 
└── script 

0 directories, 5 files 

>> scons --version 
SCons by Steven Knight et al.: 
    script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu 
    engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu 
    engine path: ['/usr/lib/scons/SCons'] 
Copyright (c) 2001 - 2014 The SCons Foundation 

>> scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
./script --special-in input.bar --special-in input.baz output.foo output.dir 
scons: done building targets. 

全部依賴/目標將保持不變,如果你需要從一個建設者這樣喂輸出到另一個。

如果這不能回答你的問題,請說明你想要做的更多。

相關問題