wiki:HowToTest

Как да тестваме

За да бъде един превод добър и изпипан, непременно трябва да се тества самата преведена програма. Често информацията във файла е оскъдна, за да се прецени точния род, смисъл или предназначение на даден низ. Справката с изходния код е безценна помощ, но и оттам не винаги (и не всеки) може да прецени за какво става въпрос.

Понеже (почти) винаги се превежда все още неиздадена версия на програмата, тестването на превода със стара версия (например инсталация на пакет от дистрибуцията) не е ефективен. При корекция на дублирани ускорители трябва да се имат предвид и низовете, които се ползват от вградените библиотеки като GTK+. Например, ако един диалогов прозорец има три бутона -- OK, Cancel и Foo, то преводите на първите два се наследяват от GTK+. Затова е най-добре да не се тества превода на дадена програма в изолация, а в контекста на цялото издание на GNOME.

Има няколко начина да се сдобиете с изходния код на GNOME:

  • Компилиране на нестабилни версии от download.gnome.org. Недостатъкът тук е неравната борба със зависимостите между модулите и факта, че последните промени в хранилището няма как да са отразени.
  • GARNOME решава проблема със зависимостите, като модулите се компилират и инсталират в точно определен ред. За жалост този проект не се поддържа активно.
  • Компилиране от хранилищата на GNOME. Пак се налага разрешаване на зависимостите, както и повтаряне на команди за около 200 модула.
  • JHBuild е автоматизирана система за компилиране на GNOME (и други модули) директно от хранилищата. Това е най-лесният начин да се сдобиете с актуално (нестабилно!) издание на GNOME, което се обновява лесно.

Първи стъпки с JHBuild

(Оттук нататък обясненията са ориентирани към Дебиан или дистрибуции, деривати на Дебиан. При другите дистрибуции процедурата е същата, но имената на пакетите може да се различават.)

Инсталирайте GCC, GNU make, заглавните файлове на GNU libc (в Дебиан пакета се казва libc-dev, но е най-лесно направо да се инсталира build-essential), autoconf, automake, libtool, waf и Git.

$ sudo aptitude install build-essential autoconf automake libtool git-core waf

Изберете директория, където да се съхранява изходния код и я създайте, ако не съществува.

$ mkdir -p ~/src/gnome/trunk

Изтеглете изходния код на JHBuild.

$ cd ~/src/gnome/trunk
$ git clone git://git.gnome.org/jhbuild

Компилирайте и инсталирайте JHBuild. Добре е да го инсталирате на място, което е в стандартния път (променливата на обкръжението PATH), например /usr/local или $HOME.

$ cd jhbuild
$ ./autogen.sh --prefix $HOME
$ make
$ make install

При горния избор на --prefix се уверете, че $HOME/bin е в пътя.

$ echo $PATH
/home/yavor/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

Ако не е, добавяте тези редове в ~/.bash_profile (или ~/.profile ако ползвате GDM):

if [ -d ~/bin ] ; then
    PATH=~/bin:"${PATH}"
fi

След излизането и влизането в системата би трябвало всичко да е наред:

$ which jhbuild
/home/yavor/bin/jhbuild

Изпълнете следната команда

$ jhbuild sanitycheck

и инсталирайте всички липсващи пакети (без старите версии на Automake).

Следващата стъпка е съставянето на свой собствен конфигурационен файл ~/.jhbuildrc, който съдържа списък с модулите, специфични опции за някои от тях и важни променливи. Подбирането на модулите е тънка работа. По принцип е добре да компилирате колкото се може по-малко модули -- така хем ще пестите време, хем няма да инсталирате второ копие на дадена програма или библиотека. Колкото по-модерна е дистрибуцията, толкова повече модули може да преизползвате, като инсталирате готови пакети. Първият примерен ~/.jhbuildrc е за GNOME 2.28 и Debian Squeeze.

# -*- mode: python -*-
# -*- coding: utf8 -*-

