Рубрики
MacOS

Сборка PHP 5.3.x под MacOS X 10.6 с поддержкой iconv

Тот, кто заходил/читал мой блог раньше, скажет: «Кажется, я уже это видел». И будет прав. Давным давно я уже писал пост о том, как скомпилить php на MacOS X с поддержкой oracle, iconv и прочих библиотек. Но время идет, уже давно вышли новые версии и php и macosx, а проблема все остается нерешенной, правда пути ее решения несколько изменились.
Не буду рассказывать как включить поддержку Oracle в php, про это вы можете прочитать в моем старом посте:
Настройка Apache+PHP+MsSQL+Oracle на Mac OS X Leopard
, лучше расскажу как решить эту надоевшую уже проблему сборки php 5.3.[5678] с поддержкой iconv.

В инете полно заметок, постов на эту тему, но к сожалению на моей системе Mac OS X Snow Leopard 10.6.8 и PHP 5.3.8 все эти советы не помогли :(. Ни накладывание патчей на ext/iconv/iconv.c, ни накатывание libiconv всяких версий с заменой системной и в прочие места — ничего это не сработало, а в некоторых случаях даже что-то поломало. В моем случае к успеху привели вот такие действия:

Пункт номер раз.
Ставим свежую версию libiconv из портов (на данный момент это уже 1.14).

# Первым делом обновим сами порты чтобы все было свеженькое
[13:14] cmd#:4999
kostik@KOsTIK: ~> sudo port -v selfupdate
Password:
--->  Updating MacPorts base sources using rsync
...
# Если у вас уже стоит libiconv, то его надо обновить:
[13:14] cmd#:4999
kostik@KOsTIK: ~> sudo port upgrade libiconv
# Если же libiconv не стоял, то ставим его:
[13:14] cmd#:4999
kostik@KOsTIK: ~> sudo port install libiconv

Пункт номер два.
Конфигурим php, не забывая указать где искать iconv, а именно, поскольку libiconv ставился из портов, то это /opt. Добавляем строчку —with-iconv-dir=/opt.

[17:18] cmd#:5068
kostik@KOsTIK: ~/Sources/php-5.3.8> ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man --with-zlib --with-bz2 --with-curl --enable-ftp --with-gd --with-gettext=/opt/local --enable-mbstring --with-mcrypt=/opt/local --with-mhash=/opt/local --with-mssql=/opt/local --with-mysql=/usr/local/mysql --with-oci8=instantclient,/opt/local/lib/oracle --with-png-dir=/opt/local --with-jpeg-dir=/opt/local --with-freetype-dir=/opt/local --with-iconv-dir=/opt --with-apxs2=/usr/sbin/apxs --with-config-file-path=/private/etc/ --enable-mod-charset --enable-gd-native-ttf --with-mysqli=mysqlnd --with-pdo-mysql=/usr/local/mysql/bin/mysql_config --with-mysqli=/usr/local/mysql/bin/mysql_config

Пункт номер три.
Патчим Makefile.global. Это единственное, что мне пришлось сделать сверх обычной процедуры компиляции. (/* не считая тех часов, которые были потрачены на попытки решить эту проблему */). Вот патч. Его можно сохранить в файлик и накатить через patch.

--- /Users/kostik/Sources/php-5.3.8/Makefile.global·2010-09-05 16:29:47.000000000 +0400
+++ Makefile.global·2011-10-17 13:55:44.000000000 +0400
@@ -18,7 +18,7 @@
 ···-@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1

 libs/libphp$(PHP_MAJOR_VERSION).bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)
-···$(CC) $(MH_BUNDLE_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_SAPI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ && cp $@ libs/libphp$(PHP_MAJOR_VERSION).so
+···$(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_SAPI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) $(MH_BUNDLE_FLAGS) -o $@ && cp $@ libs/libphp$(PHP_MAJOR_VERSION).so

 install: $(all_targets) $(install_targets)

Если сохранить этот патч в файлик, скажем, Makefile.global.patch, то накатить его можно так:

[17:52] cmd#:5041
kostik@KOsTIK: ~/Sources/php-5.3.8> patch -p0 < Makefile.global.patch

Пункт номер четыре-пять
Запускаем make, (надеюсь) успешно компилим и устанавливаем.

[18:02] cmd#:5085
kostik@KOsTIK: ~/Sources/php-5.3.8> make

Build complete.
Don't forget to run 'make test'.

[18:08] cmd#:5086
kostik@KOsTIK: ~/Sources/php-5.3.8> sudo make install
Password:
Installing PHP SAPI module:       apache2handler
/usr/share/httpd/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1/build-1/libtool' libs/libphp5.so /usr/libexec/apache2
/usr/share/apr-1/build-1/libtool --mode=install cp libs/libphp5.so /usr/libexec/apache2/
cp libs/libphp5.so /usr/libexec/apache2/libphp5.so
Warning!  dlname not found in /usr/libexec/apache2/libphp5.so.
Assuming installing a .so rather than a libtool archive.
chmod 755 /usr/libexec/apache2/libphp5.so
[activating module `php5' in /private/etc/apache2/httpd.conf]
Installing PHP CLI binary:        /usr/bin/
Installing PHP CLI man page:      /usr/share/man/man1/
Installing build environment:     /usr/lib/php/build/
Installing header files:          /usr/include/php/
Installing helper programs:       /usr/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/share/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/lib/php/
[PEAR] Archive_Tar    - already installed: 1.3.7
[PEAR] Console_Getopt - already installed: 1.3.0
[PEAR] Structures_Graph- already installed: 1.0.4
[PEAR] XML_Util       - already installed: 1.2.1
[PEAR] PEAR           - already installed: 1.9.4
Wrote PEAR system config file at: /etc/pear.conf
You may want to add: /usr/lib/php to your php.ini include_path
/Users/kostik/Sources/php-5.3.8/build/shtool install -c ext/phar/phar.phar /usr/bin
ln -s -f /usr/bin/phar.phar /usr/bin/phar
Installing PDO headers:          /usr/include/php/ext/pdo/

После всего этого, осталось только проверить:

[14:10] cmd#:5032
kostik@KOsTIK: ~/Sources/php-5.3.8> php -v
PHP 5.3.8 (cli) (built: Oct 17 2011 14:08:01)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with the ionCube PHP Loader v4.0.7, Copyright (c) 2002-2011, by ionCube Ltd.
[14:17] cmd#:5033
kostik@KOsTIK: ~/Sources/php-5.3.8> php -m
[PHP Modules]
bz2
Core
ctype
curl
date
dom
ereg
fileinfo
filter
ftp
gd
gettext
hash
iconv
ionCube Loader
json
libxml
mbstring
mcrypt
mhash
mssql
mysql
mysqli
oci8
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
SQLite
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

That's all folks! как говорится. Надеюсь следующие версии будут ставиться так же легко и просто...