chakokuのブログ(rev4)

日々のごった煮ブログです

cygwin上でphp-5を構築したメモ

諸般の事情により、cygwin上でphp-5を構築

自分の環境は以下
(1)cygwin (一応最新) + gcc(3.4.4)
(2)httpd 1.3.36 (cygwin)
(3)php 5.1.6

phpコンパイル手順は以下(エラー発生まで)

(1)まずコンフィグ
%./configure --prefix=/usr/local/php5 --with-apxs=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --enable-mbstring

(2)次にMake
% make 

(3)インストール段階でエラー発生
% make install
Installing PHP SAPI module: apache
apxs:Error: file libs/libphp5.so is not a DSO
make: *** [install-sapi] Error 1


以下調査と対策

調べてみると、確かに、libs/libphp5.soがない。また、本来はdllになるべきでは(?)
Makefileを調べると、libs/libphp5.bundleで作成する意図があるようだが、これが走っていない。
で、手動で走らせてみる。

%make libs/libphp5.bundle

上記を実行させると、hoge.oの全ファイルが無いと言う。パスを書き換えて強引にコンパイルすると山のようにシンボル未定義エラーが出る。(apacheの関数群がリンク対象に含まれていないようだ)
問題点を整理すると、(1)ライブラリの不足(2)パスの間違いのようである。

いろいろ調べて強引に逃げたのは以下
番役立ったページ↓
http://www.nabble.com/Re%3A-php5-on-cygwin-t660732.html#a1755192

(1)EXTRA_LIBS = .... の最後にhttpdのライブラリを付ける

 EXTRA_LIBS = -lcrypt -lcrypt ..略... -lcrypt -lhttpd.dll
 上記はかなり変ですが、自分の環境では、/usr/lib/libhttpd.dll.aだったので。。

(2) .oのありかのパスに /.libs/に加える。また、-shared を付ける。

libs/libphp5.bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)
$(CC) -shared $(MH_BUNDLE_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) `echo $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) | sed "s/\([^/]*\)\.lo/.libs\/\1.o/g"` $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ && cp $@ libs/libphp5.so

これで、libphp5.soができた。

make installするとやっぱりエラーが出るのですが、libphp5.soは求めるDLLだろうと仮定し、このlibphp5.soをapacheのlib配下にコピー

% cp /libs/libphp5.so /usr/lib/apache/libphp5.dll

あとは、httpd.confをphp5に修正して起動。一応apacheは起動した。

ただ、php4の時と同じように、以下のエラーが出ます。致命的なようですが、
だましだまし動かしています。本番サービスには到底使えませんが、お試し環境なので。。

$ ./apachectl start
[Fri Oct 13 21:23:07 2006] [warn] Loaded DSO lib/apache/libphp5.dll uses
plain Apache 1.3 API, this module might crash under EAPI!
(please recompile it with -DEAPI)

./apachectl start: httpd started

ハッカーの方は、さらにエレガントな構築方法を教えてください。 m(_ _)m