2012-02-25 74 views
1

我厭倦了查找製作中的魔法符號,並決定嘗試waf如何爲自定義編譯器編寫waf文件?

我正在嘗試使用口徑來製作電子書,我想創建一個wscript,它接受一個文件,使用包含該文件的一些參數運行程序,並生成一個輸出。如果輸入文件比輸出新,Waf應該只能建立。

在化妝,我會寫一個makefile是這樣的:

%.epub: %.recipe 
    ebook-convert $ .epub --test -vv --debug-pipeline debug 

其中,%是文件的基本名稱和$一個符號輸出文件名(basename.epub)魔法符號。

我可以打電話make soverflow.epub它會在soverflow.recipe上運行電子書轉換。如果自上一次構建以來.recipe沒有發生變化,它就不會執行任何操作。

我如何在waf中做類似的事情?

(爲什麼WAF?因爲它使用的是我已經知道一個真正的語言。如果這是真的很容易在scons的使用,這是一個很好的答案了。)

回答

3

我想出瞭如何製作一個基本的wscript文件,但我不知道如何構建在命令行上指定的目標。


The Waf Book有關於Task generators的章節。所述Name and extension-based file processing節給出了LUA一個例子,我適於:

from waflib import TaskGen 
TaskGen.declare_chain(
     rule   = 'ebook-convert ${SRC} .epub --test -vv --debug-pipeline debug', 
     ext_in  = '.recipe', 
     ext_out  = '.epub' 
) 

top = '.' 
out = 'build' 

def configure(conf): 
     pass 

def build(bld): 
    bld(source='soverflow.recipe') 

它甚至自動提供一個乾淨的步驟,該步驟去除的epub。

-2

我放棄了WAF了一下,發現這在scons中很容易做到。該文檔有關於Writing Your Own Builders的部分。

# Setup the custom builder 
def add_book_builder(env): 
    rule = 'ebook-convert $SOURCE .epub --test -vv --debug-pipeline debug' 
    bld = Builder(action = rule, 
        suffix = '.epub', 
        src_suffix = '.recipe') 
    env.Append(BUILDERS = {'Book' : bld}) 

env = Environment() 
add_book_builder(env) 

# Define the epubs that can be built 
for target in Glob('*.recipe'): 
    env.Book(target) 

運行scons soverflow.epub構建EPUB。如果沒有參數,我可以將Default(env.Book('soverflow.recipe'))添加到最後以構建它。

與waf不同,它不提供乾淨的步驟。相反,您可以使用scons -c進行清潔。

相關問題