SlideShare a Scribd company logo
1 of 22
Download to read offline
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-pack
PHP
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.js
C:¥opt¥php-7.0.4-devel-VC14-x64
module ...
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.0
Copyright (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 ext
ension=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

More Related Content

What's hot

5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャKenji Tanaka
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたKohei Nakamura
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話Norifumi Kawamoto
 
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...Kohei Nakamura
 
自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発するShohei Okada
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会Yukinori KITADAI
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
チケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfチケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfYokoba
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Go Maeda
 
挫折しないRedmine (2022)
 挫折しないRedmine  (2022) 挫折しないRedmine  (2022)
挫折しないRedmine (2022)Go Maeda
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?mori takuma
 

What's hot (20)

5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ5分でわかるクリーンアーキテクチャ
5分でわかるクリーンアーキテクチャ
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
Redmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみたRedmine にいろいろ埋め込んでみた
Redmine にいろいろ埋め込んでみた
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話PHPのテスト名を日本語にした話
PHPのテスト名を日本語にした話
 
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
 
自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する自分たちのコードを Composer パッケージに分割して開発する
自分たちのコードを Composer パッケージに分割して開発する
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会わしわし的おすすめ  .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
わしわし的おすすめ .gitconfig 設定 (と見せかけて実はみんなのおすすめ .gitconfig 設定を教えてもらう魂胆) #広島Git 勉強会
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
チケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdfチケット駆動開発現場の最前線.pdf
チケット駆動開発現場の最前線.pdf
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
 
挫折しないRedmine (2022)
 挫折しないRedmine  (2022) 挫折しないRedmine  (2022)
挫折しないRedmine (2022)
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?goで末尾再帰最適化は使えるか?
goで末尾再帰最適化は使えるか?
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 

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

勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎真哉 杉野
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築Hideharu MATSUFUJI
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたjohgus johgus
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020Rui Hirokawa
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Tomohito Adachi
 
Start python with fastapi
Start python with fastapiStart python with fastapi
Start python with fastapiku_taka
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件y-uti
 
Recording and Replay on HoloLens [dotNET 600]
Recording and Replay on HoloLens [dotNET 600]Recording and Replay on HoloLens [dotNET 600]
Recording and Replay on HoloLens [dotNET 600]Tomoki Hayashi
 
PHPの今とこれから2008
PHPの今とこれから2008PHPの今とこれから2008
PHPの今とこれから2008Rui Hirokawa
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試したy-uti
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回Shigeharu Yamaoka
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUpKenichi Mukai
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイドEtsuji Nakai
 
System4 comment
System4 commentSystem4 comment
System4 commentJun Chiba
 
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hackyut148atgmaildotcom
 

Similar to Windows で拡張モジュールをビルドしてみた (20)

勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
 
PHPの今とこれから2020
PHPの今とこれから2020PHPの今とこれから2020
PHPの今とこれから2020
 
Webシステム脆弱性LT資料
Webシステム脆弱性LT資料Webシステム脆弱性LT資料
Webシステム脆弱性LT資料
 
Start python with fastapi
Start python with fastapiStart python with fastapi
Start python with fastapi
 
おしべめしべ
おしべめしべおしべめしべ
おしべめしべ
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 
Recording and Replay on HoloLens [dotNET 600]
Recording and Replay on HoloLens [dotNET 600]Recording and Replay on HoloLens [dotNET 600]
Recording and Replay on HoloLens [dotNET 600]
 
PHPの今とこれから2008
PHPの今とこれから2008PHPの今とこれから2008
PHPの今とこれから2008
 
JIT for PHP を試した
JIT for PHP を試したJIT for PHP を試した
JIT for PHP を試した
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
System4 comment
System4 commentSystem4 comment
System4 comment
 
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
配布用Dotcloudによるすぐ始めるtwitterwebアプリ開発#twtr hack
 

More from y-uti

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法y-uti
 
Active Object
Active ObjectActive Object
Active Objecty-uti
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化y-uti
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門y-uti
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...y-uti
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードy-uti
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識y-uti
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
スパース推定
スパース推定スパース推定
スパース推定y-uti
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話y-uti
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告y-uti
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用y-uti
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試したy-uti
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告y-uti
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecationy-uti
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -y-uti
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較y-uti
 
Git 入門
Git 入門Git 入門
Git 入門y-uti
 

More from y-uti (20)

潜在ディリクレ配分法
潜在ディリクレ配分法潜在ディリクレ配分法
潜在ディリクレ配分法
 
Active Object
Active ObjectActive Object
Active Object
 
目で見る過学習と正則化
目で見る過学習と正則化目で見る過学習と正則化
目で見る過学習と正則化
 
ロジスティック回帰入門
ロジスティック回帰入門ロジスティック回帰入門
ロジスティック回帰入門
 
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
論文紹介 Identifying Implementation Bugs in Machine Learning based Image Classifi...
 
PECL operator で演算子オーバーロード
PECL operator で演算子オーバーロードPECL operator で演算子オーバーロード
PECL operator で演算子オーバーロード
 
PHP-ML で手書き数字認識
PHP-ML で手書き数字認識PHP-ML で手書き数字認識
PHP-ML で手書き数字認識
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
スパース推定
スパース推定スパース推定
スパース推定
 
Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話Kaggle の Titanic チュートリアルに挑戦した話
Kaggle の Titanic チュートリアルに挑戦した話
 
PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告PHP カンファレンス福岡 2017 参加報告
PHP カンファレンス福岡 2017 参加報告
 
分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用分類問題 - 機械学習ライブラリ scikit-learn の活用
分類問題 - 機械学習ライブラリ scikit-learn の活用
 
Task Spooler を試した
Task Spooler を試したTask Spooler を試した
Task Spooler を試した
 
PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告PHP カンファレンス福岡 参加報告
PHP カンファレンス福岡 参加報告
 
RFC: "var" Deprecation
RFC: "var" DeprecationRFC: "var" Deprecation
RFC: "var" Deprecation
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -逐次ベイズ学習 - サンプリング近似法の場合 -
逐次ベイズ学習 - サンプリング近似法の場合 -
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較
 
Git 入門
Git 入門Git 入門
Git 入門
 

Recently uploaded

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (8)

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

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

  • 1. Windows で 拡張モジュールをビルドしてみた 内山 雄司 (@y__uti) 2016-03-30 第100回 PHP 勉強会
  • 2. 自己紹介 内山 雄司 (@y__uti) ◦ http://y-uti.hatenablog.jp/ (phpusers-ja) 仕事 ◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています 興味 ◦ プログラミング言語処理系 ◦ 機械学習 2016-03-30 第100回 PHP 勉強会 2
  • 3. PECL 拡張モジュール http://pecl.php.net で配布されている PHP 拡張 2016-03-30 第100回 PHP 勉強会 3
  • 4. PECL 拡張の導入 二通りの方法 1. バイナリをインストール 2. ソースコードをビルド 2016-03-30 第100回 PHP 勉強会 4 Linux Mac Windows バイナリ yum, apt, ... DLL を直接取得 ソースコード phpize, make ? OS 別の導入方法 ◦ Mac は使ったことがないのでわかりません
  • 6. ソースコードをビルド ここを読む ◦ https://wiki.php.net/internals/windows/stepbystepbuild#building_pecl_ extensions 2016-03-30 第100回 PHP 勉強会 6 ◦ PHP のソースコードと同一階層に置いて buildconf して nmake せよ
  • 8. Windows で phpize を使う ここから php-devel-pack を取得 ◦ http://windows.php.net/downloads/releases/ 2016-03-30 第100回 PHP 勉強会 8
  • 9. ディレクトリ構成 geospatial モジュールを PHP 7.0.4 用にビルドする例 2016-03-30 第100回 PHP 勉強会 9 PECL 拡張 devel-pack PHP SDK
  • 10. ビルド - 環境設定 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
  • 11. ビルド - 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.js C:¥opt¥php-7.0.4-devel-VC14-x64 module ... Now run 'configure --help'
  • 12. ビルド - 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
  • 13. ビルド - 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 ファイルが出力される
  • 14. 動作確認 東京 - 札幌の距離 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) 拡張を有効にして計算してみる
  • 15. 罠 いくつか罠がある 1. nmake install 2. nmake test 3. --enable-debug 2016-03-30 第100回 PHP 勉強会 15
  • 16. 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 ファイルを置けば済む話
  • 17. 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.0 Copyright (C) Microsoft Corporation. All rights reserved. NMAKE : fatal error U1073: 'test' のビルド方法が指定されていません。 Stop. まぁ、テストしなければ済む話
  • 18. テストしたい PHP のソースまたは test-pack から run-tests.php を持ってくる ◦ ファイルを PECL 拡張のフォルダに置く 2016-03-30 第100回 PHP 勉強会 18
  • 19. テストしたい 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 ext ension=C:¥opt¥geospatial-master¥x64¥Release¥php_geospatial.dll ◦ PHP 本体の Makefile を読むと、実際このように実行している
  • 20. --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
  • 21. デバッグビルドしたい 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 のバージョンによって異なる ◦ ファイルの末尾の方
  • 22. まとめ Windows でも phpize できた いくつかの些細な問題 ◦ nmake install のインストール先 ◦ nmake test できない ◦ --enable-debug できない 2016-03-30 第100回 PHP 勉強会 22