Monday, December 21, 2009

How to embed Glade XML files into an executable

Ну, есть 2 способа:

  1. Популярный, когда создается relocatable ELF object, который gcc присобачивает к исполняемому файлу. Портабельность метода сомнительна.
  2. No-brainer, когда Glade'овский XML аккуратно запихивается в 1 строку в header file. Строка получается большая.

Всем понятно, что я использую, разумеется, 2-й способ.

Сперва мы пишем нехитрый ruby скрипт glade2c.rb, который читает XML файл и на stdout пишет вот такое:

const char *glade_gui_ui_embedded = ""
"<?xml version=\"1.0\"?>\n"
"<interface>\n"
"  <requires lib=\"gtk+\" version=\"2.16\"/>\n"
[...]
"</interface>\n"
"";

Что есть обещанная длинная строка.

Далее, мы пишем в какой-то из .h файлов нашего проекта:

extern const char *glade_gui_ui_embedded;

и добавляем в Makefile что-то вроде (пример для GNU Make):

GLADE := foobar.glade
GLADE_EMBD := glade_gui_ui_embedded.c

OBJ += $(patsubst %.c,%.o,$(GLADE_EMBD))

$(GLADE_EMBD): $(GLADE)
        ./glade2c.rb $< > $@

То есть, набирая make glade_gui_ui_embedded.c мы получаем сгенерированный .c файл, где определена переменная glade_gui_ui_embedded и:

  • в коде вызываем gtk_builder_add_from_string() вместо привычной gtk_builder_add_from_file();
  • продолжаем независимо от сборки утюжить свой foobar.glade, который автоматически каждый раз при его изменении готовится для embedding.

Хотя лично мне gcc говорит страшное:

glade_gui_ui_embedded.c:439: warning: string length '20359' is greater than the length '4095' ISO C99 compilers are required to support

но, тем не менее, все отлично работает.

2 comments:

  1. такое точно не работает с Visual C++, у которого лимит строки - 64к - just fyi

    ReplyDelete
  2. @alexott: Ok, буду иметь ввиду.

    ReplyDelete