как обещал, выкладываю cogen. это кодогенератор, вернее такой фрейворк для его создания. суть в том, что человек выражает свою идею так, как ему удобно, используя для этого dsl, этот dsl (их может быть несколько) преобразовывается определенным образом, после чего, использую шаблон, создаются файлы.
пока есть только один dsl (описание интерфейсов), и только один полезный шаблон (и то, создал для теста, это мост между пином и плюсами). ну на то это и альфа :) если кому интересно использовать кодогенерацию вобще, то я думаю будет полезно.
вот как запускать. ./cogenwr.py -iix3=foo -g generator -o dir здесь
- -iix3 это файл, содержащй описание интерфейса
- -g это info файл, описывающий что сгенерировать и
- -o это куда положить результат
- --help (на всякий) понятно что :)
все пути сначала смотрятся в текущем каталоге, потом в каталогах рядом с бинарем (на уровень выше, в etc). если понадобится, сделаю опцию куда еще смотреть. так что можно писать эти файлы самому, создавая нужный себе шаблон.
описание формата info. вот пример файла для генерации плюсового интерфейса. еще можно посмотреть мост между плюсами и питоном (я его сделал для теста больше, не думаю что буду использовать).
part
{
dec {
tmpl cpp/declarations.jinja
file declarations.hpp
}
header {
inc_part dec
tmpl cpp/header.jinja
file module.hpp
}
definition {
inc_part dec
inc_part header
tmpl cpp/definitions.jinja
file module.cpp
}
cmake {
tmpl cmake/plain.jinja
file CMakeLists.txt
project interface
version "0.0.1.0"
libraries {
interface {
part dec
part header
part definition
}
}
}
}
тут описаны части того,что будет сгенерировано (часть не эквивалентна одному файлу в общем случае, но в этом примере - да). каждая часть содержит несколько основных опций (если заглянуть в исходники их боьлше, но не все из них используются)
- tmpl это шаблон для генерации. если использовать cogenwr.py, то это jinja2
- file как назвать результирующий файл. в нем могут содержаться переменные, например %{mod}, туда будет подставен модуль, который генерится. так одна часть может сгенерировать несколько файлов, в зависимости от того, что будет на входе (можно посмотреть cpp_py.info там они используются)
- inc_part это для #include. система увидит, что некоторые узлы ссылаются на другие узлы, и включит файлы с ними, если они указаны с помощью этой директивы
- у cmake есть специальные директивы, по нему строится некий dsl для систем сборки, поэтому описание несколько отличается. вобще в шаблоне будет доступно то, что написано для него в этом файле, так что тут можно включать разные дополнительные данные
вот как можно это все достать (да да, самоподписанный просроченный)
- default.nix для nix-build. тут нужно, чтобы в используемом канале был доступен boost.175 ибо в нем есть boost.json
- export.tar.gz это бинарь и файлы, нужные для его работы
PS: бинарь я собрал никсом и выполнил такие комманды (exporter)
patchelf --set-rpath "/lib/x86_64-linux-gnu/" export/bin/cogen
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 export/bin/cogen
возможно это не помогло и надо изменить пути, чтобы запустить.