Phalcon2.xのRPMパッケージを作る

(Last Updated On: )

このエントリは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コマンドが入っています。使い方はPhalconZephirのサイトを参照してください。

同じバージョンの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などでビルドできるようにした、などのコメントも歓迎します。

投稿者: yohgaki