Сборка модуля imagick.so для php

Под Solaris как всегда всё приходится собирать вручную. И так, берём Solaris Studio и собираем.

Что бы получить модуль imagick.so для php, нужно сначала собрать сам ImageMagick, а потом на основе его собрать модуль imagick.so.

Тестовый стенд: Solaris 11, SolarisStudio 12.3

1) Сборка ImageMagick.

Качаем свежую версию исходников с сайта http://www.imagemagick.org/script/download.php , распаковываем и собираем такой командой:

#CC="/opt/solarisstudio12.3/bin/cc" CXX="CC" CFLAGS=-m64 CPPFLAGS=-m64 CCASFLAGS=-m64 LDFLAGS="-m64 -lsocket -lnsl -lrt -lresolv" ./configure --prefix=/opt/imagemagick && gmake

Если не указать либы -lsocket -lnsl -lrt -lresolv, то сборка прервётся с руганью

Undefined first referenced
symbol in file
symbol belongs to implicit dependency /lib/64/libsocket.so

Это специфика сборки под Solaris. Замечу, что при сборке через gcc этого не требуется — сборка проходит нормально и без этих библиотек. После сборки, в папке /opt/imagemagick/lib получаем либы libMagickWand-6.Q16.so.1.0.0, libMagickCore-6.Q16.so.1.0.0, которые положим в /usr/local/lib, что бы не мешались с основными либами и создадим симлинки:

#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand-6.Q16.so
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand-6.so
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand.so.6
#ln -s libMagickWand-6.Q16.so.1.0.0 libMagickWand.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore-6.Q16.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore-6.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore.so
#ln -s libMagickCore-6.Q16.so.1.0.0 libMagickCore.so.6

Теперь добавим новую папку в список поиска библиотек:

#crle -64 -c /var/ld/64/ld.config -u -l /usr/local/lib

2) Сборка imagick.so

Качаем свежую версию с сайта http://pecl.php.net/package/imagick. Замечу, что успешно у меня собрались только версии 3.1.Х. Версии же ниже не собирались и валились с ошибками

"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined struct/union member: safe_mode
"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined symbol: CHECKUID_CHECK_FILE_AND_DIR
"/export/home/skeletor/imagick-2.3.0/imagick_class.c", line 9483: undefined symbol: CHECKUID_NO_ERRORS
cc: acomp failed for /export/home/skeletor/imagick-2.3.0/imagick_class.c

Если ошибки CHECKUID_CHECK_FILE_AND_DIR и CHECKUID_NO_ERRORS можно исправить (указав их значения в одном из хидеров), то safe_mode — никак. Есть даже баг https://bugs.php.net/bug.php?id=61501
И так, переходим к сборке версии 3.1.0.RC2. Я её собирал с такими параметрами:

PKG_CONFIG_PATH=/opt/imagemagick/lib/pkgconfig/ CC="/opt/solarisstudio12.3/bin/cc" CXX="CC" CFLAGS=-m64 CPPFLAGS=-m64 CCASFLAGS=-m64 LDFLAGS="-m64 -lMagickCore -lMagickWand" ./configure LDFLAGS="-m64 -lMagickCore -lMagickWand" --with-php-config=/usr/php54/bin/php-config --with-imagick=/opt/imagemagick

При этом, если запустить сразу сборку — то получим собранный, но не работоспособный модуль, который при подключении к php будет валить сам php с сообщением:

ld.so.1: php-fpm: fatal: relocation error: file /usr/php54/lib/php/extensions/no-debug-non-zts-20100525/imagick.so: symbol MagickWandGenesis: referenced symbol not found

Каким-то образом, Makefile не добавлять в сборку поддержку либ -lMagickCore -lMagickWand, поэтому добавим их вручную в Makefile, в строку LDFLAGS и только после этого начнём сборку:

#gmake

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

Примечание.

При переносе на другую систему — обязательно нужно так же наличии либ libMagickWand и libMagickCore.

Сборка модуля imagick.so для php: 3 комментария

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *