TL;DR: PKG_CONFIG_PATH を icu4c に通してあげましょう。
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
PostgreSQL v16 のビルドを macOS でおこなおうとして、こんなエラーにあって失敗しました。 Sonoma 14.1.2 で遭遇しましたが Monterey 12.7.1 でもおなじことになるそうです1。
checking whether to build with ICU support... yes
checking for icu-uc icu-i18n... no
configure: error: ICU library not found
If you have ICU already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-icu to disable ICU support.
FAILED: install exited with an error
ICU とは “International Components for Unicode” のアクロニムで、つまるところ Unicode のライブラリのことです。 PostgreSQL v16 はデフォルトで ICU をサポートするようになりました2。
postgres のレポジトリに configure というファイルがあります。これは Makefile をつくるためのスクリプトで、このなかで pkg-config を使って icu-uc.pc と icu-i18n.pc を探しています3。
pkg_cv_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-uc icu-i18n" 2>/dev/null`
これがさっきのエラーのこの部分に対応していそうです。
checking for icu-uc icu-i18n... no
pkg-config コマンドだけを実行してみましょう。こういうエラーが出ます。
$ pkg-config --cflags 'icu-uc icu-i18n'
Package icu-uc was not found in the pkg-config search path.
Perhaps you should add the directory containing `icu-uc.pc'
to the PKG_CONFIG_PATH environment variable
No package 'icu-uc' found
Package icu-i18n was not found in the pkg-config search path.
Perhaps you should add the directory containing `icu-i18n.pc'
to the PKG_CONFIG_PATH environment variable
No package 'icu-i18n' found
ようするに PKG_CONFIG_PATH に icu-uc.pc と icu-i18n.pc を通してあげればいいわけです。 homebrew で icu4c を入れていれば、 brew info icu4c
の末尾にこう書いてあるのをみつけられます。
$ brew info icu4c
...
For pkg-config to find icu4c you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
いわれたとおりにこう実行してからビルドするといいでしょう。
export PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig"
たとえば asdf をつかっているのであればこうやってあげればビルドできます。
PKG_CONFIG_PATH="/usr/local/opt/icu4c/lib/pkgconfig" asdf install postgres 16.1
-
https://github.com/smashedtoatoms/asdf-postgres/issues/77#issuecomment-1869649473 ↩
-
“PostgreSQL 16 builds with ICU support by default, determines the default ICU locale from the environment, and allows users to define custom ICU collation rules.” https://www.postgresql.org/about/news/postgresql-16-released-2715/ ↩
-
https://github.com/postgres/postgres/blob/REL_16_1/configure#L8432 ↩