いい感じにPHP Runtimeのdebパッケージを作る
PHPのエッジなバージョン (例えば今の時点だと 8.0.0alpha3
) を使いたい場合,多くの場合はソースコードからビルドする必要があります.その他にもランタイムのオプションをいじりたいだとか,そういった様々な理由からPHPをソースコードからビルドしなければならないことがあります.あるでしょう.
ソースコードからビルドするのはまあ良いんですが,そのビルド成果物 (つまりPHPランタイム) のデプロイ対象が多い場合に都度都度その環境でビルドをするのは時間がかかってしまいますし,計算機リソースの無駄遣いです.
というわけでDebianやUbuntuを利用している場合だとdebパッケージを一度こさえて,それをばら撒くようにすると経済的です.
以下はミニマムな例:
$ curl -LO https://downloads.php.net/~carusogabriel/php-8.0.0alpha3.tar.gz $ tar zxf php-8.0.0alpha3.tar.gz $ cd php-8.0.0alpha3 $ ./configure $ make $ INSTALL_ROOT="/path/to/php-dist" make install
というふうにしておき, /path/to/php-dist/DEBIAN/control
に
Package: php8 Maintainer: moznion <moznion@gmail.com> Architecture: amd64 Version: 8.0.0alpha3 Description: php 8 binary
というようなcontrolファイルを置いて,
fakeroot dpkg-deb --build /path/to/php-dist/ .
というふうにしておくと良い感じでdebパッケージが作成されます.
特記事項としては
./configure
の際に--prefix
を付与してはならない--prefix
の代わりにmake install
の際にINSTALL_ROOT
環境変数を付加する
というあたりです.
というのも ./configure
に --prefix
を付けてしまうと,build / install された成果物がそのprefixの内容に依存してしまうため,ビルドした環境の構成 (特にpath) とdebパッケージの展開先の環境構成が異なるときにうまく動作しなくなる場合があります.
例えば,./configure --prefix=/tmp/dist
として make
と make install
すると,成果物は /tmp/dist
以下に展開されます.その状態でdebパッケージを作成し,そのパッケージを利用して別の環境にインストールすると,モノ自体は /usr/local
以下にインストールされますが,インストールされたモノたちは /tmp/dist
に依存しています (例えば php.ini
の場所は /tmp/dist/usr/local/lib/php.ini
にあることが期待されてしまう).びみょう.
というわけで --prefix
を渡さないようにしておきつつ (つまりデフォルトの /usr/local
が利用される),しかしそのまま make install
するとそのまま /usr/local
以下にモノがインストールされてしまいdebパッケージを作成するには具合が悪いので,INSTALL_ROOT
環境変数によって「インストール先だけを変える」ことにより,そのディレクトリに対してdebパッケージを作るといい感じに作成できます (つまりこの場合だと php.ini
の場所は /usr/local/lib/php.ini
になる).
良かったですね.