Библиотека BOINC для Windows и Linux

Долго искал я в инете, как собрать библиотеку для разработки 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

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

Leave a Reply

Your email address will not be published. Required fields are marked *