Тот, кто заходил/читал мой блог раньше, скажет: «Кажется, я уже это видел». И будет прав. Давным давно я уже писал пост о том, как скомпилить 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! как говорится. Надеюсь следующие версии будут ставиться так же легко и просто...