[redland-dev] Compiling PHP bindings on Mac OS X 10.5.4
Martin Stricker
martin.stricker at gmail.com
Thu Jul 10 10:23:23 BST 2008
As I had quite some problems compiling & running the PHP bindings on
Mac OS X (missing symbols during linking, crashing Apache) & there
have been questions before, I'd like to share my solution, which seems
to work fine as of now.
Short version:
Change the PHP_LDFLAGS variable in php/Makefile (line 135) to
-lrdf -bundle_loader /path/to/php -flat_namespace -bundle
I am no expert on this, so if there is a better way to compile on Mac
OS X, I would appreciate very much the information.
My environment:
Mac OS X 10.5.4, Apple-installed Apache 2, self-compiled PHP 5.2.5.
Because PHP is compiled in 32 Bit (some extensions, for the configure
command see below), I had to strip down the httpd-binary to i368-
architecture with lipo[1] (I don't think this influences the linking
problems, but I'm not sure). Redland librdf 1.0.8, php bindings
version 1.0.8.1.
Options (all concerning the linker ld[2] called from the compiler, I
think)
My configure command:
./configure --with-php=/path/to/php --with-php-linking=so --with-
redland=system LIBS='-lrdf'
-bundle instead of -shared
man gcc[3] on Mac OS X says about "-shared": "This option is not
supported on MacOSX". The appropriate switch for ld is -bundle (you
can still name the library .so, I think it doesn't matter, because it
isn't loaded dynamically)
-lrdf
search symbols in librdf.dylib to eliminate missing symbols from
redland (I have redland installed at the default /usr/local location,
so ld finds it. The LIBS='-lrdf' configure option doesn't incluence
here the php bindings Makefile, btw).
-bundle_loader /path/to/php
this is the way ld on Mac OS X resolves the symbols from PHP - as
there is no way linking directly to the libphp5.so (ld usually only
resolves symbols in dynamic libraries (.dylib))
-flat_namespace
I know next to nothing about this option (found it by trial and
error), except that it stopped Apache processes from crashing with
messages like "Dyld Error Message: Symbol not found:
_executor_globals". It seems to have something to do with thread
safety (whatever that is). ld[2] has to say that:
"Two-level namespace
By default all references resolved to a dynamic library record the
library to which they were resolved. At runtime, dyld uses that
information to directly resolve symobls. The alternative is to use
the -flat_namespace option. With flat namespace, the library is not
recorded. At runtime, dyld will search each dynamic library in load
order when resolving symbols. This is slower, but more like how other
operating systems resolve symbols."
On the Apple dev lists, there is quite some discussion about 2-level
and flat namespaces, it seems to be a constant problem when porting
software from Linux to Darwin. As I only develop on Mac OS X and
deploy on Linux servers, I don't very much care right now about
possibly slower performance.
I hope this helps somebody, otherwise please excuse the noise,
Cheers,
Martin
martin.stricker at gmail.com
Berlin, Germany
[1] <http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/lipo.1.html
>
[2] <http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/ld.1.html
>
[3] <http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/gcc.1.html
>
PHP configure command:
./configure' '--prefix=/usr/local/php5' '--with-config-file-path=/
Users/martin/dev/php/ini' '--with-apxs2=/usr/sbin/apxs' '--with-zlib'
'--with-zlib-dir=/usr' '--enable-calendar' '--with-pear' '--with-
sqlite' '--with-mysql=/sw' '--with-pdo-mysql=/sw' '--with-mysqli=/sw/
bin/mysql_config' '--with-iconv=/sw' '--enable-mbstring' '--with-
readline=/sw' '--with-mcrypt=/sw'
More information about the redland-dev
mailing list