How to embed Glade XML files into an executable
Latest update:
Есть 2 способа:
- Популярный, когда создается relocatable ELF object, который gcc присобачивает к исполняемому файлу. Портабельность метода сомнительна.
- 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
но, тем не менее, все отлично работает.
Tags: ойті
Authors: ag