неділя, 1 січня 2012 р.

Компіляція та установка Vala, Valadoc i Libgee з першоджерел

Vala 0.15

Vala, це сучасна мова програмування, схожа на c#, але на відміну від c#, Vala компілює свої програми у машинні коди, а не в інструкції віртуальної машини, що робить цю мову, в принципі, цікавою навіть (в певних рамках) для системного  програмування.

Ще однією цікавою особливістю Vala є те, що вона базується на об'єктній моделі GObject, на ній легко створювати програми з графічним інтерфейсом користувача GTK/GNOME, при компіляції Vala не тягне з собою ніяких runtime-бібліотек,  крім (стандартної в багатьох дистрибутивах Linux) бібліотеки GLib, що дозволяє створювати досить компактні виконавчі модулі.

Ще одною особливістю Vala є чудова інтеграція з мовою С (фактично, Vala компілює свої програми в програму на мові C,  яка вже далі компілюється в машинний код). Це дозволяє дуже легко підключати до Vala бібліотеки на C, а також легко створювати (навіть об'єктно-орієнтовані, з використанням GObject) бібліотеки, які легко можна підлючити з програми, написаній на С та інших мовах програмування.

У Vala є "брат-близнюк", мова Genius, схожа на Python, але можливостями один-в-один як у Vala. До речі, компілятор для цих двох мов у них один - valac.

Vala дуже молода мова і швидко розвивається. Тому, для найдопитливіших буде цікаво встановити собі найсвіжішу версію цієї мови...

Насамперед, вилучаємо всі встановлені версії vala через пакетний менеджер (насправді різні версії Vala можуть співіснувати разом, але я цей момент не досліджував):
$ sudo aptitude purge valac vala-doc vala-utils libgee2 libgee-dev

Далі я отримав архів із останньою стабільною версією vala звідси (я, наприклад, завантажив собі vala-0.15.0.tar.xz (вваваємо, що всі завантаження зберігаються в папці ~/Downloads)

Для експериментів з різними проектами я собі створив папку projects:
$ mkdir ~/projects

Для експериментів з vala створив собі підкаталог vala:
$ cd ~/projects
$ mkdir vala
$ cd vala

Розгорнув тут архів з джерельними кодами vala-0.15:
$ cp ~/Downloads/vala-0.15.0.tar.zx ~/projects/vala
$ tar xvf vala-.15.0.tar.zx

тепер компіляція (якщо є якісь помилки, виправляємо і йдемо далі):
$ ./configure
$ make
$ sudo make install
ЗАУВАЖЕННЯ! За замовчуванням, інсталяція пройде в каталог /usr/local/

Якщо при тестовому запуску Vala командою valac буде видаватись така помилка:
valac: error while loading shared libraries: libvala-0.16.so.0: cannot open shared object file: No such file or directory
Це означає, що завантажувач динамічних бібліотек (.so) не знає де знаходиться файл libvala-0.16.so.0

Для вирішення цього питання потрібно запустити таку команду:
$ sudo ldconfig

Якщо ж це не спрацює, то таку:
$ sudo ldconfig -n /usr/local/lib
(якщо виникла необхідність в останній комаді, значить шлях /usr/local/lib не використовується для автоматичного пошуку динамічних бібліотек у файлі ld.so.conf або папці ld.so.conf.d).

Бажано це виправити, наприклад так:
$ echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/usr-local.conf
$ sudo ldconfig

Тепер можна протестувати компілятор:
$ cd tests
$ make check-TESTS

Всі тести в мене пройшли на 'ok', крім останнього:
...
/gir/bug651773:                        FAIL
error: Package `GLib-2.0' not found in specified Vala API directories or GObject-Introspection GIR directories
error: Package `GObject-2.0' not found in specified Vala API directories or GObject-Introspection GIR directories
Generation failed: 2 error(s), 0 warning(s)
1 of 145 tests failed
make: *** [check-TESTS] Помилка 1

Вилікувалось це встановкою наступних симлінків:
$ cd /usr/local/share/vala/vapi
$ sudo ln -s glib-2.0.vapi GLib-2.0.vapi
$ sudo ln -s gobject-2.0.vapi GObject-2.0.vapi

Якщо man valac видає таку помилку:
man: can't resolve /usr/share/man/man1/valac.1.gz: No such file or directory
значить деінсталяція попередньої версії valac пройшла не до кінця (залишились записи в кеші системи документації man про стару версію).

Лікується дуже просто:
$ sudo mandb


Libgee


Беремо Libgee звідси, але тільки 6-ї гілки (бо вищі версії не бажає valadoc, який ми будемо компілювати далі) - останній на момент написання статті - libgee-0.6.3

$ cp ~/Dovnloads/libgee-0.6.3.tar.xz ~/projects/vala
$ cd ~/projects/vala
$ cd tar xvf libgee-0.6.3.tar.zx
$ cd libgee-0.6.3
$ ./configure
$ make
$ sudo make install

$ sudo ldconfig

Тестуємо Libgee:
$ cd tests
$ ./tests
(все має бути 'ок')

Valadoc з git


Беремо Valadoc з git (якщо git не встановлено, то встановлюємо: sudo aptitude install git):
$ cd ~/projects/vala
$ git clone git://git.gnome.org/valadoc
$ cd valadoc

На момент написання статті valadoc має помилку, яка не дає йому працювати з Vala версією більшою за 0.14.x. Щоб це виправити потрібно зробити невелику правку в першоджерелах, а саме у файлі
./src/valadoc/valadoc.vala:
247  DriverMetaData[] lut = {
248     DriverMetaData (LibvalaVersion (0, 10, 0), LibvalaVersion (0, 10, -4), "0.10.x"),
249     DriverMetaData (LibvalaVersion (0, 11, 0), LibvalaVersion (0, 11,  0), "0.11.0"),
250     DriverMetaData (LibvalaVersion (0, 11, 1), LibvalaVersion (0, 11, -1), "0.11.x"),
251     DriverMetaData (LibvalaVersion (0, 12, 0), LibvalaVersion (0, 12, -1), "0.12.x"),
252     DriverMetaData (LibvalaVersion (0, 13, 0), LibvalaVersion (0, 13, -1), "0.13.x"),
253     DriverMetaData (LibvalaVersion (0, 14, 0), LibvalaVersion (0, 14, -1), "0.14.x"),
254     DriverMetaData (LibvalaVersion (0, 15, 0), LibvalaVersion (0, 16, -1), "0.16.x")
255  };
Потрібно у файлі valadoc.vala добавити рядок позначений червоним (254) і не забути додати кому наприкінці попереднього (253) рядка(!).

Ще Valadoc не хоче показувати кирилицю в згенерованому html файлі. Для виправлення цього потрібно підправити два файли:./src/libvaladoc/html/htmlmarkupwriter.vala (добавити новий метод meta_content в клас Valadoc.Html.MarkupWriter)
public MarkupWriter meta_content(string  charset) {
    simple_tag ("meta", {"content", "text/html; charset=" + charset, "http-equiv", "content-type"});
    return this;
}

./src/libvaladoc/html/basicdoclet.vala (добавити виклик методу meta_content у функцію write_file_header() (позначено червоним))
821     protected void write_file_header (string css, string js, string? title) {
822         writer.start_tag ("html");
823         writer.start_tag ("head");
824         if (title == null) {
825             writer.start_tag ("title").text ("Vala Binding Reference").end_tag ("title");
826         } else {
827             writer.start_tag ("title").text (title).text (" -- Vala Binding Reference").end_tag ("title");
828         }
829         writer.meta_content("UTF-8");
830         writer.stylesheet_link (css);
831         writer.javascript_link (js);
832         writer.end_tag ("head");
833         writer.start_tag ("body");
834         writer.start_tag ("div", {"class", css_site_header});
835         writer.text ("%s Reference Manual".printf (title == null ? "" : title));
836         writer.end_tag ("div");
837         writer.start_tag ("div", {"class", css_style_body});
838     }

Тепер можна компілювати valadoc:
$ ./autogen.sh
$ make
$ sudo make install

Тестуємо Valadoc:
$ cd tests
$ make check-TESTS
має отриматись щось таке:
TEST: Building...                           OK
  /libvaladoc/errorreporter:                OK
All 1 tests passed

Тепер можемо собі написати "Привіт світ!" з документуванням (правила розмітки знаходиться тут):
hello.vala:
/**
 * ==Простір імен "test"==
 *
 * ''Детальний'' опис простору імен __"Тест"__ <<BR>>
 * ''жирний'' <<BR>>
 * //курсив// <<BR>>
 * __підкреслений__ <<BR>>
 * ``друкарська машинка``
 *
 * ``{{{а це моноширинна вставка "як є"
 * другий рядок
 *    третій рядок (зміщений на 3 символи вправо)
 * }}}``
 *
 **/
 namespace test {

    /**
     * Тестова функція ''main()''
     *
     * Друк у стандартний вивід тексту "Привіт, Vala!"
     *
     * @param args - параметри командного рядка //(ігноруються)//
     **/
    int main (string[] args)
    {
       stdout.printf("Привіт, Vala!\n");
       return 0;
    }
}
ЗАУВАЖЕННЯ: На даний момент valadoc досить "нервово" реагує на не англійський utf-8 (читай, більше одного байту на символ). Тому, часом, для відображення форматованого тексту потрібно відступати від "зірочки" (лівого краю) то один, то два пропуски. Що воно таке за диво - ще розбираюсь...

Компіляція:
$ valac hello.vala

Документування:
$ valadoc --force --internal -o hello-vala hello.vala

Поки що - все!

Вердикт: Vala - працює. Valadoc - ще трохи сира.

Немає коментарів:

Дописати коментар