home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

C言語系/memos/pkg-config (v1)

C言語系/memos/pkg-config (v1)

C言語系 / memos / pkg-config (v1)
id: 486 所有者: msakamoto-sf    作成日: 2009-11-18 11:39:34
カテゴリ: C言語 

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なら";"(セミコロン)で区切る。

Autoconf/Makefile.amへの組み込み

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ファイルも生成され、"@変数名@"は適切に置換される。

このようにしておけば、ファイルのインストール先や各種オプションがメタデータファイルに適切に同期される。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2009-11-18 11:41:42
md5:34207b16a94e46a15e68504da72c7695
sha1:206ee3b729a01f18761477b9359aa8e7ecae9f57
コメント
コメントを投稿するにはログインして下さい。