Как мне написать waf-файл для собственного компилятора? - PullRequest
1 голос
/ 25 февраля 2012

Мне надоело искать магические символы в make и я решил попробовать waf .

Я пытаюсь использовать калибр для создания электронных книг, и я хотел бы создать wscript, который принимает файл, запускает программу с некоторыми аргументами, которые включают этот файл, и производит вывод. Waf следует собирать только в том случае, если входной файл новее выходного.

В make я написал бы make-файл так:

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

Где% - магический символ для базового имени файла и $ символ для выходного имени файла (basename.epub).

Я мог бы позвонить make soverflow.epub, и он запустил бы ebook-convert на soverflow.recipe. Если .recipe не изменился со времени последней сборки, он ничего бы не сделал.

Как мне сделать что-то похожее в waf?

(Почему waf? Потому что он использует настоящий язык, который я уже знаю. Если это действительно легко использовать в scons, это тоже хороший ответ.)

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

Я понял, как создать простой файл wscript, но я не знаю, как создавать цели, указанные в командной строке.


В Waf Book есть раздел на Генераторы задач .В разделе Обработка файлов на основе имен и расширений *1007* приведен пример для 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.

0 голосов
/ 25 февраля 2012

Я немного разочаровался в waf и обнаружил, что это довольно легко сделать в scons В документации есть раздел Написание собственных строителей .

# 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')) до конца, чтобы построить его, когда нет аргументов.

В отличие от ваф, он не обеспечивает чистого шага. Вместо этого вы можете очистить с помощью scons -c.

...