note 31690 added to ref.recode

From: Date: Wed, 30 Apr 2003 11:51:19 +0000
Subject: note 31690 added to ref.recode
Groups: php.notes 
Request: Send a blank email to php-notes+get-47289@lists.php.net to get a copy of this message
Hope this might help someone: I tried to compile php 4.3.2-RC2 (+some older versions) with recode AND imap (and gd+png+jpeg support, ldap, gettext, zlib .. but these are not interesting right now). Why? I needed to run Imp + Horde + Turba. Turba talks to LDAP directory (and LDAP uses utf-8 encoding which I need to convert to iso-8859-2), so I modified Turba to use 'recode' for charset conversions utf8<->iso8859-2. System: FreeBSD4.7+Apache 1.3.27+Ben SSL I either could not properly compile OR after compiling apache coredumped. Problem was: imap (libc-client) and recode (librecode) use the same function hash_lookup(). Therefore during loading libphp.so (and libraries it depended on) whole apache crashed. Without a word of what's going on. The problem is detectable by forcing static linking (in FreeBSD modify librecode.la and change library_names='librecode.so.0 librecode.so librecode.so' to library_names='librecode.a' Now during linking of php the linker complains of double definition of hash_lookup. Solution: -grab recode3.6 from ftp://ftp.gnu.org/pub/gnu/recode/ -unpack, go to src, in files combine.c, hash.c, names.c, recode.c, testdump.c, html.c, hash.h replace hash_lookup() by hash_lookupX() [or invent some better name], compile recode (i had to do: setenv CFLAGS "-I/usr/local/include" setenv LDFLAGS "-L/usr/local/lib -lintl" ./configure --prefix=/usr/local/recode --exec-prefix=/usr/local/recode --without-included-gettext make make check make install (recode is installed to /usr/local/recode.You can change this and you can force static linking of recode, so that after building libphp.so this modified recode is no longer needed and can be deleted! ) For some reason this recode needs to have externally defined int error; therefore we have to modify configure script +one .c php source file: 1. modify configure script of php: find recode_format_table(); and somewhere before start of main() add int error; so the result is: char *program_name; int error; int main() { recode_format_table(); ; return 0; } (I modified both occurences of recode_format_table() in configure of php4.3.2rc2) 2. run configure, should work ok (my another problem was with imap: though my c-client was compiled WITHOUT ssl, configure complained that it IS using ssl, so i had to edit configure once again and comment following lines: void mm_searched(void){} void mm_expunged(void){} // char ssl_onceonlyinit(); --- commented int main() { // ssl_onceonlyinit(); --- commented return 0; } Now configure was rather happy :-) for the record: I did ./configure --with-apxs=/usr/local/apache/bin/apxs --with-imap --enable-sysvsem --enable-sysvshm --with-sybase=/usr/local/freetds --with-gettext --with-ldap --with-zlib --with-recode=/usr/local/recode -with-gd=/usr/local --with-jpeg-dir=/usr/local --with-png-dir=/usr/local 3. edit ext/recode/recode.c (or any other .c source file, add somewhere (e.g. at the end) int error; without it during linking 'error not defined' will be complained. 4. do 'make' and php is yours :-) It took me 2 days.. so do not delete this note, someone might even find it useful and mail me his thanks :-] -- http://www.php.net/manual/en/ref.recode.php http://master.php.net/manage/user-notes.php?action=edit+31690 http://master.php.net/manage/user-notes.php?action=delete+31690 http://master.php.net/manage/user-notes.php?action=reject+31690

« previous php.notes (#47289) next »