何が起こったか

pyenvでPython 3.12.2をインストールしようとした際に、以下のエラーが出てしまい失敗した。

$ pyenv install 3.12.2
downloading Python-3.12.2.tar.xz...
-> https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
installing Python-3.12.2...

bUILD FAILED (Ubuntu 22.04 using python-build 20180424)

inspect or clean up the working tree at /tmp/python-build.20240720132805.714194
results logged to /tmp/python-build.20240720132805.714194.log

last 10 log lines:
/usr/bin/install -c -m 755 Modules/_codecs_hk.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_codecs_hk.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_codecs_iso2022.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_codecs_jp.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_codecs_jp.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_codecs_kr.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_codecs_kr.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_codecs_tw.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_codecs_tw.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_multibytecodec.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_multibytecodec.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/unicodedata.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/unicodedata.cpython-312-x86_64-linux-gnu.so
/usr/bin/install -c -m 755 Modules/_crypt.cpython-312-x86_64-linux-gnu.so /home/user/.pyenv/versions/3.12.2/lib/python3.12/lib-dynload/_crypt.cpython-312-x86_64-linux-gnu.so
/usr/bin/install: 'Modules/_crypt.cpython-312-x86_64-linux-gnu.so' を stat できません: そのようなファイルやディレクトリはありません
make: *** [Makefile:2085: sharedinstall] エラー 1

事象が発生した環境は以下の通り。

$ lsb_release -a
lSB Version:	core-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch
distributor ID:	Ubuntu
description:	Ubuntu 22.04.3 LTS
release:	22.04
codename:	jammy
$ pyenv -v
pyenv 2.3.36

解決策

homebrewでpkg-configを一時的にunlinkする

$ brew unlink pkg-config
unlinking /home/linuxbrew/.linuxbrew/Cellar/pkg-config/0.29.2_3... 4 symlinks removed.

リトライ結果は以下の通り

$ pyenv install 3.12.2
downloading Python-3.12.2.tar.xz...
-> https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
installing Python-3.12.2...
installed Python-3.12.2 to /home/user/.pyenv/versions/3.12.2

原因

筆者の環境だと、pyenvはLinuxのHomebrew(Linuxbrew)でインストールされておりました。

その場合、こちらに記載されている通り、Linuxbrewを用いてインストールしたpyenvで本事象が発生する模様です。

Linuxbrewでpyenvをインストールすると依存関係でpkg-configもインストールされるが、pyenvはデフォルトではLinuxbrewのライブラリを利用することができないようで、コンパイル時にエラーが発生する場合があるとのこと。

そのため、brew unlinkで一時的にLinuxbrewでインストールしたpkg-configを無効化し、システムへインストールされた(aptでインストールされた)pkg-configを利用することで解消できました。

pyenv install時のログを見ると、brew unlinkを実行する前はhomebrewのpkg-configが利用されており、unlink後はaptでインストールされたpkg-configが使用されています。

brew unlink前のインストールログ

checking for pkg-config... /home/linuxbrew/.linuxbrew/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes

brew unlink後のインストールログ

checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes

一時的に無効化したpkg-configは以下のコマンドで再利用可能となります。

$ brew link pkg-config
Linking /home/linuxbrew/.linuxbrew/Cellar/pkg-config/0.29.2_3... 4 symlinks created.

余談

そもそもpkg-configとは

  • pkg-config はソフトウェアのコンパイル時にライブラリの情報を提供するためのツール
  • 主な機能
    • ライブラリの情報を提供する
      • ライブラリのインクルードディレクトリ(ヘッダーファイルが置かれている場所)
      • ライブラリのリンクディレクトリ
      • コンパイル時に必要なフラグ(オプション)
      • リンク時に必要なフラグ
    • コンパイルとリンクの簡略化する
      • 開発者が手動でフラグを指定する必要を減らし、コンパイルコマンドをシンプルにできる
      • 複数のライブラリが必要な場合、それらの依存関係を自動的に処理できる