вторник, 25 мая 2010 г.

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

Чтобы установить boost, я скачал исходники с официального сайта
http://www.boost.org/users/download/
и распаковал в $HOME.

Затем выполнил конфигурационный скрипт
./bootstrap.sh --with-toolset=sun --prefix=/usr/boost
./bjam stdlib=sun-stlport instruction-set=i386 address-model=32

Компилирование Boost происходило долго и с предупреждениями. Примерно через 3 часа оно было завершено.

При желании можно было использовать MPI для поддержки многопроцессорности, но ввиду наличия на тестовой машине всего одного одноядерного процессора, я не стал этим заниматься. Пользуясь случаем порекламировать технологии бывшей Sun, советую использовать Sun HPC ClusterTools (новое название Oracle Message Passing Toolkit) в качестве реализации MPI.

Можно было скачать скомпилированную версию Boost с сайта blastwave.org. Однако такой путь не является верным, особенно для вычислительной библиотеки, так как не позволяет использовать оптимизации под конкретный процессор. Другой довод заключается в том, что я использую компилятор Sun Studio с библиотекой stlport4. Насколько мне известно, разработчики на blastwave.org используют компилятор GCC и библиотеку Cstd. Эти две библиотеки несовместимы, подробнее:
http://developers.sun.com/solaris/articles/cmp_stlport_libCstd.html

понедельник, 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. Ничего, и без графики пока обойдусь.

Запуск OpenGrok в Solaris 10

OpenGrok – это удобный инструмент для навигации в исходном коде. Я давно знал о его существовании по проектам OpenSolaris и OpenOffice, где он активно применяется. Теперь, когда мне потребовалось хорошо разобраться в коде проекта OpenBabel, я вспомнил про OpenGrok и решил испытать на своей рабочей станции.

Запуск Glassfish в Solaris 10

OpenGrok работает с двумя серверами: Tomcat и Glassfish. Я выбрал Glassfish v3, так как он официально поддерживается Oracle. Для этого я скачал сервер
https://glassfish.dev.java.net/downloads/v3-final.html

и установил в /opt/glassfish. Для запуска домена по умолчанию (domain1) выполнил
# /opt/glassfish/bin/asadmin start-domain
Waiting for DAS to start ………………
Started domain: domain1
Domain location: /opt/glassfish/glassfish/domains/domain1
Log file: /opt/glassfish/glassfish/domains/domain1/logs/server.log
Admin port for the domain: 4848
Command start-domain executed successfully.

Установка OpenGrok

Сначала я скачал пакет OSOLopengrok-0.9.pkg с сайта http://hub.opensolaris.org/bin/view/Project+opengrok/files и установил:
# pkgadd -d OSOLopengrok-0.9.pkg

Пакет установился в /usr/opengrok/. Сразу же попробовал запустить /usr/opengrok/bin/OpenGrok index . Оказалось, что требуется установить CTags, которые пришлось скачать из репозитория Blastwave.org:
# export PATH=$PATH:/opt/csw/bin
# pkgutil install ectags

Так как скрипт /usr/opengrok/bin/OpenGrok ищет файл exctags в пути, указанном переменной PATH, а /opt/csw/bin у меня по умолчанию нет в PATH, то я сделал символическую ссылку:
# ln -s /opt/csw/bin/ectags /usr/bin/exctags

Но и после этого скрипт не мог найти exctags. Залез в исходный код и обнаружил:
FindExuberantCTags()
{
case “${OS_NAME}:${OS_VERSION}” in
SunOS:5.10) commandName=”" ;;
SunOS:5.11) commandName=”exctags” ;;
Linux:*) commandName=”ctags-exuberant” ;;
*) commandName=”" ;;
esac

if [ -z "${commandName}" ]
then
Error “Unable to determine Exuberant CTags command name” \
“for ${OS_NAME} ${OS_VERSION}”
return
fi

Which “${commandName}”
}

Почему для версии системы SunOS:5.10 (это означает Solaris 10) указано пустое место? Не понял юмора разработчиков и исправил
SunOS:5.10) commandName=”" ;;
на
SunOS:5.10) commandName=”exctags” ;;

Как я выяснил позднее, можно было использовать переменную среды EXUBERANT_CTAGS.

Далее требуется связать OpenGrok с сервером Glassfish, но для начала надо указать переменные среды. Если не указать OPENGROK_APP_SERVER, то будет использоваться Tomcat.

# export OPENGROK_APP_SERVER=Glassfish
# export OPENGROK_GLASSFISH_BASE=/opt/glassfish/glassfish
# ./OpenGrok deploy
Loading the default instance configuration …
Installing /usr/opengrok/bin/../lib/source.war to /opt/glassfish/glassfish/domains/domain1/autodeploy …

Start your application server (Glassfish), if it is not already
running, or wait until it loads the just installed web application.

OpenGrok should be available on :/source
where HOST and PORT are configured in Glassfish.

После этого успешно запустил
# /usr/opengrok/bin/OpenGrok index
и начал ждать, когда закончится индексирование. Ждать пришлось долго.

Информация для людей, которые не на Solaris/OpenSolaris. Для всех прочих систем предлагается скачать архив opengrok-0.9.tar.gz. Запуск в этом случае надо осуществлять не через скрипт /usr/opengrok/bin/OpenGrok, а с помощью
java -jar /$OPENGROK/lib/opengrok.jar. Это может быть полезно и разработчикам OpenSolaris, которые хотят использовать специфическую конфигурацию.

Запуск в веб-браузере

http://127.0.0.1:8080/source/

Ссылки
http://hub.opensolaris.org/bin/view/Project+opengrok/files
http://hub.opensolaris.org/bin/view/Project+opengrok/installdescription
http://openbabel.org