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
  1. https://github.com/smashedtoatoms/asdf-postgres/issues/77#issuecomment-1869649473 

  2. “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/ 

  3. https://github.com/postgres/postgres/blob/REL_16_1/configure#L8432