понедельник, 24 мая 2010 г.

Компилирование OpenBabel в OpenSolaris 2009.06

OpenBabel – химическая программа, предназначенная для преобразования форматов, поиска фрагментов и многого другого. Для установки OpenBabel потребовалось скомпилировать библиотеку Eigen.

Предварительные действия

Для сборки OpenBabel потребовалось следующее программное обеспечение:
* Компилятор GCC 4 (с Sun Studio я не смог собрать)
* cmake
* svn
* wxWidgets (не обязательно)

В домашнем каталоге пользователя я создал подкаталог Molecule_projects (в дальнейшем, $HOME).

Установка Eigen

Eigen – библиотека шаблонов на Си++ для линейной алгебры.

Я скачал последнюю стабильную версию Eigen 2.0.12:
http://bitbucket.org/eigen/eigen/get/2.0.12.tar.bz2
и распаковал в $HOME.

Затем
$ cd $HOME/eigen
$ cmake .
$ make
$ pfexec make install
$ cd ../

Примечания:
1) В отличие от make, cmake требует указывать рабочий каталог. Я использовал текущий каталог, обозначенный точкой (.), хотя документация рекомендует создавать отдельный каталог для сборки.
2) Команда make ничего не выводит и выполняется очень быстро, не следует считать это ошибкой. Eigen состоит из заголовочных файлов, поэтому компилировать там нечего.
3) pfexec служит для запуска привилегированных команд в OpenSolaris; в других системах для этого используют sudo. make install устанавливает файлы в /usr/local/include/eigen2.

Компилирование OpenBabel

Компилировать OpenBabel пришлось при помощи GCC. Пробовал Sun Studio 12 update 1, но там сначала не подцеплялся Boost, а потом потерялась стандартная библиотека. Надеюсь, что когда-нибудь я научусь компилировать с помощью сановского компилятора; а пока и GCC сгодится – ведь не такой уж он и плохой компилятор, как думают многие пользователи Solaris.

Итак, я скачал GCC 4.3 из репозитория Blastwave.org:
$ yes|pfexec pkgutil -i gcc4

Устанавливается в /opt/csw/gcc4. Надо использовать именно gcc с blastwave, потому что в стандартном репозитории opensolaris.org до сих пор версия gcc 3, которая не подходит. В принципе, можно было использовать GCC 3, но для этого надо отдельно устанавливать Boost. Далее надо создать символические ссылки
$ pfexec ln -s /opt/csw/gcc4/bin/gcc /usr/bin/gcc
$ pfexec ln -s /opt/csw/gcc4/bin/gcc /usr/bin/gcc

Теперь переходим в $HOME/openbabel и запускаем cmake и make в текущей директории:
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/openbabel .
$ make

К сожалению, OpenBabel разрабатывают линуксоиды, которые, как известно, не очень заботятся о переносимости своих программ. Поэтому пришлось сделать небольшие изменения в коде. Для этого в начале файлов src/builder.cpp, src/forcefield.cpp, src/mol.cpp, src/obutil.cpp, src/forcefields/forcefieldgaff.cpp, src/forcefields/ghemical.cpp, src/forcefields/forcefieldmmff94.cpp, src/forcefields/forcefielduff.cpp, tools/obenergy.cpp надо вставить
#include
#if defined(sun)
#ifndef isfinite
#define isfinite(val) (val <= std::numeric_limits::max())
#endif
#endif

Это не моя идея, а известный случай того, как исправлять подобные ошибки. В целом, перенос кода из Linux в OpenSolaris несложен и часто достигается с помощью директив #include и #define. О других случаях написано на странице Nexenta (это дистрибутив OpenSolaris):
http://www.nexenta.org/os/Porting_Codefixes

Надеюсь, когда вы будете читать этот блог, разработчики OpenBabel исправят ошибку. Возможно, это будет более элегантный и правильный способ – а пока пусть так работает.

Установка пакета

$ pfexec make install
должна устанавливать в каталог, указанный в cmake -DCMAKE_INSTALL_PREFIX.
– Installing: ./sfw_stage/lib/openbabel/2.2.99/smilesformat.so
– Set runtime path of “./sfw_stage/lib/openbabel/2.2.99/smilesformat.so” to “/usr/local/openbabel/lib”

Странно, но в целевой каталог /usr/local/openbabel ничего не было записано, тогда как именно там будут искаться разделяемые библиотеки. Пришлось сделать символическую ссылку; тогда заработало:
$ pfexec ln -s $HOME/openbabel/sfw_stage/lib /usr/local/openbabel/lib
$ cd sfw_stage/bin
$ ./babel
No output file or format spec!
Open Babel 2.2.99 — May 20 2010 — 12:45:00
Usage: babel [-i] [-o]
Try -H option for more information.

Компилирование с графическим интерфейсом

Мне захотелось иметь графический интерфейс, поэтому я установил wxWidgets:
$ pfexec pkg install SUNWwxwidgets

Хотя cmake сразу нашёл wxWidgets, скомпилировать мне не удалось. Дело в том, что GCC в OpenSolaris не понимает опцию -mt. Если использовать wxWidgets, cmake добавит в CXX_FLAGS опцию -mt;-D_REENTRANT (заметили “точку с запятой”?), что было бы недопустимо даже в Linux. Поэтому после выполнения cmake в файле
$HOME/openbabel/src/CMakeFiles/openbabel.dir/flags.make
я замененил -mt;-D_REENTRANT на -D_REENTRANT.

Оказалось, что эту процедуру надо провести над всеми файлами типа flags.make, что мне было неохото. Конечно, можно как то исправить ситуацию на уровне cmake или написать скрипт, который автоматически исправит все файлы. Разработчики OpenBabel говорят, что ошибка в Cmake или wxWidgets. Ничего, и без графики пока обойдусь.

Комментариев нет:

Отправить комментарий