понедельник, 18 января 2010 г.

Сборка примеров plplot под Fedora x86_64

plplot - это чудесная библиотека, позволяющая формировать графики и отображать их на экран либо сохранять в файл. Главная прелесть библиотеки заключается в том, что она позволяет не заморачиваться на GUI и графическом приложении, что мне собственно и понадобилось. Кому интересно, библиотека имеет громадную пачку биндингов от C++ до Perl. Но мне лично нужен C.

Прежде чем встараивать библиотеку в мою прогу, решил я собрать plplot'ские примеры. На моем ноуте живет Fedora x86_64, а програма, которую я разрабатываю собирается пока только под i386. Соответственно, и примеры мне нужно было собрать под i386.

Что установлено:

$ yum list plplot\*
Installed Packages
plplot.x86_64            5.9.5-1.fc12         @fedora
plplot-devel.i686        5.9.5-1.fc12         @fedora
plplot-libs.i686         5.9.5-1.fc12         @fedora
plplot-libs.x86_64       5.9.5-1.fc12         @fedora
plplot-qt.i686           5.9.5-1.fc12         @fedora
plplot-qt.x86_64         5.9.5-1.fc12         @fedora
plplot-qt-devel.i686     5.9.5-1.fc12         @fedora
plplot-tk.x86_64         5.9.5-1.fc12         @fedora

Для начала скопировал всю директорию с примерами из /usr/share/plplot5.9.5/examples/ к себе в домик.

$ make
cd c; make
make[1]: Entering directory `/home/neuron/study/development/plplot_examples/c'
/usr/bin/gcc x01c.c -o x01c `pkg-config --cflags --libs plplotd`
Package plplotd was not found in the pkg-config search path.
Perhaps you should add the directory containing `plplotd.pc'
to the PKG_CONFIG_PATH environment variable
No package 'plplotd' found
In file included from x01c.c:25:
plcdemos.h:14:22: error: plConfig.h: No such file or directory
plcdemos.h:15:20: error: plplot.h: No such file or directory
plcdemos.h:51:1: warning: "isnan" redefined
In file included from plcdemos.h:10,
                 from x01c.c:25:
/usr/include/math.h:257:1: warning: this is the location of the previous definition
x01c.c:26:21: error: plevent.h: No such file or directory
...
x01c.c:349: error: ‘y’ undeclared (first use in this function)
make[1]: *** [x01c] Error 1
make[1]: Leaving directory `/home/neuron/study/development/plplot_examples/c'
make: *** [c/x01c] Error 2

Локализуем ошибку.

$ pkg-config --cflags --libs plplotd
Package plplotd was not found in the pkg-config search path.
Perhaps you should add the directory containing `plplotd.pc'
to the PKG_CONFIG_PATH environment variable
No package 'plplotd' found

Ага. Информацию о пакете найти не может... Устанавливаем необходимую переменную окружения и идем дальше.

$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig
$ pkg-config --cflags --libs plplotd
-I/usr/include/plplot  -lplplotd -lltdl -ldl -lm -lcsirocsa -lcsironn -lqhull -lqsastime -lfreetype

$ make
cd c; make
make[1]: Entering directory `/home/neuron/study/development/plplot_examples/c'
/usr/bin/gcc x01c.c -o x01c `pkg-config --cflags --libs plplotd`
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.2/../../../libplplotd.so when searching for -lplplotd
/usr/bin/ld: skipping incompatible /usr/lib/libplplotd.so when searching for -lplplotd
/usr/bin/ld: cannot find -lplplotd
collect2: ld returned 1 exit status
make[1]: *** [x01c] Error 1
make[1]: Leaving directory `/home/neuron/study/development/plplot_examples/c'
make: *** [c/x01c] Error 2

Собираться пытаться начинает, devel-пакета не находит. Помните, что установлен только plplot-devel.i686? Поэтому идем в директорию 'c' и правим Makefile. В параметры сборки добавляем ключ -m32. Так как меня интересовали только примеры на C, то в этой директории я и остался. Собираемся дальше.

$ make
/usr/bin/gcc x01c.c -m32 -o x01c `pkg-config --cflags --libs plplotd`
/usr/bin/ld: skipping incompatible /usr/lib64/libltdl.so when searching for -lltdl
/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [x01c] Error 1

Угадайте откуда косяк? Правильно. Собирраем мы теперь 32-битное приложение и зависимости ему нужны 32-битные...

$ rpm -qf /usr/lib64/libltdl.so
libtool-ltdl-devel-2.2.6-17.fc12.x86_64
$ sudo yum install libtool-ltdl-devel.i686

Далее таким же образом выяснилась необходимость qhull-devel.i686, freetype-devel.i686, gtk2-devel.i686, atk-devel.i686, glib2-devel.i686, pango-devel.i686, cairo-devel.i686 и fontconfig-devel.i686. И вуаля:

$ make
/usr/bin/gcc x01c.c -m32 -o x01c `pkg-config --cflags --libs plplotd`
/usr/bin/gcc x02c.c -m32 -o x02c `pkg-config --cflags --libs plplotd`
...
/usr/bin/gcc x31c.c -m32 -o x31c `pkg-config --cflags --libs plplotd`
/usr/bin/gcc x32c.c -m32 -o x32c `pkg-config --cflags --libs plplotd`

Результаты работы тестовых примером меня порадовали. Библиотека оказалась именно тем, что мне нужно. А благодаря легкому сексу при сборке примеров, я знаю чего стоит ожидать при сборке своей проги с этой библиотекой...

P.S. Не зря Bugzill'е есть репорт об ошибках при сборке примеров ;) Там, кстати, решили баг не фиксать кажется...