php の Win64 ビルドを配布してくれてるサイトは私が知る限り 2 つありますが、そのどちらも本日時点で最新の 5.4.8 がありません。片方の個人ブログは 7 月から更新停止。もう一つの Apache Lounge は提供していた Virsacer 氏がもう提供できないとのこと。その代わりに氏のビルド環境がアップされていたので自分でビルドしてみました (ビルドしたファイルはphp 5.4.8 Windows 64bit ビルドに掲載) 。
ただし 64 bit での開発環境が無いので 32 bit Win7 上でのクロスコンパイルです。手間が増えるので素直に 64 bit OS でビルドすべきなのですが、世の中には同じようにクロスコンパイルしたい人も居ると信じてまとめておきます。
ビルドにあたっては PHP を Windows でビルドの情報が大変参考になりました。
尚、この方法では snmp 、ldap 、enchant のライブラリをビルドしていないため各関数は使用できません。ldap や enchant は必要な人しか使わないでしょうけど、snmp は地味に便利なので何とかしたかったのですが残念ながら自分にはできませんでした。
必要なもの
- PHP-Win64-Build-Environment.zip
- Virsacer 氏のビルド環境。ディレクトリ等は決め打ちになっているのでもし変更する場合は要注意。
- php 5.4.8 のソースコード
- 5.4.7 でビルドしてこれを書いてたら 5.4.8 が出てしまったので、実績としては 5.4.7 と 5.4.8 で確認済みとなります。
- php-sdk-binary-tools-20110915.zip
- ビルドに必要なツール類。最新版が出ているかもしれませんが今回は php-sdk-binary-tools-20110915.zip で。
- php と perl の実行環境
- 今回は公式配布の php 5.4.8 と Active Perl v5.16.1 を使用。php は無くても困りませんが、Perl は OpenSSL のビルドに必要です。
- 依存ライブラリ・ソース等
- 詳細は後述しますが、ひたすらかき集める必要があります。
- VisualStudio
- 先に 32 bit 版の php をビルドできることを確認しておくと安心です。今回は Windows 7 Ultimate 32bit + Visual Studio 2010 Ultimate SP 1 + Windows Platform SDK 7.1 で実施。Visual Studio の Express でも可能だと思いますが 64 bit ビルドするための環境変数設定がどうにも怪しくて諦めました。
ビルド環境の準備
PHP-Win64-Build-Environment.zip を D:\PHP に展開し D:\PHP\index.php を実行します。Apache のドキュメントルートに置くなり php index.php > index.html なり、方法は何でも。
以下、各ディレクトリごとに準備していきます。
D:\PHP
アーカイブの展開に必要な 7za.exe と Apache ハンドラのビルドに必要な Apache を配置。
- 7za.exe
- コマンドライン版 7zip 。
- httpd-2.4.3-win64.zip
- Apache louge 配布の Win64 版。
D:\PHP\SOURCE
上記 index.php の実行結果にあるテーブルの配布先 Web へのリンクを頼りに、下記の依存ライブラリをひたすら集めてアーカイブのまま配置。展開する必要は有りません。
テーブルの Vesion 列がオレンジのものは Virsacer 氏の環境で「最新バージョンでは問題がある」と判断されたものなので必ず指定バージョンのものにしておくのが無難です。一応自分は全て指定バージョン通りにしておきました。
- bzip2-1.0.6.tar.gz
- curl-7.26.0.zip
- Firebird-2.5.1.26351-0_x64.zip
- ft2410.zip
- gettext-0.15.tar.gz
- icu4c-4_8_1_1-Win64-msvc10.zip
- imap-2007f.tar.gz
- instantclient-basiclite-windows.x64-11.2.0.3.0.zip
- instantclient-sdk-windows.x64-11.2.0.3.0.zip
- Orcle のドライバ。ダウンロードには Oracle のアカウント作成 (無料) が必要。
- jpegsr8d.zip
- libiconv-1.11.1.tar.gz
- libmcrypt-2.5.8.tar.bz2
- libssh2-1.4.2.tar.gz
- libxml2-2.8.0.tar.gz
- libxslt-1.1.26.tar.gz
- lpng1512.zip
- mpir-2.5.1.tar.bz2
- openssl-1.0.1c.tar.gz
- postgresql-9.1.5-1-windows-x64-binaries.zip
- postgresql-9.1.5.tar.bz2
- 9.1.5 バイナリの zip 版はぐぐらないと見つからない。
- vpx-vp8-debug-src-x86_64-win64mt-vs9-v1.1.0.zip
- zlib127.zip
D:\PHP\SOURCE\PECL
同時にビルドしたい PECL のソースを配置。
readme.note には eAccelerator 、win32service 、xdebug の記載がありますが、その他 APC 、php_rar 、php_http など必要なものを。当たり前ですが依存ライブラリが必要な PECL は当然それが必要です。Xcache は一工夫が必要らしく、ここに置いてもビルドできませんので別アーティクルで取り上げます。
D:\PHP\SOURCE\PHP
php 5.4.8 のソースを解凍して配置。
D:\PHP\SOURCE\TOOLS
- dirent
- dirent.h、dirent.c を保存し、ファイルのまま TOOLS\dirent へ配置。
- Tidy
- ソースを TOOLS\tidy に配置。
D:\PHP\SOURCE\TOOLS\LIBS
ディレクトリ内の *.bat を実行すると、対応する依存ライブラリのアーカイブが展開・ビルドされ、このディレクトリ内にそれを固めた *.zip が作成されます。依存関係があるため以下の順でやっておけば良いかと思います。
- openssl.bat
- zlib.bat
- libssh2.bat
- libiconv.bat
- dirent.bat
- libxml2.bat
- libxslt.bat
- …その他の bat
注意点として「Resume after converting」と表示され止まる箇所では VisualStudio (msdev) が起動し、以下のダイアログが表示されます。OK を押し、変換が終了後に閉じて bat を続行してください。
数が多いので bat を書き並べて一括実行してやりたくなる衝動に駆られますが、単純に書き並べた bat を用意しても呼ばれる各 bat 内で VC 環境変数を設定しているのが原因で途中で止まります。もし一つにまとめるなら該当行を最初の一回だけにする等が必要です。
openssl.bat の修正
もし perl へのパスが通っていない場合 (bat 内でパスを設定する場合) 、下記行を自分の環境に合わせて修正しておく必要があります。
SET PATH=%PATH%;D:\Programme\PERL\perl\bin
あとついでに Configure の –openssldir 先が誤ってるので D:/PHP/bin に修正。特に問題ないようですが気持ち悪いので念のため。
perl Configure VC-WIN64A enable-camellia disable-idea --openssldir=D:/PHP/bin
確認として、この時点で再度 D:\PHP\index.php を実行すると Name 列が今度は緑色になっているはずです。緑色では無い場合はそのファイルが欠落しているので意図的に配置してないのか配置忘れか確認してください。
binary-tools の配置
http://windows.php.net/downloads/php-sdk/ から落とした php-sdk-binary-tools-20110915.zip を D:\PHP 配下に展開します。
以上で、下記のようなディレクトリ構成になっているはずです。
D:\ PHP\ BIN\ script\ share\ SOURCE\ LIBS\ PECL\ eAccelerator\ win32service\ ... PHP\ build\ ext\ ... TOOLS\ bin\ dirent\ tidy\ build\ console\ ...
ビルド前の準備
VC.bat の修正
クロスコンパイルする場合は D:\PHP\SOURCE\TOOLS\VC.bat を修正する必要があります。
CALL "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x64
今回は 32 bit 環境で D ドライブにインストールした VS を使用する為、下記のように修正しました。
CALL "D:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86_amd64
!BUILD.bat の修正
D:\PHP\SOURCE\!BUILD.bat を開き、php ビルド環境変数を設定する phpsdk_setvars.bat を CALL する一行を追加します。
@echo off
CALL TOOLS\VC.bat
CALL ..\bin\phpsdk_setvars.bat
...
ビルドされたファイルはデフォルトで D:\PHP\BIN にコピーされるため、ツール類を格納している既存ディレクトリと被ることになります。これを避けるため、コピー先の BIN\ 部分を RELEASE_BIN\ に置換します。
xcopy /Y "SOURCE\TOOLS\!*.bat" "RELEASE_BIN\"
xcopy /Y "SOURCE\TOOLS\bin\!*.bat" "RELEASE_BIN\bin\"
7za.exe x "SOURCE\LIBS\openssl*.zip" -aoa -o"RELEASE_BIN" -ir!bin
7za.exe e "SOURCE\LIBS\openssl*.zip" -aoa -o"RELEASE_BIN" -ir!*.dll
7za.exe e "SOURCE\Firebird*.zip" -aoa -o"RELEASE_BIN" -ir!fbclient.dll
7za.exe e "SOURCE\icu4c*.zip" -aoa -o"RELEASE_BIN" -ir!icu*.dll
7za.exe e "SOURCE\instantclient-basic*.zip" -aoa -o"RELEASE_BIN" -ir!oci.dll
7za.exe e "SOURCE\postgresql*.zip" -aoa -o"RELEASE_BIN" -ir!libiconv*.dll -ir!libintl*.dll -ir!libpq.dll
xcopy /SY "SOURCE\PHP" "BUILD\"
xcopy /SY "SOURCE\PECL" "BUILD\ext"
php -r "file_put_contents('RELEASE_BIN/LICENSE.txt',str_replace(\"\n\",\"\r\n\",file_get_contents('SOURCE/PHP/LICENSE')));"
php SOURCE\TOOLS\Prepare.php
...
cd Release_TS
php.exe -r "$ext=preg_grep('/_(mbstring|oci8_11g|xdebug)\./',glob('php_*.dll'),PREG_GREP_INVERT);array_unshift($ext,'php_mbstring.dll');array_push($ext,'zend_php_xdebug.dll');file_put_contents('php.ini',implode(\"\r\n\",str_replace('php_','extension=ext/php_',$ext)));"
xcopy /Y "*.exe" "..\..\RELEASE_BIN\"
xcopy /Y "php.ini" "..\..\RELEASE_BIN\"
xcopy /Y "php5*.dll" "..\..\RELEASE_BIN\"
xcopy /Y "php5ts.lib" "..\..\RELEASE_BIN\"
xcopy /Y "php_*.dll" "..\..\RELEASE_BIN\ext\"
cd ..
!BUILD.bat はビルド後、ビルドされた 64 bit 版 php を使用してスクリプトを -r オプションで実行する箇所があり、32 bit 環境では当然エラーになってしまいます。なので 32 bit 版を使用するよう書き換えておくか、rem をつけてコメントにする必要があります。
やってることは単に php.ini を生成しているだけなので私はコメントにしておきました。
cd Release_TS
rem php -r "$ext=preg_grep('/_(mbstring|oci8_11g|xdebug)\./',glob('php_*.dll'),PREG_GREP_INVERT);array_unshift($ext,'php_mbstring.dll');array_push($ext,'zend_php_xdebug.dll');file_put_contents('php.ini',implode(\"\r\n\",str_replace('php_','extension=ext/php_',$ext)));"
!PACK.bat の修正
これはビルドされたファイルのアーカイブを行う bat なのでお好みで。
この bat を使用するのであれば先と同様ビルドした php を実行できないため下記のように修正しておきます。
['32 bit PHP へのパス'\]php -r "touch('SOURCE\!PHP-'.PHP_VERSION.'Win64.zip');"
php ソースコードのヘブライ文字対策
ソース中のヘブライ文字部分がどうも日本語環境では問題になるようで、このままビルドすると下記のように途中で停止してしまいます。
ext\calendar\jewish.c : warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。 ext\calendar\jewish.c(324) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(325) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(326) : error C2001: 定数が 2 行目に続いています。 ext\calendar\jewish.c(327) : error C2001: 定数が 2 行目に続いています。 NMAKE : fatal error U1077: '"c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cl.exe"' : リターン コード '0x2' Stop.
この対策としては二つあり configure オプションに –disable-calendar を付けてカレンダー関数を犠牲にするか、ソースを書き換えてヘブライ文字部分を犠牲にするかです。
ソースを書き換える場合は、原因となっている php ソースコードの D:\PHP\SOURCE\PHP\ext\calendar\jewish.c をエディタで開き、UTF-8N (BOM 無し) で一度、上書き保存します。
もう一度 jewish.c をエディタで開き、下記ヘブライ文字付近のソースコード (320 行目付近) でダブルクォートやカンマが失われてしまっている場合はそれらを補う必要があります。
char *JewishMonthHebName[14] =
{
"",
"泚",
"錏襃",
"・・",
"鞦・,
"・,
"璢・,
"'璢・・,
"",
"琺鵁",
"襃",
"橫褂",
"珮",
"瑟褌"
};
秀丸はヘブライ文字に対応したエディタではない (?) せいなのかこのファイルのエンコードが特殊なのか、保存し直してダブルクォート等を補っても上記のエラーが出る場合があります。その場合はヘブライ文字部分を綺麗さっぱり削除し、値を空 (“”) にすることでビルドは通ります。ヘブライ文字での月名らしきもの (?) が当然使えなくなると思いますが。
ビルド
!BUILD.bat を実行し、ビルド成功すれば D:\PHP\RELEASE_BIN に 64 bit 版 php ができているはずです。ちなみに本家のファイル構成とは若干異なるように見えますが主要なファイルは入っているので実質的な差異は無いです。pear とか必要なら本家の方からそのままコピペで流用可能です。
ちなみに同梱されている bat は Apache 等の再起動等をするものなので特に php とは関係ないです。
テスト
64 bit バイナリであることの確認
下記コマンドの実行結果が x64 であれば 64 bit でビルドされています。
dumpbin /headers php.exe | findstr "machine" 8664 machine (x64)
run-tests.php の実行による確認
php ソースコードに同梱されている run-tests.php は、環境変数 TEST_PHP_EXECUTABLE にテスト対象の php バイナリを指定後、実行してやるとテストしてくれるようです。
set TEST_PHP_EXECUTABLE=D:\PHP\Release_Bin\php.exe php D:\PHP\BUILD\run-tests.php
テスト終了後、ファイルに保存するか聞かれるので、保存されたのを開いて「TEST RESULT SUMMARY」部分を見るとこんな感じになってると思います。
===================================================================== TEST RESULT SUMMARY --------------------------------------------------------------------- Exts skipped : 45 Exts tested : 33 --------------------------------------------------------------------- Number of tests : 12192 8250 Tests skipped : 3942 ( 32.3%) -------- Tests warned : 1 ( 0.0%) ( 0.0%) Tests failed : 63 ( 0.5%) ( 0.8%) Expected fail : 35 ( 0.3%) ( 0.4%) Tests passed : 8151 ( 66.9%) ( 98.8%) --------------------------------------------------------------------- Time taken : 1263 seconds =====================================================================
ちなみに公式配布版で実行しても failed や warned は出るので参考程度で。
0 Comments.