Не дивлячись на те, що Mac OS X 10.6 (Snow Leopard) був випущений уже більше місяця тому, а мені “пощупати” його так і не вдавалось досі (із-за відсутності вільного часу). Тому, я недавно оновив свого Leopard-а 🙂 В цьому процесі жодних проблем не було виявлено, за винятком USB Overdrive, який просто “убивав” систему своїм старим “kext”-ом, після першого перезавантаження. Але у новій версії 3.x це все було поправлено.
Найбільше веб-девелоперів, мабуть, порадував новий PHP 5.3 , який тепер комплектується у парі із останнім Apache в режимі 64bit. Але для тих людей, кому стандартної комплектації модулів не вистачає – вдаються до ручного збору PHP під свої потреби. Але у мене була інша особливість – мені потрібно зробити “downgrade” до останньої версії 5.2.x, так як PHP 5.3 поки знаходиться в такому стані, в якому його нормально використовувати не можна. Та і є багато нюансів із “deprecated” особливостями, після яких необхідно буде переглянути старі проекти чи їх окремі бібліотеки на сумісність з новим PHP…
На перший погляд, нічого складного не мало б бути. Але перше випробування перезібрати PHP не дало позитивних результатів. Все “розвалювалось” із-за модуля “iconv“. Спершу я пробував сам руками “ковиряти”, але потім “погугливши, виявилось, що це все набагато серйозніше, і з цим пов’язаний баг між Apple & PHP. На стороні PHP відкрито кілька багів ( 48195, 49267 ), а Apple, просто обійшлась “патчем”. Саме важливо те, що люди які використовували “патч” чи пропозиції – робили різні відгуки відносно того, кому це “допомогло”. У мене геть інша ситуація була, так як у мене ця проблема виникала саме із PHP 5.2.11. Спершу проблема була у тому, що для нової ОС я робив відновлення всіх даних із Time Capsule, а як виявилось, у /usr/local/ у мене “підтягнувся” старий “iconv”. Звісно, при компіляції PHP компілятор геть інша помилку видавав. Тобто, говорячи про те, що бібліотека застаріла. Звісно, я обновив “iconv”:
1 2 3 |
$ ./configure --prefix=/usr/local $ make $ sudo make install |
І ось звідси і почались більш серйозніші проблеми:
Undefined symbols:
“_libiconv_open”, referenced from:
_do_convert in gdkanji.o
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_decode in iconv.o
__php_iconv_mime_decode in iconv.o
_php_iconv_stream_filter_ctor in iconv.o
_convert in encodings.o
“_res_9_dn_expand”, referenced from:
_zif_dns_get_mx in dns.o
“_res_9_search”, referenced from:
_zif_dns_check_record in dns.o
_zif_dns_get_mx in dns.o
“_libiconv”, referenced from:
_do_convert in gdkanji.o
__php_iconv_appendl in iconv.o
__php_iconv_appendl in iconv.o
_php_iconv_string in iconv.o
_php_iconv_string in iconv.o
__php_iconv_strlen in iconv.o
__php_iconv_substr in iconv.o
__php_iconv_strpos in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
__php_iconv_mime_encode in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_php_iconv_stream_filter_append_bucket in iconv.o
_convert in encodings.o
“_libiconv_close”, referenced from:
_do_convert in gdkanji.o
“Погугливши”, і з різних варіантів, які начебто допомагали іншим користувачам, я для себе знайшов рішення:
- Для ти, хто ставить Apache/PHP у 64bit режимі – повідомляємо компілятору про свої бажання 🙂
1234$ export MACOSX_DEPLOYMENT_TARGET=10.6 \CFLAGS="-arch x86_64" \CXXFLAGS="-arch x86_64" \GDLIB_CFLAGS="-arch x86_64" - Дальше якраз і є часткове рішення нашої проблеми. Вказуємо компілятору опції для iconv бібліотеки:
1$ env LIBS="-lresolv -liconv" ./configure --with-iconv=/usr/local/bin/iconv
Після старту конфігуратора ми маємо побачити текст, що свідчить про те, що iconv бібліотека знайдена:checking for iconv support… yes
checking for libiconv in -liconv… yes
checking if iconv is glibc’s… no
checking if using GNU libiconv… 269yes
checking if iconv supports errno… yesP.S: Для тесту я лише вказав “–with-iconv” опцію. Але Ви можете задавати більш детальний опис конфігураційних параметрів (GD біліотека, БД і тд.).
- Останній крок: необхідно поправити Makefile, що був згенерований конфігуратором (./configure ). Відкриваємо редактором файл /php-x.x.x/Makefile і шукаємо наступний текст: “libs/libphp$” (без лапків). У мене для PHP 5.2.11 – це 140-141 лінійки. Заміняємо його на:
12libs/libphp$(PHP_MAJOR_VERSION).bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)$(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
- Компілюємо PHP, і якщо все відбулось без помилок – встановлюємо його.
12$ make$ sudo make install
- Перезапускаємо ВЕБ-сервер.
Ось і все 🙂 Тепер можемо любуватися модулем “iconv” у
1 |
$ php -m |