2012-02-25 99 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进行清洁。