Сборка HipHop-PHP на FreeBSD 9

Курск

Более года назад мне потребовалось собрать транслятор HipHop-PHP на морально устаревшей FreeBSD 6.1, что стоило некоторых усилий, поскольку на тот момент разработчиками FreeBSD не поддерживалась в принципе. Не так давно эта ОС получила официальную поддержку в Facebook и, соответственно, руководство по сборке в официальной вики на гитхабе.

Несмотря на то, что в самом начале этого руководства упоминается, что оно применимо и к девятой FreeBSD, в действительности в процессе придётся с тремя проблемами, которые делают невозможными сборку и установку HipHop-PHP на FreeBSD 9.х как минимум с GCC 4.6 и Binutils 2.22, о чём свидетельствовали несколько нерешённых жалоб, которые удалось нагуглить в процессе. Возможно, авторам этих репортов удалось обойти эти трудности, но в таком случае они не нашли в себе сил опубликовать решения для тех, кто наступит на эти грабли после них. Я решил исправить это недоразумение.

% mkdir -p /usr/src/lib/libc/gen
% freebsd-update fetch && freebsd-update install
% pkg_add -r cmake flex bison re2c openssl gd libxml2 pcre oniguruma boost-libs libmemcached libmcrypt binutils expat mysql50-client wget tbb icu openldap24-client libexecinfo gcc46 gawk git cclient mc
На этом этапе разработчики предупреждают, что лучше использовать gcc44, но я решил пойти комсомольским путём и использовал актуальную версию gcc46.

% cd /usr/src/contrib/
% git clone git://canonware.com/jemalloc.git
% autoconf
% ./configure --prefix=/usr/local
% gmake install
% cd /usr/local/lib
% ln -s libc-client4.so libc-client.so
% mkdir ~/hhbuild && cd ~/hhbuild && mkdir libs
% git clone git://github.com/facebook/hiphop-php.git
% cd hiphop-php
% git submodule init
% git submodule update
% setenv CC /usr/local/bin/gcc46
% setenv CXX /usr/local/bin/g++46
% setenv HPHP_HOME `pwd`
% setenv HPHP_LIB `pwd`/bin
% setenv CMAKE_PREFIX_PATH `pwd`/../libs
% cd ..
% fetch https://github.com/downloads/libevent/libevent/libevent-1.4.13-stable.tar.gz
% tar -zxf libevent-1.4.13-stable.tar.gz
% cd libevent-1.4.13-stable
% patch -p1 < ../hiphop-php/src/third_party/libevent-1.4.13.fb-changes.diff
% ./configure --prefix=$CMAKE_PREFIX_PATH
% make install
% cd .. && rm -rf libevent-1.4.13-stable
% fetch //curl.haxx.se/download/curl-7.20.0.tar.gz
% tar -zxf curl-7.20.0.tar.gz
% cd curl-7.20.0
% patch -p1 < ../hiphop-php/src/third_party/libcurl.fb-changes.diff
% ./configure --prefix=$CMAKE_PREFIX_PATH
% make install
% cd .. && rm -rf curl-7.20.0
% fetch //cpp.in/dev/hphp-freebsd-20120214.patch
% cd hiphop-php
% patch < ../hphp-freebsd-20120214.patch
% cd ..
% fetch //cpp.in/dev/hphp-libmemcached-1.0.patch
% cd hiphop-php
% patch < ../hphp-libmemcached-1.0.patch

Допишем в /etc/libalias.conf:
[hphp]
libstdc++.so.6 /usr/local/lib/gcc46/libstdc++.so.6

[hphpi]
libstdc++.so.6 /usr/local/lib/gcc46/libstdc++.so.6

[program]
libstdc++.so.6 /usr/local/lib/gcc46/libstdc++.so.6

Использование пути gcc46/libstdc++.so.6, предлагаемого официальной вики, подразумевает, что при сборке будет использоваться более старая версия libstdc++.so.6 из /usr/lib, что противоречит минимальным требованиям HipHop-PHP (GLIBCXX_3.4.10) и вызывает ошибку при компиляции hphpi:
Building hphpi
/libexec/ld-elf.so.1: /usr/lib/libstdc++.so.6: version GLIBCXX_3.4.10 required by /root/hhbuild/hiphop-php/src/hphp/hphp not found
*** Error code 1