# Дали да се ползват локално инсталирани (неофициални) описания на модули.
# Може да си създадете собствен такъв, който не е дефиниран в JHBuild и
# даже не е за пакет на GNOME.
use_local_modulesets = True

repos['git.gnome.org'] = 'git://git.gnome.org/'

# Променете спрямо целевата версия на GNOME.
moduleset = 'gnome-2.30'

# Списък с модули за компилиране.  Ако превеждате модули, които не са
# в официално издание на GNOME (напр. Rhythmbox, GIMP и т.н.), може да
# ги добавите тук.
modules = [ 'meta-gnome-desktop', 'meta-gnome-proposed', 'eog-plugins',
            'epiphany-extensions', 'gedit-plugins', 'gst-plugins-bad',
            'gst-plugins-ugly', 'dia', 'gnumeric' ]

# Модули, които да не се компилират, а да се използва пакет от дистрибуцията.
# В Дебиан пакетите за библиотеки завършват с -dev (напр. libxml2-dev), в 
# други дистрибуции като Федора завършват с -devel.
skip = [ 'libxml2', 'libgpg-error', 'libgcrypt', 'libxslt', 'expat',
         'fontconfig', 'pixman', 'dbus', 'dbus-glib', 'audiofile',
         'desktop-file-utils', 'libdaemon', 'dbus-python', 'avahi',
         'libvolume_id', 'hal', 'icon-naming-utils', 'libtasn1', 'liboil',
         'startup-notification', 'gnutls', 'sqlite3', 'mozilla', 'enchant',
         'libproxy', 'gmime', 'gmime-2-2', 'libunique', 'nspr', 'nss',
         'libical', 'libgsf', 'iso-codes', 'libsndfile', 'speex', 'pulseaudio',
         'libcanberra', 'poppler', 'libggz', 'ggz-client-libs',
         'libmusicbrainz', 'autogen', 'perl-net-dbus', 'gtk-vnc', 'libcroco',
         'libgdiplus', 'libnice', 'libnotify', 'ndesk-dbus', 'gssdp', 'gupnp',
         'gupnp-av', 'ndesk-dbus-glib', 'pysqlite2', 'pyxdg', 'raptor',
         'libnl', 'mono-addins' ]

# Основен път към хранилищата.
checkoutroot = os.path.expanduser('~/src/gnome/trunk')

# Директория за инсталация.  Добре е да не е в $PATH.
prefix = '/home/yavor/gnome-trunk'

# Допълнителни опциии за някои пакети към ./configure или ./autogen.sh.

# Не ни трябват статични библиотеки, а е добре да си имаме документацийка.
# Внимание: --enable-gtk-doc забавя значително компилацията.  Ако не ви е нужна
# документация към библиотеките, задайте --disable-gtk-doc.
autogenargs='--disable-static --enable-gtk-doc'

# -Wno-error е за модули, при които разработчиците са задали -Werror и всяко
# предупреждение на компилатора се счита за фатална грешка.
module_autogenargs['empathy'] = autogenargs + ' CFLAGS=-Wno-error'

# --enable-python е за приставките на Питон.
module_autogenargs['evolution'] = autogenargs + ' --with-openldap --enable-python'

# Това ни трябва за да тестваме всички низове касаещи LDAP в e-d-s.
module_autogenargs['evolution-data-server'] = autogenargs + ' --with-openldap=yes'

module_autogenargs['epiphany'] = autogenargs + ' --disable-introspection'
module_autogenargs['epiphany-extensions'] = autogenargs + ' --with-extensions=really-all'

# Потребителското ръководство на Glade не се инсталира по подразбиране.
module_autogenargs['glade3'] = autogenargs + ' --enable-user-manual'

