Path: | docs/EmbeddedRuCodeGen |
Last Update: | Mon Jun 04 14:34:35 +0400 2007 |
В версии 0.2.0 в RuCodeGen была добавлена возможность встраивать RuCodeGen описания внутрь других файлов (в версии 0.1.0 RuCodeGen описание должно было располагаться в самостоятельном и самодостаточном Ruby-файле, который и запускался на обработку).
Встроенный RuCodeGen должен начинаться со строки, в которой есть подстрока RuCodeGen::Embedded::begin, затем должен идти код RuCodeGen описания, затем строка с построкой RuCodeGen::Embedded::end. Например, в C++ встраивание RuCodeGen может выглядеть, например, так:
#if 0 /* RuCodeGen::Embedded::begin */ ... # RuCodeGen описания... #endif /* RuCodeGen::Embedded::end */
или же:
/* RuCodeGen::Embedded::begin ... # RuCodeGen описания... RuCodeGen::Embedded::end */
Для обработки встраиваемых RuCodeGen описаний добавлен метод process_embedded_rucodegen, который получает на вход имя файла со встроенными описаниями и режим кодогенерации (:build или :clean). Запустить кодогенерацию для встраиваемого описания можно, например, следующей командной строкой:
ruby -e"require 'rubygems'; require_gem 'RuCodeGen'; process_embedded_rucodegen('test.cpp',:build)"
Однако, предполагается, что встраиваемый RuCodeGen будет использоваться вместе со специальными инструментами, которые сами будут инициировать кодогенерацию (например, такими как Mxx_ru.
Когда process_embedded_rucodegen получает имя исходного файла, он считывает его содержимое и выделяет оттуда все RuCodeGen-фрагменты. Эти фрагменты объединяются в один временный Ruby-файл с именем src_file-embedded-rucodegen (где src_file — это имя исходного файла). В начало временного файла помещаются инструкции:
require 'rubygems' require_gem 'RuCodeGen'
Т.о. process_embedded_rucodegen формирует автономный файл со всеми RuCodeGen описаниями, которые были встроенны в исходный файл. После этого запускается ruby с именем временного файла в качестве аргумента и кодогенерация сводится к обычной процедуре кодогенерации RuCodeGen. После завершения кодогенерации временный файл удаляется.
process_embedded_rucodegen удаляет временный файл, но в режиме :build оставляет файл с md5-хэшем. Этот md5-файл используется при последующих кодогенерациях для того, чтобы проверить необходимость перегенерации. Ведь может оказаться, что исходный файл изменяется, а встроенные в него RuCodeGen описания — нет. В таких случаях md5-хеш для временного файла будет оставаться неизменным. md5-файл уничтожается как обычно при запуске RuCodeGen в режиме :clean.