如何为自定义编译器编写waf文件?

时间:2012-02-25 16:38:35

标签: build build-automation waf calibre

我厌倦了在make中查找魔术符号并决定尝试waf

我正在尝试使用calib来制作电子书,我想创建一个接收文件的wscript,运行包含该文件的一些参数的程序,并生成输出。只有在输入文件比输出文件更新时才应构建Waf。

在make中,我会写一个这样的makefile:

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

其中%是文件基名的魔术符号,$是输出文件名的符号(basename.epub)。

我可以致电make soverflow.epub,它会在soverflow.recipe上运行电子书转换。如果.recipe自上次构建以来没有改变,它就不会做任何事情。

我怎样才能在waf中做类似的事情?

(为什么选择waf?因为它使用了我已经知道的真实语言。如果在scons中使用它真的很容易,那也是一个很好的答案。)

2 个答案:

答案 0 :(得分:3)

我想出了如何创建一个基本的wscript文件,但我不知道如何构建命令行中指定的目标。


Waf Book有一节Task generatorsName 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的干净步骤。

答案 1 :(得分:-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进行清理。