21 нояб. 2009 г.

genmakefile

Когда я писал luabins, я довольно долго возился с системой сборки проекта.

По умолчанию luabins собирается как C89. Однако, со сборкой в тестовом режиме (make test) не всё так просто.

Хорошим тоном считается, когда луашный модуль написан, как и сам Луа, на "clean ANSI C" — подмножестве C89, C98 и C++.

Luabins следует этим гайдлайнам, и, значит, должен собираться под все три таргета. Под все три таргета должны запускаться и тесты. Есть желание не запускать тесты если они уже прошли и код с тех пор не менялся.

С учётом всех требований вся система получается довольно сложной.

Поскольку простой пользователь никогда не видит этой сложности, я не хотел вводить дополнительные зависимости и использовать стороннюю систему сборки. Нужно было обойтись простым Makefile.

Писать такой Makefile руками — тяжело. Нужен генератор.

Поскольку luabins — некоммерческий проект, мне было интересно написать такой генератор самому, в качестве развлечения.

Получился genmakefile.

Genmakefile — интересный "игрушечный" прототип мощной системы генерации текста на основе текстовых шаблонов.

Вот пример входных данных: Makefile.luabins.template.

То, что получается на выходе, мы уже видели в luabins: Makefile.luabins.out.

Вот код, который заставляет это всё работать: genmakefile.lua

Что же мы получаем из этих четырёхсот строк кода?
  • Шаблонную систему с подстановкой значений по ключам.
  • Из шаблона можно контролировать подстановочные словари.
  • Можно создавать макросы, переопределяя язык подстановок.
  • Можно использовать шаблоны и макросы неограниченной вложенности — шаблоны, генерирующие шаблоны и т.п.
  • Несколько вызовов, специфичных для генерации Makefile-ов. :-)
Недостатки — типичные для раннего прототипа:
  • Плохо продуманый синтаксис.
  • Плохо продуманное API.
  • Маловменяемые сообщения об ошибках.
Вывод: Lua rules! :-)

Есть недостатки, но получилось интересно, просто и мощно. Нужно переосмысливать и развивать систему дальше.

Дополнительное чтение:
  1. Mixlua (искать Mixlua в тексте по ссылке).
  2. Cosmo.

Комментариев нет: