22
Windows 拡張モジュールをビルドしてみた 内山 雄司 (@y__uti) 2016-03-30 100 PHP 勉強会

Windows で拡張モジュールをビルドしてみた

  • Upload
    y-uti

  • View
    871

  • Download
    0

Embed Size (px)

Citation preview

Windows で拡張モジュールをビルドしてみた

内山 雄司 (@y__uti)

2016-03-30 第100回 PHP 勉強会

自己紹介内山雄司 (@y__uti)

◦ http://y-uti.hatenablog.jp/ (phpusers-ja)

仕事◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています

興味◦ プログラミング言語処理系

◦ 機械学習

2016-03-30 第100回 PHP 勉強会 2

PECL 拡張モジュールhttp://pecl.php.netで配布されている PHP 拡張

2016-03-30 第100回 PHP 勉強会 3

PECL 拡張の導入二通りの方法1. バイナリをインストール

2. ソースコードをビルド

2016-03-30 第100回 PHP 勉強会 4

Linux Mac Windows

バイナリ yum, apt, ... DLLを直接取得

ソースコード phpize, make ?

OS 別の導入方法

◦ Mac は使ったことがないのでわかりません

バイナリを導入する場合ビルド済みの DLL ファイルをダウンロードして利用可能

2016-03-30 第100回 PHP 勉強会 5

ソースコードをビルドここを読む

◦ https://wiki.php.net/internals/windows/stepbystepbuild#building_pecl_extensions

2016-03-30 第100回 PHP 勉強会 6

◦ PHP のソースコードと同一階層に置いて buildconfして nmakeせよ

Windows ユーザーだってphpizeしたい!

2016-03-30 第100回 PHP 勉強会 7

Windows で phpizeを使うここから php-devel-pack を取得

◦ http://windows.php.net/downloads/releases/

2016-03-30 第100回 PHP 勉強会 8

ディレクトリ構成geospatial モジュールを PHP 7.0.4 用にビルドする例

2016-03-30 第100回 PHP 勉強会 9

PECL 拡張

devel-packPHP

SDK

ビルド -環境設定Visual Studio 2015 開発者コマンドプロンプトで実行

2016-03-30 第100回 PHP 勉強会 10

C:¥Program Files (x86)¥Microsoft Visual Studio 14.0>cd VC

C:¥Program Files (x86)¥Microsoft Visual Studio 14.0¥VC>vcvarsall.bat amd64

C:¥Program Files (x86)¥Microsoft Visual Studio 14.0¥VC>cd ¥opt¥php-sdk

C:¥opt¥php-sdk>bin¥phpsdk_setvars.bat

◦ PHP のバージョンに応じた Visual Studio が必要です

◦ PHP 5.6 なら Visual Studio 2012

参照: "Supported compilers to build PHP on Windows"

◦ https://wiki.php.net/internals/windows/compiler

ビルド - phpize

Visual Studio 2015 開発者コマンドプロンプトで実行

2016-03-30 第100回 PHP 勉強会 11

C:¥opt¥php-sdk>cd ¥opt¥geospatial-master

C:¥opt¥geospatial-master>¥opt¥php-7.0.4-devel-VC14-x64¥phpize.bat

Rebuilding configure.jsC:¥opt¥php-7.0.4-devel-VC14-x64module ...

Now run 'configure --help'

ビルド - configure

Visual Studio 2015 開発者コマンドプロンプトで実行

2016-03-30 第100回 PHP 勉強会 12

C:¥opt¥geospatial-master>configure.bat --enable-geospatial

...

Enabled extensions:-----------------------| Extension | Mode |-----------------------| geospatial | shared |-----------------------

----------------------------------------------| | |----------------------------------------------| Build type | Release || Thread Safety | No || Compiler | MSVC14 (Visual C++ 2015) || Architecture | x64 || Optimization | PGO disabled || Static analyzer | disabled |----------------------------------------------

Type 'nmake' to build PHP

ビルド - nmake

Visual Studio 2015 開発者コマンドプロンプトで実行

2016-03-30 第100回 PHP 勉強会 13

C:¥opt¥geospatial-master>nmake

...

ライブラリ C:¥opt¥geospatial-master¥x64¥Release¥php_geospatial.lib とオブジェクト C:¥opt¥geospatial-master¥x64¥Release¥php_geospatial.exp を作成中

EXT geospatial build complete

◦ x64¥Release フォルダに DLL ファイルが出力される

動作確認東京 -札幌の距離

2016-03-30 第100回 PHP 勉強会 14

<?php

$tokyo = ['type' => 'Point', 'coordinates' => [139.69, 35.69]];$sapporo = ['type' => 'Point', 'coordinates' => [141.35, 43.06]];

var_dump(haversine($sapporo, $tokyo));

C:¥>php -d extension=C:¥opt¥geospatial-master¥x64¥Release¥php_geospatial.dll test.php

float(832715.80874697)

拡張を有効にして計算してみる

罠いくつか罠がある

1. nmake install

2. nmake test

3. --enable-debug

2016-03-30 第100回 PHP 勉強会 15

nmake install の罠デフォルトのインストール先は C:¥php

変更するには PECL 拡張を configure するときに指定

2016-03-30 第100回 PHP 勉強会 16

C:¥opt¥geospatial-master>configure.bat --with-prefix=C:¥opt¥php¥7.0.4 --enable-geospatial

◦ --with-prefix オプション

まぁ、指定しなくても手作業で DLL ファイルを置けば済む話

nmake test の罠Makefileに test ターゲットが存在しない

2016-03-30 第100回 PHP 勉強会 17

C:¥opt¥geospatial-master>nmake test

Microsoft(R) Program Maintenance Utility Version 14.00.23506.0Copyright (C) Microsoft Corporation. All rights reserved.

NMAKE : fatal error U1073: 'test' のビルド方法が指定されていません。

Stop.

まぁ、テストしなければ済む話

テストしたいPHP のソースまたは test-pack から run-tests.phpを持ってくる◦ ファイルを PECL 拡張のフォルダに置く

2016-03-30 第100回 PHP 勉強会 18

テストしたいrun-tests.phpを直接叩く

2016-03-30 第100回 PHP 勉強会 19

C:¥opt¥geospatial-master>php run-tests.php -p C:¥opt¥php¥7.0.4¥php.exe -n -d extension=C:¥opt¥geospatial-master¥x64¥Release¥php_geospatial.dll

◦ PHP 本体のMakefileを読むと、実際このように実行している

--enable-debug の罠--enable-debug を指定しても Release ビルドになる

2016-03-30 第100回 PHP 勉強会 20

C:¥opt¥geospatial-master>configure.bat --enable-geospatial --enable-debug

...

Enabled extensions:-----------------------| Extension | Mode |-----------------------| geospatial | shared |-----------------------

----------------------------------------------| | |----------------------------------------------| Build type | Release || Thread Safety | No || Compiler | MSVC14 (Visual C++ 2015) || Architecture | x64 || Optimization | PGO disabled || Static analyzer | disabled |----------------------------------------------

Type 'nmake' to build PHP

デバッグビルドしたいphpizeした後、configure.js スクリプトを修正する

2016-03-30 第100回 PHP 勉強会 21

// ARG_ENABLE('debug', 'Compile with debugging symbols', "no");

...

try {ARG_ENABLE('debug', 'Compile with debugging symbols', "no");} catch (e) {

STDOUT.WriteLine("problem: " + e);}

同じのがある

ここをコメントアウトする

◦ 行番号は PHP のバージョンによって異なる

◦ ファイルの末尾の方

まとめWindows でも phpizeできた

いくつかの些細な問題◦ nmake install のインストール先

◦ nmake test できない

◦ --enable-debug できない

2016-03-30 第100回 PHP 勉強会 22