Долго искал я в инете, как собрать библиотеку для разработки BOINC-приложений, которая была бы совместима с GCC (это мне требовалось для работы кросс-компилятора из Linux в Windows). Ничего не найдя, я решил продраться самому, и вот вроде, что-то получилось. Программы, собранные с этой библиотекой, успешно работают на Windows-клиентах. Собственно, далее пойдет сырая инструкция, как это сделать.
Собираем пакеты для Slackware – это простой архив TGZ=tar.gz. Потребуется сборка двух пакетов – один собственно сервер BOINC, предназначенный для работы в ОС Linux. Другой – версия библиотеки BOINC для Windows. В процессе сборки может обнаружиться недостаток в системе определенных библиотек – их нужно установить самостоятельно.
1. Скачать исходники из официального репозитария:
root# svn co http://boinc.berkeley.edu/svn/branches/server_stable ~/boinc
2. Пройти тест возможностей MySQL, CGI-сервера, что необходимо для успешного функционирования сервера BOINC.
root# ~/boinc/test/test_sanity.py
Рекомендация: Лучше пароль root не устанавливать, а разрешить вместо этого только локальные соединения. Это осуществляется путем включения опции skip-networking в конфигурационном файле /etc/my.cnf. При этом обращения к MySQL будут осуществляться не через сеть, а через внутренние UNIX-сокеты.
3. Создать две копии исходных файлов – по копии на каждый из будущих пакетов:
root# cp -R ~/boinc ~/boinc.linux root# cp -R ~/boinc ~/boinc.mingw
Сборка сервера BOINC
2.1. Запустить скрипт, проверяющий параметры окружения:
root# ./_autosetup
2.2. Сконфигурировать исходные тексты, что приведет к созданию файла Makefile с правилами сборки. Отметим, что сборка клиента для платформы Linux нас не интересует, поэтому отключим сборку этого компонента:
root# ./configure --disable-client -C
2.3. Непосредственно сборка сервера:
root# make
2.4. Установим полученный сервер в каталог /opt/boinc:
root# make DESTDIR=/opt/boinc install
2.5. В целях безопасности сервер BOINC следует запускать от имени специального пользователя. Поэтому создадим его:
root# useradd boinc
2.6. Отредактировать файл групп /etc/group, так чтобы группа boinc включала в себя пользователя, от чьего имени запускается веб-сервер:
boinc: boinc,daemon
2.7. TODO: Внести изменения в настройки веб-сервера:
httpd -V | grep DefaultType application/octet-stream
2.8. Перезапустить веб-сервер:
/etc/rc.d/rc.httpd restart
Сборка библиотеки BOINC для Windows
3.1. Внести вручную изменения в исходный код. (какие именно – смотри ниже).
3.2. Запустить скрипт, проверяющий параметры окружения:
root# ./_autosetup
3.3. Сконфигурировать исходные тексты. Сборка как клиента, так и сервера нас не интересует, поэтому отключим оба компонента:
root# ./configure --prefix=/usr/local/i386-pc-mingw32 \ --includedir=/usr/local/i386-pc-mingw32/include \ --oldincludedir=/usr/local/i386-pc-mingw32/include \ --host=i386-pc-mingw32 --disable-client --disable-server -C
3.4. Добавить в lib/Makefile к параметру LIBS дополнительную библиотеку -lgdi32
3.5. Непосредственно сборка библиотеки:
root# make
3.6. Установим полученный сервер в каталог /opt/boinc: TODO: надо чтоб хедер-файлы схватывались кросс-компилятором
root# make DESTDIR=/opt/boinc.mingw install
Патчи
Какие изменения нужно внести в исходный код BOINC, чтобы можно было скомпилировать версию библиотеки для Windows.
* изменить строку в m4/check_ssl.m4 (дописать /usr/local/i386-pc-mingw32):
for dir in $check_ssl_dir /usr/local/i386-pc-mingw32 /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/local /usr; do
* lib/boinc_win.h: закомментировать строки
#include <dbghelp.h> #define SetClassLongPtr SetClassLong #define GCLP_HICON GCL_HICON #define GCLP_HICONSM GCL_HICONSM
* lib/miofile.h: закомментировать так
//#ifndef _WIN32 #include <string> //#endif
* lib/filesys.h: добавить строку между строк
#if defined(_WIN32) && !defined(__CYGWIN32__) #include <string> #else
* lib/filesys.h: добавить строку перед строкой
typedef void* HANDLE; struct FILE_LOCK {
* отредактировать zip/Makefile.am следующим образом:
AM_CPPFLAGS = -I$(top_srcdir)/zlib -I$(top_srcdir)/lib -I$(top_srcdir)/zip -I$(top_srcdir)/zip/zip -I$(top_srcdir)/zip/unzip -DDLL (убрать -DUNIX) ... ./zip/zipup.c ##./zip/unix/z_unix.c \ ##./unzip/unix/unix.c
Программы, полученные с этой библиотекой, хоть и работают, но мне не нравится метод получения библиотеки – какой-то хак. Поэтому разумеется, пожелания и критика приветствуются.