LoginSignup
0
0

More than 1 year has passed since last update.

PKG_CONFIG_PATHが効いていないと思ったらファイルがなかった

Posted at

結論

PKG_CONFIG_PATH=/path/to/abc/lib/pkgconfig pkg-config --cflags abclibが期待しない結果を表示したら/path/to/abc/lib/pkgconfigabclib.pcファイルがあるかどうか確認する。

物語

Homebrewで以下のバージョンのPythonをインストールしています。

  • python@3.8
  • python@3.11

CPython系プログラムのビルドの際にビルドフラグが必要なのでpkg-configコマンドで取得しています。

今回はPython3.8系でビルドしたかったため、PATHを設定しています。

$ export PATH=/usr/local/opt/python@3.8/libexec/bin:$PATH
$ python3 -V
Python 3.8.16

通常はpkg-configを使用してフラグを取得します。

$ pkg-config --cflags python3-embed
-I/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/include/python3.11

現状Python3.11のフラグが取得されてしまいます。
こんなときは、PKG_CONFIG_PATHを設定することで優先して設定ファイルを読み込みます。

今回はPython3.8のpkgconfigの場所を指定します。
場所は以下のようにして探していました。

$ find "$(python3-config --prefix)" -type d -name "pkgconfig"
/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig

そしてこれをPKG_CONFIG_PATHに指定して実行するとPython3.8用のフラグが取れま

$ PKG_CONFIG_PATH=/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig pkg-config --cflags python3-embed
-I/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/include/python3.11

せんね。。
なぜかPython3.11の結果を取得しました。

おかしいですね。
中身を見てみましょうか。

$ ls /usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/pkgconfig
python-3.8-embed.pc python-3.8.pc

うーむ。何かがおかしい。python3-embed.pcがないですね。原因がわかりました。

pkg-configを実行する際、
pkg-config --cflag somelib
と指定した際は、somelib.pcを使用して結果を返すのですが、今回そのファイルはPKG_CONFIG_PATHで指定したディレクトリにはなかったため、通常のパス(/usr/local/lib/pkgconfig)からpython3-embed.pcが読み込まれたということでした。

念の為、python3-embed.pcを見てみると以下のようにPython3.11向けの内容となっていました。

$ cat /usr/local/lib/pkgconfig/python3-embed.pc
# See: man pkg-config
prefix=/usr/local/opt/python@3.11/Frameworks/Python.framework/Versions/3.11
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: Python
Description: Embed Python into an application
Requires:
Version: 3.11
Libs.private: -ldl  -framework CoreFoundation
Libs: -L${libdir} -lpython3.11
Cflags: -I${includedir}/python3.11

ということで、
pkg-config --cflags python3-embed ではなく
pkg-config --cflags python-3.8-embedが正解でした。

/usr/local/lib/pkgconfigの中身は以下の通りpython-3.8-embed.pcを含んでいたので環境変数もいらなかったですね。

$ ls /usr/local/lib/pkgconfig | grep python
python-3.11-embed.pc
python-3.11.pc
python-3.8-embed.pc
python-3.8.pc
python3-embed.pc
python3.pc

複数のPythonを色んな方法でインストールしている場合はpython3-embed.pcがどのバージョンのものか不明なのでマイナーバージョンまで指定したほうが確実ですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0