Mac に LAMP もとい MAMP 環境を構築したときのメモ。いろいろと癖もあったりはまったところもあったけど、とにかくできました。
構築する上でのポリシーとしては、
Mac にインストールされているライブラリと DarwinPorts で入れたものを混合するとコンパイルでエラーを起こすことが多いっぽい。
環境は以下の通り。
Mac OS X 10.5.6
mysql-5.1.33
postgresql-8.3.7
apache-2.2.11
php-5.2.9
DarwinPorts は多分 FreeBSD 系のパッケージ管理ツールを移植したやつだと思う。
Redhat 系でいう yum 、debian 系でいう apt かな。
以下からインストーラを取得してインストールする。
http://darwinports.com/
そしたらパスをセットして、 port 自体のアップデートをしておく。
$ vi ~/.bash_profile
export PATH=$PATH:/opt/local/bin export MANPATH=$MANPATH:/opt/local/share/man export INFOPATH=$INFOPATH:/opt/local/share/info
$ sudo port -d selfupdate
以下のように port でインストールする。
$ sudo port install gd2 $ sudo port install jpeg $ sudo port install libpng $ sudo port install freetype $ sudo port install cclient $ sudo port install libmcrypt $ sudo port install unixodbc
MySQL はパッケージで配布されてるので以下からダウンロードしてインストールする。
http://dev.mysql.com/downloads/
そしたら適当にリンクを作ってパスを通す。
$ sudo ln -s /usr/local/mysql-5.1.33-osx10.5-x86 /usr/local/mysql
$ vi ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
PostgreSQL もパッケージで配布されてるので以下からダウンロードしてインストールする。
別にいらないならインストールしなくてもいい。
http://www.postgresql.org/download/
そしたら適当にリンクを作ってパスを通す。
$ sudo ln -s /usr/local/postgresql-8.3 /usr/local/postgresql
$ vi ~/.bash_profile
export PATH=$PATH:/usr/local/postgresql/bin
Apache はソースからコンパイルしてインストール。
とりあえずほとんどのモジュールを共有ライブラリとしてコンパイルする。
$ ./configure \ --prefix=/usr/local \ --enable-so \ --enable-mods-shared=most \ --enable-ssl \ --with-ssl=/opt/local $ make $ sudo make install
そして最後に php のインストールを行う。
何度もコンパイルが通らずに困ったけど、いくつかソースコードの修正と Makefile の調整で通る。
とりあえずは configure する。こちらもほぼ全ての Extension を共有ライブラリとしてコンパイル。
必要なライブラリは DarwinPorts のものを参照するようにする。
$ ./configure \ --prefix=/usr/local \ --with-gnu-ld \ --with-apxs2=/usr/local/bin/apxs \ --with-config-file-path=/usr/local/etc \ --with-config-file-scan-dir=/usr/local/etc/php.d \ --enable-embed=shared \ --with-ldap=shared,/usr \ --with-xmlrpc=shared \ --with-xsl=shared,/usr \ --with-bz2=shared \ --with-sqlite=shared \ --enable-sqlite-utf8 \ --with-mysql=shared,/usr/local/mysql \ --with-curl=shared \ --enable-mbstring=shared \ --enable-mbregex \ --enable-sockets \ --enable-exif \ --enable-ftp \ --with-imap=shared,/opt/local \ --with-imap-ssl=/opt/local \ --with-zlib=/opt/local \ --with-gd=/opt/local \ --with-jpeg-dir=/opt/local \ --with-png-dir=/opt/local \ --with-ttf=shared,/opt/local \ --enable-gd-native-ttf \ --with-freetype-dir=/opt/local \ --with-pdo-mysql=shared,/usr/local/mysql \ --with-pdo-sqlite=shared,/opt/local \ --with-pdo-odbc=shared,unixODBC,/opt/local \ --with-pdo-pgsql=shared,/usr/local/postgresql \ --with-pear \ --with-kerberos \ --enable-soap \ --with-openssl \ --with-openssl-dir=/opt/local \ --with-mcrypt=shared,/opt/local \ --with-mhash=shared,/opt/local \ --with-libxml-dir=/opt/local \ --with-iconv=/opt/local
次に make だけど、いくつかコードを編集しないとだめらしい。
まず以下のコンパイルエラーを得る。
ld: warning, duplicate dylib /usr/lib/libm.dylib ld: duplicate symbol _yytext in Zend/.libs/zend_ini_scanner.o and Zend/.libs/zend_language_scanner.o
ここの情報によるとコードを修正しないといけないらしい。
$ vi Zend/zend_ini_scanner.c
char *yytext;
のラインをコメントアウトする。
同様に
$ vi Zend/zend_language_scanner.c
も行う。
さらに Makefile も修正し、 .lo ライブラリをきちんと取り扱えるようにする。
$ vi Makefile
BUILD_CLI = $(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(NATIVE_RPATHS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_CLI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)
を
BUILD_CLI = $(LIBTOOL) --mode=link $(CC) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(NATIVE_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_CLI_OBJS) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $(SAPI_CLI_PATH)
とする。そしてコンパイル。
$ make $ make test $ sudo make install $ sudo cp php.ini-recommended /usr/local/etc/php.ini
後は簡単な初期設定を行って httpd が起動して php も動くことを確認すれば終了。
$ sudo vi /usr/local/conf/httpd.conf
LoadModule php5_module modules/libphp5.so <IfModule php5_module> AddHandler php5-script php </IfModule>
$ sudo /usr/local/bin/apachectl start
Snow Leopard にインストールする際は、EXTRA_CFLAGS="-lresolv" を make 時に渡してやらないと以下のエラーが発生してコンパイルできなかった。
Undefined symbols: "_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 "_res_9_dn_skipname", referenced from: _zif_dns_get_mx in dns.o _zif_dns_get_mx in dns.o ld: symbol(s) not found collect2: ld returned 1 exit status make: *** [sapi/cli/php] Error 1
これは Snow Leopard から bind9 が Mac の開発ライブラリに追加されたためらしい。追加したらコンパイルできたから確認してない。
また、同様に Snow Leopard にアップグレードした後に、 libmysqlclient ライブラリのエラーが消えなくて困った。 make test 実施時に
PHP Warning: PHP Startup: Unable to load dynamic library '/Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so' - dlopen(/Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so, 9): Library not loaded: libmysqlclient.18.dylib Referenced from: /Users/ma/Documents/Build/tar/php-5.3.6-x86_64/modules/pdo_mysql.so Reason: image not found in Unknown on line 0
と複数出る。で otool で確認してみると、
$ otool -L modules/mysql.so modules/mysql.so: libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0) /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 103.0.0) /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
と確かに、ダイナミックライブラリへのパスが通ってない。根本的な原因が分からなかったが、とりあえず install_name_tool を使って解決する。
$ /usr/bin/install_name_tool -change "libmysqlclient.18.dylib" "/usr/local/mysql/lib/libmysqlclient.18.dylib" modules/pdo_mysql.so