このエントリはPhalcon PHP Advent Calendar 2014 4日目のエントリです。2日目としてPhalcon 1.xのRPMパッケージを作っています。今回はPhalcon2のRPMパッケージをphp-phalcon2.xパッケージとして作ります。多分動くと思いますが、ほとんどテストしていないので問題があったらコメントをお願いします。
php-phalconとphp-phalcon2パッケージは同時にインストールできないので注意してください。
Phalcon2.xとPhalcon1.xの違い
Phalcon2ではZephir言語というPhalconモジュールを作るための言語がサポートされています。これはZephir言語で書かれたプログラムをPHPのネイティブモジュールにしてくれるソフトウェアです。Phalcon2のRPMパッケージではこれもインストールします。
私のブログでもZephirを利用したJavaScript文字列エスケープ関数の作成を紹介しています。この関数の場合、大量のPHP関数を呼び出いしているのであまり高速化のメリットが出ていませんが、大量のPHP関数呼び出さなかったり、大量のZephirモジュール関数を呼び出す場合にはメリットが大きくなります。
Phalcon2のREAME.mdファイルではバンドルしているjson-cライブラリを使うようにと書かれています。見たところ最新のjson-cライブラリなら大丈夫そうでした。最新のjson-cライブラリが必要なのでFedora20でのみ試しています。
php-phalcon2のSEPCファイル
Phalcon2スペックファイルではZephirもビルドするので別のスペックファイルにしました。Phalcon1.xのphp-phalcon.specとPhalcon2.xのphp-phalcon2.specの差分は以下の通りです。
[yohgaki@dev rpmbuild]$ diff -u SPECS/php-phalcon.spec SPECS/php-phalcon2.spec
--- SPECS/php-phalcon.spec 2014-12-03 12:13:58.433542202 +0900
+++ SPECS/php-phalcon2.spec 2014-12-03 13:30:36.751916601 +0900
@@ -1,30 +1,34 @@
%global pkgname phalcon
-Name: php-phalcon
-Version: 1.3.4
+Name: php-phalcon2
+Version: 2.0.0
Release: 1%{?dist}
Summary: PhalconPHP is a web framework delivered as a C extension
License: BSD
URL: http://phalconphp.com
-Source0: c%{pkgname}-master.zip
+Source0: c%{pkgname}-2.0.0.zip
Source1: %{pkgname}-devtools-master.zip
+Source2: zephir-master.zip
-BuildRequires: gcc php-devel php-mysql php-pear
+BuildRequires: gcc php-devel php-mysql php-pear json-c-devel re2c pcre-devel
Requires: php-mysql php-pear php-mbstring php-mcrypt php-openssl php-pdo
+Requires: json-c pcre
Requires: php(zend-abi) >= 20090626
Requires: php(api) >= 20090626
+Conflicts: php-phalcon phalconphp
%description
PhalconPHP is a web framework written in C and works as C module.
%prep
-%setup -q -n cphalcon-master
+%setup -q -n cphalcon-2.0.0
unzip %{SOURCE1}
(cd phalcon-devtools-master; find * > ../phalcon-devtools-files)
-
+unzip %{SOURCE2}
%build
+pushd .
+###Build phalcon
cd build
%ifarch i686 i586 i486 i386
cd 32bits
@@ -38,6 +42,33 @@
CFLAGS="-march=native -mtune=native -O2 -fno-delete-null-pointer-checks -finline-functions -fomit-frame-pointer -fno-builtin-memcmp" \
make %{?_smp_mflags}
+###Build zephir
+popd
+cd zephir-master
+cd parser
+rm -f *.o *.lo
+
+#Compile lemon
+if [ ! -f lemon ]; then
+ gcc -w lemon.c -o lemon
+fi
+
+re2c -o scanner.c scanner.re && ./lemon -s parser.lemon && cat base.c >> parser.c
+if [ ! -f parser.c ]; then
+ echo "error: re2c is not installed"
+ exit 2
+fi
+
+sed s/"\#line"/"\/\/"/g scanner.c > xx && mv -f xx scanner.c
+sed s/"#line"/"\/\/"/g parser.c > xx && mv -f xx parser.c
+export CFLAGS="-g3 -O0"
+gcc -g3 -w parser.c scanner.c -ljson-c -o ../bin/zephir-parser
+
+cd ..
+ZEPHIRDIR="%{_datadir}/zephir"
+sed "s#%ZEPHIRDIR%#$ZEPHIRDIR#g" bin/zephir > bin/zephir-cmd
+chmod 755 bin/zephir-cmd
+
%install
rm -rf %{buildroot}
@@ -68,6 +99,10 @@
%{__install} -d 755 %{buildroot}%{_bindir}
(cd %{buildroot}%{_bindir}; ln -sfn ../..%{_datadir}/phalcon-devtools/phalcon.sh phalcon)
+%{__install} -d 755 %{buildroot}%{_datadir}/zephir
+%{__cp} -ad ./zephir-master/* %{buildroot}/%{_datadir}/zephir/
+%{__install} %{buildroot}%{_datadir}/zephir/bin/zephir-cmd %{buildroot}%{_bindir}/zephir
+#(cd %{buildroot}%{_bindir}; ln -sfn ../..%{_datadir}/zephir/zephir-cmd zephir)
%clean
rm -rf %{buildroot}
@@ -80,8 +115,9 @@
%doc CHANGELOG README.md CONTRIBUTING.md docs/*
%{_bindir}/phalcon
+%{_bindir}/zephir
%{_datadir}/phalcon-devtools
-
+%{_datadir}/zephir
%changelog
* Fri Nov 22 2013 Yasuo Ohgaki <yohgaki@ohgaki.net>
新しいPhalcon/ZephirのZIPファイルに差し替え、ビルドするだけで最新版のRPMパッケージができます。
今回作ったSRPMファイルは以下のURLからダウンロードできます。
php-phalcon2.specのビルド
ビルドに必要な手順は「Phalcon PHPのRPMパッケージを作る」とほぼ変わりません。上記のURLからSPRMをダウンロードし、SRPMをインストールします。
rpm -ihv php-phalcon2-x.x.x.src.rpm
その後にrpmbuildコマンドでビルドします。
rpmbuild -ba rpmbuild/SPEC/php-phalcon2.spec
ビルドに必要なパッケージが入っていれば、これだけでRPMパッケージが作成されます。yumコマンドでインストールし、httpdを再起動すればPhalcon2が使えます。
sudo yum install rpmbuild/RPMS/x86_64/php-phalcon2-x.x.x.rpm sudo systemctl restart httpd.service
パッケージにはphalconコマンドとzephirコマンドが入っています。使い方はPhalconとZephirのサイトを参照してください。
同じバージョンのRPMパッケージができると新旧の判断ができなくなるので、少なくともリリース番号を増やすと良いでしょう。
Release: 1%{?dist}
これを
Release: 2%{?dist}
などとします。
バージョンアップ方法
新しいPhalcon2、Zephirがリリースされた場合、githubリポジトリから適切なZIPファイルをダウンロードし、~/rpmbuild/SOURCESにコピーし、上記のrpmbuildコマンドでビルドします。
Phalcon2はphalcon/cphalconリポジトリの2.0.0ブランチ、Zephirはphalcon/zephirリポジトリのmasterブランチのZIPファイルが必要です。
Zephirのパッケージング
しっかりしたRPMパッケージを作っている方ならすぐ気が付くと思います。Zephirのパッケージングは手抜きをしています。Zephirはgitリポジトリからのクローンしてビルドしてインストールすることを想定しています。
今回はリポジトリを丸ごと/usr/share/zephirに入れています。手抜きをしないパッケージゃーであれば、必要性最低限のファイルのみを入れます。
必要性最低限のファイルのみだとパッケージとしては格好が良いのですが、バージョンアップを行う場合にSPECファイルの調整が必要となるケースが増えます。パッケージとしての見栄えより使い勝手を優先してこうしています。
※ 元となったphp-phalcon.specを作った時から同じ理由で、phalcon本体、devtoolsの手抜きをしています。
まとめ
RPMパッケージにしておくと簡単に新しい環境にインストールできるので便利です。RHEL系のOSでお仕事をされている方はぜひ試してみてください。
繰り返しになりすが、ほとんどテストしていません。問題があったら教えてください!CentOSなどでビルドできるようにした、などのコメントも歓迎します。