結論
PKG_CONFIG_PATH=/path/to/abc/lib/pkgconfig pkg-config --cflags abclib
が期待しない結果を表示したら/path/to/abc/lib/pkgconfig
にabclib.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
がどのバージョンのものか不明なのでマイナーバージョンまで指定したほうが確実ですね。