CentOSにてPHP7.4系をソースからコンパイルしようとした時に、libzipのエラーに悩まされて有効化するまでに大変手間取りました。
libzipはZip圧縮ファイルの読み書きが可能になるモジュールで、WordPressのサイトヘルスチェックにも入っているかなり一般的なモジュールです。
ネット上ではPHP7.3での対処法が多かったのですが、PHP7.4でlibzipの扱い方が変わったので7.3の頃の対処法は使えません。
今回の記事では、PHP7.4でLibzipを有効化するための対処法が分かるように記載していきます。
ざっくり手順説明
libzipがエラーとなってしまう原因
PHPでの動作に必要なのはlibzip0.11以上
PHPでlibzipを動作させるためには、libzip0.11以上のバージョンが必要です。0.11.2以降が推奨されています。
yumコマンドでインストールできるlibzipは0.10.1
PHPの動作にはlibzipとlibzip-develの両方が必要です。yumで入れる場合は以下のようになります。
# yum install libzip libzip-devel
ただし、yumコマンドでインストールしたlibzipは0.10.1なので、PHP7.4で動作させるために必要な最低条件を満たしていません。
お使いのlibzipのバージョンが分からない場合は、yum info で確認できます。
$ yum info libzip
–with-zipでのConfigureエラー
PHP7.4でlibzipを有効化するには、–with-zipオプションでコンパイルする必要があります。
上記のように条件に満たないlibzipでコンパイルを行うと、以下のようなエラーが出ます。
configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
Requested 'libzip >= 0.11' but version of libzip is 0.10.1
つまり、libzipのバージョンが低すぎてコンパイルできないのです。
さらにいうと、libzipは0.11以上である必要がありますが、1.3.1と1.7.0は動作しないとのこと。
ややこしいですが、まずは条件に合うlibzipをインストールするところから始めなくてはなりません。
libzipのダウンロード手順
yumが当てにならないので、libzipは公式サイトからダウンロードします。
22年3月時点の最新バージョンは1.8.0。0.11以上で1.3.1または1.7.0以外のバージョンを選びます。大抵の場合、最新バージョンを選んでおけば大丈夫です。
上記公式サイトからlibzip-1.8.0.tar.gzを入手した上でTarを解凍します。
# wget https://libzip.org/download/libzip-1.8.0.tar.gz
# tar -xzf libzip-1.8.0.tar.gz
# cd libzip-1.8.0/
libzipのインストール手順
cmake3をインストール
さて、ここでさらに問題があります。libzipのコンパイルには最新のcmakeが必要なのです。
これは素直にyumでインストールすればOK。
# yum install cmake3
依存性の関係か、かなり色々なパッケージがインストールされました。
libzipをコンパイル
cmake3のインストールが終われば、liibzipをコンパイルできます。/path/to の部分は適宜ご自分の環境に書き変えてください。
# cmake3 -DCMAKE_INSTALL_PREFIX=/path/to/libzip
libzipのインストール
コンパイルが完了したらmake と make install。make checkはお好みで。
# make
# make check
# make install
libzipを有効化したPHP7.4系のコンパイル方法
新旧コンパイルオプション
これでlibzipがインストールされましたが、次の問題はPHPのコンパイルオプションです。
PHP7.3の頃は–with-libzip=DIRというオプションが使えたので、このオプションを使ってコンパイルするという対処法を多く見かけます。
が、しかし!
PHP7.4では–with-libzip=DIRオプションが削除されており、コンパイル時にlibzipのディレクトリを指定できません。
さらに、PHP7.3では–ebable-zipという記述でしたが、PHP7.4では–with-zipへと変更になっています。さらにPHP7.3まではバンドルされていたlibzipがPHP7.4からはバンドルされなくなりました。
この辺りの事情が、libzipを有効化するのに手間取る大きな理由のひとつとなっています。
パッケージのインストールに悩まされた上に、仕様変更のせいで使えていたコンパイルオプションが使えなくなり、混乱が起きやすい状況です。
PHP7.4でのコンパイルオプションは–with-zip一択
PHP7.4でのコンパイルオプションは–with-zipのみであり、ディレクトリを指定するオプションはありません。
ではどうするかというと、エラーメッセージにヒントがあります。
Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables LIBZIP_CFLAGS and LIBZIP_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.
PKG_CONFIG_PATHという環境変数を使うか、LIBZIP_CFLAGSやLIBZIP_LIBSという環境変数を使うことを考慮するように、とあります。
非デフォルトインストールモジュールへの環境変数を設定する
上記の環境変数は、デフォルトのインストール先でないモジュールを使用する時に使う変数です。
まさに今回のような、自分でインストールしたlibzipを使用する場合などに使います。
PKG_CONFIG_PATHはその他のモジュールでも使用できる汎用変数、LIBZIP_CFLAGSとLIBZIP_LIBSはlibzip専用の変数です。
./cofigure に追加する
export を使用して環境変数に追加する方法もありますが、ここでは./configureに直接します。
PKG_CONFIG_PATHを使用する場合
インストールしたlibzipに「lib64/pkgconfig」というディレクトリがあるので、そこへのパスを指定します。
./configure
(略)
--with-zip
PKG_CONFIG_PATH=/path/to/libzip/lib64/pkgconfig
PKG_CONFIG_PATHを他のモジュールでも使用したい場合は:(コロン)で区切って複数指定します。
PKG_CONFIG_PATH=/path/to/libzip/lib64/pkgconfig:/path/to/module/lib64/pkgconfig/
LIBZIP_CFLAGSとLIBZIP_LIBSを使用する場合
LIBZIP_CFLAGSの方は「include」に、LIBZIP_LIBSの方は「lib64」ディレクトリへのパスを指定します。
指定の際には以下のようにオプションも記載しないと、configureが正常終了してもmakeでつまずくという事態に陥りましたので注意して下さい。
./configure
(略)
--with-zip
LIBZIP_CFLAGS=-I/path/to/libzip/include
LIBZIP_LIBS=-L/path/to/libzip/lib64 -lzip
まとめ
PHP7.4コンパイル時のlibzipエラーへの対処法は以上です。
最後までお読みいただきありがとうございました。
コメント