Для обеспечения нормальной работы HipHop-PHP потребуется заменить /usr/lib/libstdc++.so.6 более новой версией:
% rm /usr/lib/libstdc++.so.6
% ln -s /usr/local/lib/gcc46/libstdc++.so.6 /usr/lib/libstdc++.so.6

Вторым важным моментом является сборка binutils с поддержкой национальных языков, которая вызывает следующию ошибку компиляции:
/usr/local/bin/ld: note: 'libintl_dgettext' is defined in DSO /usr/local/lib/libintl.so.9 so try adding it to the linker command line
/usr/local/lib/libintl.so.9: could not read symbols: Invalid operation
collect2: ld returned 1 exit status
*** Error code 1

Поскольку поддержка национальных мне не нужна, я просто пересобрал binutils без неё и проблема отпала.
% cd /usr/ports/devel/binutils && make config
% make && make deinstall && make install

Если вам эта поддержка всё-таки нужна, то решить эту проблему несложно, ключ к её пониманию находится здесь.

Третьей проблемой (в действительности они проявлялись в обратном порядке), с которой я столкнулся при сборке было использование устаревшей pcre_info вместо рекомендованной в настоящее время pcre_fullinfo
/root/hhbuild/hiphop-php/src/runtime/base/preg.cpp:138:38: error: 'pcre_info' was not declared in this scope
*** Error code 1

Что решается правкой строки 138 в проблемном файле preg.cpp (пуллреквест на гитхабе сделал)
// меняем
// if (pcre_info(pce->re, NULL, NULL) == PCRE_ERROR_BADMAGIC) {
// на
 if (pcre_fullinfo(pce->re, NULL, NULL, NULL) == PCRE_ERROR_BADMAGIC) {

После чего можно спокойно возвращаться к нашим баранам и приступать к сборке и установке HipHop-PHP
% cd ~/hhbuild/hiphop-php
% cmake .
% make

Через несколько минут ваш HipHop-PHP будет готов к использованию.

11 комментариев

бля, красава ваще
  • аватар SeL
  • 0
фрибсд-6 это же старье, у меня даже диска с ней не осталось, почему бы не обновиться хотя бы на 8?
Речь, как я понял о девятке. Про шестерку было сказано попутно.
  • аватар SeL
  • 0
Я так понял, что ставилось на 6ку, а как раз о 9ке сказано попутно. Но вообще разницы по идее должно быть никакой.
На шестёрку ставилось больше года назад, здесь речь о девятке. Шестую версию уже мало кто использует и рассказывать о ней смысла нет, разве что для личной забавы.

Правда, забавного в этом мало, описание процесса скорее будет вышибать слезу, как в своё время «Рабыня Изаура» вышибала из советский домохозяек. Для неё только перечисление зависимостей займёт строк больше, чем есть в коде этого топика. Несмотря на то, что обновление с шестой на девятую версию несколько нетривиально при условии, что это продакшен, всё же обновиться будет проще, чем собрать и заставить на ней работать HipHop-PHP без
terminate called after throwing an instance of 'HPHP::UncatchableException'
  what():  infinite recursion detected
Потому что есть софт, который не позволяет этого делать. Обновляться есть смысл только на девятку, у 8.2 через месяц заканчивается поддержка и она переходит в статус устваревшей.
  • аватар SeL
  • 0
О_о
как я быстро старею, 8-ка вышла когда я был курсе на 3-4
Уже десятая на подходе, отращивай бороду.
И заправляй свитер в джинсы )
а что за проект у вас крутится на HipHop-PHP? к чему такие извраты с пхп аля фейсбук? =)
  • аватар ololo
  • 0
У меня нет ни одного проекта, это было сделано в рамках выполнения задач для третьих лиц. По результатам этого поста я отправил патч в фейсбук патч и его приняли в репозиторий хипхопа, сейчас описанная проблема №3 уже неактуальна.

Чтобы оставлять комментарии, нужно или зарегистрироваться.