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

Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event HandlingWebStackAcademy
 
JBehaveの導入やってみたよ!
JBehaveの導入やってみたよ!JBehaveの導入やってみたよ!
JBehaveの導入やってみたよ!theboyalex
 
Building Responsive Applications Using XPages
Building Responsive Applications Using XPagesBuilding Responsive Applications Using XPages
Building Responsive Applications Using XPagesTeamstudio
 
ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢swamp Sawa
 
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)Jeff Chu
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelinesLalit Kale
 
Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介onozaty
 
Clean Code JavaScript
Clean Code JavaScriptClean Code JavaScript
Clean Code JavaScriptRiza Fahmi
 
테크니컬 리더
테크니컬 리더테크니컬 리더
테크니컬 리더Seungbin Cho
 
Angular Web Programlama
Angular Web ProgramlamaAngular Web Programlama
Angular Web ProgramlamaCihan Özhan
 
COM Hijacking Techniques - Derbycon 2019
COM Hijacking Techniques - Derbycon 2019COM Hijacking Techniques - Derbycon 2019
COM Hijacking Techniques - Derbycon 2019David Tulis
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Ivan Chepurnyi
 

What's hot (20)

Ex200
Ex200Ex200
Ex200
 
Angular
AngularAngular
Angular
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
 
JBehaveの導入やってみたよ!
JBehaveの導入やってみたよ!JBehaveの導入やってみたよ!
JBehaveの導入やってみたよ!
 
Building Responsive Applications Using XPages
Building Responsive Applications Using XPagesBuilding Responsive Applications Using XPages
Building Responsive Applications Using XPages
 
ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢ゼロ幅スペースという悪夢
ゼロ幅スペースという悪夢
 
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
 
Code review guidelines
Code review guidelinesCode review guidelines
Code review guidelines
 
Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介Redmine issue assign notice plugin の紹介
Redmine issue assign notice plugin の紹介
 
Vue, vue router, vuex
Vue, vue router, vuexVue, vue router, vuex
Vue, vue router, vuex
 
Clean Code JavaScript
Clean Code JavaScriptClean Code JavaScript
Clean Code JavaScript
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
JavaScript Promises
JavaScript PromisesJavaScript Promises
JavaScript Promises
 
SOLID principles
SOLID principlesSOLID principles
SOLID principles
 
Vue.js
Vue.jsVue.js
Vue.js
 
테크니컬 리더
테크니컬 리더테크니컬 리더
테크니컬 리더
 
Angular Web Programlama
Angular Web ProgramlamaAngular Web Programlama
Angular Web Programlama
 
COM Hijacking Techniques - Derbycon 2019
COM Hijacking Techniques - Derbycon 2019COM Hijacking Techniques - Derbycon 2019
COM Hijacking Techniques - Derbycon 2019
 
Clean code
Clean codeClean code
Clean code
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)
 

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
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた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
 

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 の活用
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
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 比較
 

Recently uploaded

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Recently uploaded (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

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