メモの日々


2009年01月16日(金) [長年日記]

  • 病気は完治した。
  • 初めてマスクを買ったが、なんだかもったいなくて使えない。

[dev][howto] autotoolsを使った

autotoolsを使っている既存のツールをカスタマイズする機会があり、autotoolsを少し理解できるようになった。ちょっとだけメモ。

Makefileを修正したいとき

  1. Makefile.am を修正する。
  2. automakeコマンドを実行する。これにより、修正の反映された Makefile.in が生成される。

これで、次にconfigureを実行したときに修正の反映されたMakefileが生成されるようになる。

config.hを修正したいとき

config.hはconfigureの実行により生成されるファイルで、ビルド環境の状態を反映した定数定義などがされている。これを修正したい時は、

  1. configure.ac を修正する。
  2. autoheaderコマンドを実行する。これにより、修正の反映された config.h.in が生成される。
  3. autoconfコマンドを実行する。これにより、修正の反映された configure が生成される。

これで、次にconfigureを実行したときに修正の反映されたconfig.hが生成されるようになる。

[追記] 以下に書いた方法は不完全でした。後日の日記も合わせて参照してください。 [追記ここまで]

configure.ac の書き方はまだ理解しきれていないが、AC_DEFINE または AC_DEFINE_UNQUOTED マクロを使うと新しい定数をconfig.hに追加することができた。例えば、

AC_DEFINE_UNQUOTED([PREFIX_DIR], ["$prefix"], [install directory])

という行を追加してからautoheaderを実行すると、config.h.inに

/* install directory */
#undef PREFIX_DIR

という行が追加され、その後でautoconfコマンドを実行して生成されたconfigureを「./configure --prefix=/home/oreore/test」などと実行すると、config.hに

/* install directory */
#define PREFIX_DIR "/home/oreore/test"

という行が追加される。

[c][howto] Cで実行ファイル自身の絶対パスを得る

同じようなことをバッチファイルで実現する方法はこの間メモしたが、Cではどうやるんだっけ。既にメモしていた気もしていたが見当たらない。

まず思いつくのは argv[0] を使う方法だが、色々なケースを考えるとここから絶対パスを得るのは面倒くさい。

別のアプローチは、上に書いたように autotools などを使ってインストールディレクトリのパスをソースコードへ埋め込む方法。これだと実行ファイル自身のパスを得ていることにはならない(コピーされたら駄目)けれど、用途によっては機能する。Unix Programming Frequently Asked Questions 日本語訳にそのような話が書かれていた。

BINARY HACKSの項目64には /proc から読み取る方法が書かれていた。Linuxなら「/proc/self/exe」、FreeBSDなら「/proc/curproc/file」をreadlinkで読み込めばいいとのこと。使えるならこれが便利かな。