Amazon Linux 2023でphp-imapを利用する

# Amazon Linux 2023では、php-imapが使えない
Amazon Linux 2023では、デフォルトではphp-imapが使えません（パッケージとして配布されていません）。
RedHat系Linuxではありますが、EPELやRemiといった追加リポジトリも受け付けてくれません。

では、php-imapは使えないのかというとそうではありません。dnf(パッケージ管理ソフト)の大元である、rpm自体は削除されずに残っているようなので、rpmからビルドします。

※こちらの記事を参考にさせていただきました。ありがとうございます。
[Amazon Linux 2 のPHP7.4にphp-imapをインストールする](https://inoccu.com/blog/2021/09/23/152457.html)

# 参考サイトをもとに、Amazon Linux 2023のコマンドに読み替えていく

```bash
# phpのrpmをダウンロード
dnf download --source php

# mockbuildユーザー、mockグループを作成しておく（rpm実行時にエラーが出るため）
useradd -s /sbin/nologin mockbuild
groupadd mock

# rpmをインストール
rpm -ih php8.2-8.2.9-1.amzn2023.0.3.src.rpm
# ->rpmbuildというディレクトリが作成される。

# ビルド用のツールをインストール
dnf groupinstall "Development Tools"

```
`rpmbuild/SPECS/php.spec`を少し編集する。

```bash:rpmbuild/SPECS/php.spec
%package imap
Summary: A module for PHP %{phpver} applications that use IMAP
# All files licensed under PHP version 3.01
License: PHP
Provides: php-imap = %{version}-%{release}
Provides: php-imap%{?_isa} = %{version}-%{release}
Requires: php-common%{?_isa} = %{version}-%{release}
BuildRequires: pkgconfig(krb5)
BuildRequires: pkgconfig(krb5-gssapi)
BuildRequires: openssl-devel >= 1.0.2
#BuildRequires: libc-client-devel <- コメントアウト（後ほどソースからビルドするため）

```

ビルド用のコマンドを実行し、不足しているパッケージを導入していく。
```bash
rpmbuild -ba php.spec --with imap

#setting SOURCE_DATE_EPOCH=1694131200
#error: Failed build dependencies:
#        aspell-devel >= 0.50.0 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        bzip2-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        gmp-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        httpd-devel >= 2.0.46-1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        httpd-filesystem is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        krb5-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        libacl-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        libpq-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        libtidy-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        libtool-ltdl-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        lmdb-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        net-snmp-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        nginx-filesystem is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        openldap-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        openssl-devel >= 1.0.2 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pam-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(enchant-2) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(gdlib) >= 2.1.1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(icu-i18n) >= 50.1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(icu-io) >= 50.1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(icu-uc) >= 50.1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(krb5) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(krb5-gssapi) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libcurl) >= 7.29.0 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libedit) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libexslt) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libffi) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libpcre2-8) >= 10.30 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libsasl2) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libsodium) >= 1.0.9 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libsystemd) >= 209 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libxml-2.0) is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libxml-2.0) >= 2.7.6 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libxslt) >= 1.1 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(libzip) >= 0.11 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(oniguruma) >= 6.8 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        pkgconfig(sqlite3) >= 3.7.4 is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        smtpdaemon is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        tokyocabinet-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64
#        unixODBC-devel is needed by php8.2-8.2.9-1.amzn2023.0.3.x86_64

#これらをインストールする。
# pkgconfig経由で読み込むパッケージ類は、https://pkgs.org/search/などで検索してインストールする。
# 今回の場合は下記のようなコマンドになった。
dnf install \
aspell-devel \
bzip2-devel \
cyrus-sasl-devel \
enchant2-devel \
gd-devel \
gmp-devel \
httpd-devel \
httpd-filesystem \
krb5-devel \
krb5-devel \
libacl-devel \
libcurl-devel \
libedit-devel \
libffi-devel \
libicu-devel \
libpq-devel \
libsodium-devel \
libtidy-devel \
libtool-ltdl-devel \
libxslt-devel \
libzip-devel \
lmdb-devel \
net-snmp-devel \
nginx-filesystem \
oniguruma-devel \
openldap-devel \
openssl-devel \
pam-devel \
pcre2-devel \
smtpdaemon \
sqlite-devel \
systemd-devel \
tokyocabinet-devel \
unixODBC-devel

# また、gpgv2というコマンドが必要で、gnupg2というパッケージが必要だが、
# デフォルトでインストールされているgnupg2-minimalとコンフリクトしてしまうので、--allowerasingをつけて入れ替える。
dnf install gnupg2 --allowerasing
```
こで再度、ビルド用のコマンドを実行すすると、ある程度処理が進むようになる。
`rpmbuild -ba php.spec --with imap`
が、途中で下記のようなエラーが出る。
```
configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.
```
これは、libc-clientをインストールしていない事によるエラー。libc-clientをビルドしていく。

# libc-clientのビルド
[php公式ドキュメント](https://www.php.net/manual/ja/imap.requirements.php)にも、php-imapを利用するにはlibc-clientが必要だと書いてある。

githubからソースコードをダウンロードする。
※このためだけにgitを設定するのは面倒なので、ソースのみダウンロードする。
```bash
#openssl 3系は、ライブラリの場所がちがうので、リンクを作ってやる。
cd /usr/local/
ln -s /usr ssl

cd
curl -LO https://github.com/uw-imap/imap/archive/refs/heads/master.tar.gz
tar xf master.tar.gz
cd imap-master

# ビルドする。
make lnp SSLTYPE=unix EXTRACFLAGS=-fPIC

# ソースのインストール
cp -p c-client/*.h /usr/local/include
cp c-client/c-client.a  /usr/local/lib/libc-client.a

# php8.2では、c-clientというディレクトリを作成する必要？(こうすると何故か通る)
mkdir /usr/local/c-client/
cp c-client/c-client.a /usr/local/c-client/libc-client.a
```

# phpのパッケージを作成する。
ふたたび、`rpmbuild/SPECS/php.spec`のある場所へ移動し、ビルドコマンドを実行。
すると、ビルドが走り出す(インスタンスタイプによっては、かなり時間がかかる)
```
rpmbuild -ba php.spec --with imap
```

完了すると、`rpmbuild RPMS/x86_64`に色々とrpmファイルができているので、インストールします。

```bash
php8.2-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-bcmath-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-bcmath-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-cli-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-cli-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-common-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-common-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-dba-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-dba-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-dbg-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-dbg-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-debugsource-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-devel-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-embedded-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-embedded-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-enchant-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-enchant-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-ffi-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-ffi-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-fpm-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-fpm-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-gd-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-gd-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-gmp-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-gmp-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-imap-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-imap-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-intl-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-intl-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-ldap-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-ldap-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-mbstring-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-mbstring-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-mysqlnd-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-mysqlnd-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-odbc-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-odbc-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-opcache-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-opcache-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pdo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pdo-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pgsql-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pgsql-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-process-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-process-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pspell-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-pspell-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-snmp-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-snmp-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-soap-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-soap-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-tidy-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-tidy-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-xml-8.2.9-1.amzn2023.0.2.x86_64.rpm
php8.2-xml-debuginfo-8.2.9-1.amzn2023.0.2.x86_64.rpm
```
すべて、このrpmからインストールします。
デフォルトのリポジトリからのビルドと混ざってしまうと、インストールはできるものの正常に動作しない関数が出てきます。
```bash
dnf install --disablerepo=* \
php8.2{,-{cli,common,devel,fpm,gd,imap,mbstring,opcache,pdo,pgsql,process,xml}}-8.2.9-1.amzn2023.0.2.x86_64.rpm
```
以上。