module_autogenargs['gobject-introspection'] = autogenargs + ' --disable-gtk-doc'
module_autogenargs['gnome-bluetooth'] = autogenargs + ' --disable-introspection'
module_autogenargs['gnome-utils'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['librsvg'] = autogenargs + ' --disable-mozilla-plugin'
module_autogenargs['nautilus'] = autogenargs + ' CFLAGS=-Wno-error'

# Ако използвате системен пакет на dbus (а не компилиран чрез JHBuild),
# Tracker се опитва да инсталира org.freedesktop.Tracker*.service в 
# системната директория, където няма права (а и не желаем това).
module_autogenargs['tracker'] = autogenargs + '  --with-session-bus-services-dir=/home/yavor/gnome-trunk/share/dbus-1/services'
module_autogenargs['NetworkManager'] = autogenargs + ' --disable-evolution-miner'

# Коментирайте този ред, ако машината ви не е с многоядрен процесор.
os.environ['MAKE'] = 'make -j2'

# Използване на програмата install-check от дистрибуцията на JHBuild.
os.environ['INSTALL'] = os.path.expanduser('~/bin/install-check')

Ето и един пример за gNewSense DeltaH, която е по-стара дистрибуция (базирана на Ubuntu Hardy). Тук не могат да се използват доста модули като пакети на дистрибуцията, понеже са с много стари версии. Налага се и доста по-често да се прибягва до трика с LDFLAGS, защото версията на GLib е още по-стара (2.16.3).

# -*- mode: python -*-
# -*- coding: utf8 -*-

repos['git.gnome.org'] = 'git://git.gnome.org/'

moduleset = 'gnome-2.30'

use_local_modulesets = True

modules = [ 'meta-gnome-desktop', 'meta-gnome-proposed', 'eog-plugins',
            'epiphany-extensions', 'gedit-plugins', 'gst-plugins-bad',
            'gst-plugins-ugly', 'dia', 'gnumeric' ]

skip = [ 'libgpg-error', 'expat', 'fontconfig', 'audiofile',
         'desktop-file-utils', 'libdaemon', 'libtasn1', 'liboil',
         'mozilla', 'enchant', 'nspr', 'nss', 'iso-codes', 'libsndfile',
         'libggz', 'ggz-client-libs', 'libmusicbrainz', 'autogen',
         'perl-net-dbus', 'pyxdg', 'pysqlite2' ]

checkoutroot = os.path.expanduser('~/src/gnome/trunk')

prefix = '/home/yavor/gnome-trunk'

autogenargs='--disable-static --enable-gtk-doc'

# За LDFLAGS е нужно малко повече обяснение...
# Когато някои от зависимите библиотеки са инсталирани в /usr/lib или
# /usr/local/lib, и те се свързват динамично с по-стара версия на GLib (например
# в този случай GLib 2.20.4), се получава неприятен момент с "unresolved symbols":
# свързващата програма се опитва да разреши някои нови символи на GLib, които използва
# програмата спрямо старото копие на GLib в /usr/lib, понеже libtool го добавя към
# командния ред за свързване като зависимост на някоя друга библиотека.  Рядко се
# налага, и спокойно може да махнете LDFLAGS когато обновите системата с по-нова
# версия на проблематичната библиотека (тогава тя ще съдържа липсващите символи).
module_autogenargs['devhelp'] = autogenargs + ' CFLAGS=-Wno-error LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so"'
module_autogenargs['empathy'] = autogenargs + ' CFLAGS=-Wno-error LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so"'
module_autogenargs['epiphany'] = autogenargs + ' LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so"'
module_autogenargs['epiphany-extensions'] = autogenargs + ' --with-extensions=really-all'
module_autogenargs['evolution'] = autogenargs + ' --with-openldap --enable-python \
  LDFLAGS=-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so'
module_autogenargs['evolution-data-server'] = autogenargs + ' --with-openldap=yes'
module_autogenargs['evolution-exchange'] = autogenargs + ' LDFLAGS=-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so'
module_autogenargs['gobject-introspection'] = autogenargs + ' --disable-gtk-doc'
module_autogenargs['gnome-bluetooth'] = autogenargs + ' --disable-introspection'
module_autogenargs['gnome-games'] = autogenargs + ' LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so -Wl,/home/yavor/gnome-trunk/lib/libgio-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgdk_pixbuf-2.0.so" --disable-introspection'
module_autogenargs['glade3'] = autogenargs + ' --enable-user-manual'
module_autogenargs['gstreamer'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['gst-plugins-bad'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['gst-plugins-base'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['gst-plugins-good'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['gtk+'] = autogenargs + ' LDFLAGS=-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so'
module_autogenargs['gtkhtml'] = autogenargs + ' LDFLAGS=-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so'
module_autogenargs['nautilus'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['seahorse-plugins'] = autogenargs + ' --disable-epiphany'
module_autogenargs['tracker'] = autogenargs + ' --disable-evolution-miner CPPFLAGS=-I/usr/include/uuid'
module_autogenargs['yelp'] = autogenargs + ' LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so"'
module_autogenargs['DeviceKit-power'] = autogenargs + ' CFLAGS=-Wno-error'
module_autogenargs['WebKit'] = autogenargs + ' LDFLAGS="-Wl,/home/yavor/gnome-trunk/lib/libglib-2.0.so \
  -Wl,/home/yavor/gnome-trunk/lib/libgobject-2.0.so"'

#os.environ['MAKE'] = 'make -j2'

os.environ['INSTALL'] = os.path.expanduser('~/bin/install-check')

След като сте готови с ~/.jhbuildrc, не ви остава нищо друго освен

$ jhbuild build

Първият път ще отнеме значително време -- клонирането на хранилищата на Git е сравнително бавно (съдържат цялата история на проекта), а и всичко се налага да се компилира начисто. Ако срещнете трудности, пишете до dict@… за конкретната грешка.

За да тествате определена програма, изпълнете

$ jhbuild run <program>

Например:

$ jhbuild run eog

Командата

$ jhbuild run bash

влиза в нещо като chroot na JHBuild, където променливите на обкръжението са променени:

$ which evolution
/usr/bin/evolution
$ evolution --version
GNOME evolution 2.26.3
$ jhbuild run bash
$ which evolution
/home/yavor/gnome-trunk/bin/evolution
$ evolution --version
GNOME evolution 2.27.91

За да компилирате само един модул, използвайте

jhbuild buildone <модул>

Това е полезно, ако имате горе-долу обновено копие на GNOME (компилиран преди седмица, да речем), но работите по определен превод и искате програмата и превода да са 100% обновени спрямо хранилището.

За да подкарате пълноценна сесия на нестабилния ви GNOME, добавете ~/.xinitrc със следното съдържание:

exec jhbuild run gnome-session

Ако ползвате GDM, добавете файл /usr/share/xsessions/jhbuild.desktop със следното съдържание:

[Desktop Entry]
Name=GNOME (JHBuild)
Exec=/home/yavor/bin/jhbuild-session
Type=Application

и ~/bin/jhbuild-session:

jhbuild run gnome-session

Не забравайте да направите файла изпълним:

$ chmod +x ~/bin/jhbuild-session

Периодично обновяване

Обновяването на GNOME е лесна процедура. Добър интервал е всяка седмица, но може и по-рядко в зависимост от това колко активно превеждате.

$ cd ~/src/gnome/trunk/jhbuild
$ git pull
/* Евентуално ако има промени по същинския код на JHBuild (*.py). */
$ make install

Файловете с описанията на модулите на JHBuild се променят непрекъснато, понякога доста динамично. Необходимо е да ги обновявате периодично преди всяка голяма компилация.

След това е просто:

$ jhbuild build

Ако се прехвърляте на следващо издание на GNOME, задайте го в променливата moduleset в ~/.jhbuildrc. Добра практика е тогава да се затрие цялата директория с инсталацията (~/gnome-trunk в горните примери), за да се насели начисто с прясно компилираното ново издание.

Приятно тестване!

Last modified 10 years ago Last modified on May 15, 2010, 11:59:35 PM