Menu

Компилирование bzib, zlib, jpeg для NaCl

Так сложилось, что мне удобнее для работы использовать ОС Window. Не то что бы я не уважаю *nix системы,просто удобнее (в оправдание, скажу что приходилось работать несколько месяцев на Ubuntu). Да и долгое время писал на VC++ под windows.

Сейчас хочу поделиться опытом компилирования некоторых библиотек для NaCL под управлением ОС Windows. Ведь то что пишется в *nix системах, в Windows иногда делается через "танцы с бубном".

Задача состоит в том, что бы скомпилировать порт OpenCV для NaСl под Windows.

Первое что делалось, на диске D: появился(создался) каталог NaCL. В нем создался каталог nacl_sdk, в который был установлен Native Client SDK. В итоге получилось дерево (для общего представления):

D:\NaCL
D:\NaCL\nacl_sdk
...
D:\NaCL\nacl_sdk\pepper_31
....

За основу был взят уже готовый (я бы сказал почти, из-за jpeg) порт от metacaptcha.com, исходник на github тут. Хорошее описание по компилированию, так же прилагается.

Но когда это надо сделать под Win, не всё так хорошо. Если заранее установить cygwin, то проблем будет все-таки меньше. :) В моем случае, библиотека bzip компилировалась без cygwin.

Аккуратно (а может и не аккуратно) были распакованы архивы с библиотеками в каталог NaCL (D:\NaCL), что сотворило следующее:

D:\NaCL\bzip2-1.0.6
D:\NaCL\jpeg-6b
D:\NaCL\zlib-1.2.8

Подготовка.

Перед тем как начать процесс, стоит проверить, что бы в были заданы "переменные среды" (Панель управления->Система->Дополнительные параметры->Переменные среды) (варианты для моего случая):

NACL_32=D:\NaCL\nacl_sdk\pepper_31\toolchain\win_x86_glibc\bin\i686-nacl
NACL_64=D:\NaCL\nacl_sdk\pepper_31\toolchain\win_x86_glibc\bin\x86_64-nacl
NACL_PREFIX=D:\NaCL\nacl_sdk\pepper_31\toolchain\win_x86_glibc\x86_64-nacl
NACL_SDK_ROOT=D:\NaCL\nacl_sdk\pepper_31
PATH=%PATH%;D:\NaCL\nacl_sdk\pepper_31\tools

Компилирование bzip2 (без cygwin).

В Makefile мне пришлось закомментировать две строки - 40 и 41:

# rm -f libbz2.so.1.0
# ln -s libbz2.so.1.0.6 libbz2.so.1.0

Они выдавали ошибки при выполнении их через make (мой вариант этого файла можно найти тут).

после чего, запускам cmd.exe, заходим в каталог с bzip:

d:
cd \NaCL\bzip2-1.0.6

и запускаем компиляцию для x64:

make -f Makefile-libbz2_so CC="%NACL_64%-gcc -m64"

Можно заметить, что немного отличается от варианта в документации для *nix системы

Далее, копируем полученную библиотеку:

copy libbz2.so.1.0.6 "%NACL_PREFIX%\lib\libbz2.so"

В текущем случае используется ОС x64, поэтому lib -- это lib64 (т.к. при установке NaCl SDK, создался файл lib64 который является symbol-link на каталог lib, но в win не работает :) )

Вместо "make clean" использовал:

del bzip2.o
del libbz2.so.1.0.6
del libbz2.so.1.0
del bzip2-shared
del blocksort.o
del huffman.o
del crctable.o
del randtable.o
del compress.o
del decompress.o
del bzlib.o

(по тойже причине, что и copy)

Далее по аналогии:

make -f Makefile-libbz2_so CC="%NACL_32%-gcc -m32"
copy libbz2.so.1.0.6 "%NACL_PREFIX%\lib32\libbz2.so"
copy *.h "%NACL_PREFIX%\include"

Вуа-ля, ГОТОВО!!!

Компилирование jpeg и zlib с использованием cygwin.

С библиотеками jpeg и zlib без cygwin -- было сложнее, поэтому было решено его установить.

Качаем и устанавливаем cygwin из http://cygwin.com/install.html

Из дополнительных изменений, пришлось в файлы "configure" (обоих библиотек), сразу после первого блока комментариев, добавить строку:

CC=/cygdrive/d/nacl/nacl_sdk/pepper_31/toolchain/win_x86_glibc/bin/x86_64-nacl-gcc

(это путь к NaCl gcc компилятору)

Запускам консоль с cygwin

Входим в папку zlib-1.2.8:

cd /cygdrive/d/nacl/zlib-1.2.8

и выполняем по порядку команды, как и указано на metacaptcha.com:

./configure --enable-shared
make shared CC=$NACL_64-'gcc -m64' AR=$NACL_64-ar ARFLAGS=rc CFLAGS='-O3 -DHAVE_HIDDEN' LDFLAGS='-O3 -fPIC -DHAVE_HIDDEN' LDSHARED='$(CC) -shared -Wl,-soname -Wl,libz.so' SHAREDLIB=libz.so SHAREDLIBM=libz.so.1.2.8 SHAREDLIBV=libz.so.1
cp libz.so.1 $NACL_PREFIX/lib64/libz.so
make clean
make shared CC=$NACL_32-'gcc -m32' AR=$NACL_32-ar ARFLAGS=rc CFLAGS='-O3 -DHAVE_HIDDEN' LDFLAGS='-O3 -fPIC -DHAVE_HIDDEN' LDSHARED='$(CC) -shared -Wl,-soname -Wl,libz.so' SHAREDLIB=libz.so SHAREDLIBM=libz.so.1.2.8 SHAREDLIBV=libz.so.1
cp libz.so.1 $NACL_PREFIX/lib32/libz.so
cp zlib.h zconf.h $NACL_PREFIX/include

Затем, перемещаемся к jpeg:

cd /cygdrive/d/nacl/jpeg-6b

Тут главное не забыть заранее в этот же каталог сохранить патч nacl-jpeg-v6b-makefile.cfg.patch

И опять по инструкции от metacaptcha.com (но не до конца):

Патчим:

patch < nacl-jpeg-v6b-makefile.cfg.patch

Компилируем:

./configure
make libjpeg.so CC=$NACL_64-gcc CFLAGS='-m64 -fPIC -O2 -I.' LDFLAGS='-shared -Wl,-soname -Wl,libjpeg.so -o libjpeg.so'
mv libjpeg.so $NACL_PREFIX/lib64/libjpeg.so
make clean
make libjpeg.so CC=$NACL_32-gcc CFLAGS='-m32 -fPIC -O2 -I.' LDFLAGS='-shared -Wl,-soname -Wl,libjpeg.so -o libjpeg.so'
mv libjpeg.so $NACL_PREFIX/lib32/libjpeg.so

Последняя команда (make install-headers prefix=$NACL_PREFIX) у меня не выполнилась.

Посмотрев что делает "install-headers", я просто скопировал файлы:

jconfig.h
jpeglib.h
jmorecfg.h
jerror.h

в каталог D:\NaCL\nacl_sdk\pepper_31\toolchain\win_x86_glibc\x86_64-nacl\include

И в заключение, для самых ленивых (таких как я), уже скомпилированный вариант библиотек можно найти тут. Останется распаковать архив и раскидать файлы по нужным каталогам.

Может удача вам улыбнется, и не надо будет всё это повторять.

Удачи. ;)

Tags:
NaCl, bzip2, zlib, jpeg

Keep your comment...