pkg-configに対応する

libpngのconfigure.acを見るとpkgconfigという単語がちょこちょこ出ていたので、これも対応すべきなのかな? と思い調べた。
実際どれくらい使われているのかはよく分からないけれど、『pkg-config --list-all』を見ると有名なライブラリでは結構使われているようなので、便利そうだしうちも対応しときましょうかーとかいう感じ。

pkg-configとは?

pkg-configとはアプリケーションやライブラリのコンパイル時に使うヘルパーツール。特定のライブラリを使うときにコンパラに渡すべきオプションを出力してくれる。
例えばこんな感じで使う。

[user@sakuraki ~]$ pkg-config --cflags --libs libpng
-I/usr/include/libpng12  -lpng12  
[user@sakuraki ~]$ gcc -o pngtest pngtest.c `pkg-config --cflags --libs libpng`

また、autoconfでライブラリを探す方法として、PKG_CHECK_MODULESというマクロがあり、これもpkg-configの情報を使用している。

自分的には「つまりapr-configだよ」で分かる。こっちが元ネタだったのか。

pkg-configの仕組み

使ってみた感想からの想像なので注意。
pkg-configは、ライブラリのインストール時に作られるpkg-config用のメタデータファイル(*.pc)を使って求められた情報を出力している。このファイルはpkgconfig用のディレクトリ(例えば/usr/lib/pkgconfig)に保存されている。pkg-configはそのディレクトリから指定されたライブラリ名のファイルを見つけてくる。見つからない場合は、環境変数『PKG_CONFIG_PATH』も探す。$HOMEにライブラリをインストールしている場合は、『PKG_CONFIG_PATH』を宣言しないとホームディレクトリ内のライブラリに対して使うことができない。

#.bash_profile
export PKG_CONFIG_PATH=$HOME/lib/pkgconfig

対応する

libpiyopiyo.pcを作ってpkgconfigディレクトリにインストールする。
まず雛形ファイルを作る。(libpiyopiyo.pc.in)
コレは自動で作れそうな気がしたけど、作り方が分からないので自分で作ることにした。

prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@

Name: @PACKAGE@
Description: @PIYOPIYO_DESCRIPTION@
Version: @VERSION@
Libs: -L${libdir} -lpiyopiyo
Cflags: -I${includedir}

PIYOPIYO_DESCRIPTION以外は、AC_INITに渡した値やprefixなどがconfigureでAC_SUBSTされる。HOGE_DESCRIPTIONだけは自分で定義してAC_SUBSTしておく。

# configure.ac
PIYOPIYO_DESCRIPTION='The Piyopiyo Library'
#...
AC_SUBST(PIYOPIYO_DESCRIPTION)

さらに出力ファイルを指定する。

# configure.ac
AC_CONFIG_FILES([libpiyopiyo.pc:libpiyopiyo.pc.in])

これでconfigure時に『libpiyopiyo.pc』が作成されるようになる。
次にMakefile.amにインストール方法を記述することになるが、先にpcファイルを保存する先をconfigure時に指定できるようにしておく。

# configure.ac
AC_ARG_WITH(pkgconfigdir,
	AC_HELP_STRING([--with-pkgconfigdir],
	[Use the specified pkgconfig dir (default is libdir/pkgconfig)]),
	[pkgconfigdir=${withval}],
	[pkgconfigdir='${libdir}/pkgconfig'])
AC_MSG_NOTICE([pkgconfig directory is ${pkgconfigdir}])

『--with-pkgconfigdir=』でインストール先を指定できるようにする。

インストール方法をMakefile.amに記述する。インストール先は上で作成したpkgconfigdirになる。

## Makefile.am
# headers (必要なら)
pkgincludedir= $(includedir)
pkginclude_HEADERS= piyopiyo.h
# pkgconfig
pkgconfigdir = @pkgconfigdir@
pkgconfig_DATA = libpiyopiyo.pc

make clean時にlibpiyopiyo.pcも消すようにする。

## Makefile.am
CLEANFILES += libpiyopiyo.pc

確認。

[user@sakuraki ~]$ autoreconf --force --install
[user@sakuraki ~]$ ./configure --prefix=$HOME
[user@sakuraki ~]$ make install
[user@sakuraki ~]$ pkg-config --clfags --libs libpiyopiyo
-I/home/user/include  -L/home/user/lib -lpiyopiyo