pkg-configの自分用メモ
ライブラリなどのパッケージ毎に、インストール先やコンパイル/リンクオプションを定義したメタデータファイルを用意しておき、
$ gcc -c `pkg-config --cflags gtk+-2.0` -o foo.o foo.c $ gcc `pkg-config --lflags gtk+-2.0` -o gtktest foo.o
のように組み込む事で、コンパイルオプションやリンクオプションを展開してくれる開発ツールである。
対応するメタデータファイルは、"パッケージ名" + ".pc"となり、上の例だと"gtk+-2.0.pc"が後述のメタデータファイル読み込みディレクトリに存在する必要がある。
単独で使用してみるとどう展開されるかが確認できる。
$ pkg-config --cflags gtk+-2.0 -I/usr/include/gtk-2.0 \ # ここからは/usr/lib/pkgconfig/gtk+-2.0.pc で定義されている # 依存パッケージを辿って出力される"-I"オプション -I/usr/lib/gtk-2.0/include \ -I/usr/include/atk-1.0 \ (...) -I/usr/include/libpng12
$ pkg-config --libs gtk+-2.0 -L/lib \ -lgtk-x11-2.0 \ # ここからは/usr/lib/pkgconfig/gtk+-2.0.pc で定義されている # 依存パッケージを辿って出力される"-l"オプション -lgdk-x11-2.0 \ (...) -lglib-2.0
他:
パッケージのバージョン取得: $ pkg-config --modversion libssl 0.9.8b 最小バージョンのチェック(プロセス終了時の戻り値で判別): $ pkg-config --atleast-version 0.9.7 libssl $ echo $? 0 $ pkg-config --atleast-version 0.9.9 libssl $ echo $? 1 バージョンの正確な一致チェック(プロセス終了時の戻り値で判別): $ pkg-config --exact-version 0.9.8 libssl $ echo $? 1 $ pkg-config --exact-version 0.9.8b libssl $ echo $? 0 最大バージョンのチェック(プロセス終了時の戻り値で判別): $ pkg-config --max-version 0.9.10 libssl $ echo $? 0 $ pkg-config --max-version 0.9.7 libssl $ echo $? 1
CentOS 5.2, pkgconfig-0.21 の構成:
$ rpm -ql pkgconfig /usr/bin/pkg-config /usr/lib/pkgconfig /usr/share/aclocal/pkg.m4 /usr/share/man/man1/pkg-config.1.gz /usr/share/pkgconfig
シンプルな構成になっている。"*.pc"ファイルは次のディレクトリから検索される。
/usr/lib/pkgconfig /usr/share/pkgconfig
なおこの2ディレクトリは、pkg-configをコンパイル・インストールする時のオプションによって変わる。上記値はあくまでもCentOS 5.2におけるpkgconfigの値である。
PKG_CONFIG_PATH環境変数が設定されている場合は、先にPKG_CONFIG_PATHを検索した後、上記2ディレクトリを検索する。
PKG_CONFIG_PATHに複数ディレクトリを設定する場合は、UNIX系なら":"(カンマ), Windowsなら";"(セミコロン)で区切る。
configure.acに、次のm4マクロを組み込む。
PKG_CHECK_MODULES(VARIABLE-PREFIX,MODULES[,ACTION-IF-FOUND,[ACTION-IF-NOT-FOUND]]) → MYSTUFF_LIBS と MYSTUFF_CFLAGS にそれぞれ "--libs", "--cflags" の展開値がセットされる。
例:
PKG_CHECK_MODULES([MYSTUFF], [gtk+-2.0 >= 1.3.5 libxml = 1.8.4]) ... PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.0.0, have_gtk=yes, AC_MSG_ERROR(Cannot find GTK+ 2.0)) echo "have_gtk=$have_gtk" ...
Makefile.amに組み込む時は、"***_LIBS", "***_CFLAGS"を使えば良い。
configure.ac :
PKG_CHECK_MODULES(GTK, ...)
Makefile.am :
bin_PROGRAMS = gtktest gtktest_SOURCES = gtktest.c gtktest_LDADD = @GTK_LIBS@ gtktest_CFLAGS = @GTK_CFLAGS@
※"XXYY_CFLAGS"を追加すると "Makefile.am: required file `config/compile' not found" というエラーになった場合は、"automake -a -c"すると良い。"compile"サポートスクリプトがコピーされ、Makefile.inも正常に生成される。
なお単純にpkg-configプログラムの存在チェックだけを行いたい場合は、次のm4マクロをconfigure.acに組み込む。
PKG_PROG_PKG_CONFIG([MIN-VERSION])
ライブラリのパッケージなどを開発しており、pkg-configサポートとして独自のメタデータファイルを作成したい場合はAutoconfを利用すると良い。
具体的には、メタデータファイル名を"libfoo.pc"とすれば、configure.acのAC_CONFIG_FILESに"libfoo.pc"を追加し、
AC_CONFIG_FILES(Makefile) ↓ AC_CONFIG_FILES(Makefile libfoo.pc)
さらに"libfoo.pc.in"ファイルを準備する。libfoo.pc.in ファイル中ではMakefile.inと同様の"@変数名@"が利用できる。
これにより、"./configure"コマンドによりMakefileと同様にlibfoo.pcファイルも生成され、"@変数名@"は適切に置換される。
このようにしておけば、ファイルのインストール先や各種オプションがメタデータファイルに適切に同期される。
コメント