Gonyの日記: GNU Autotools戦記。 2
ここまでのあらすじ、つーか備忘録(お
もともとはソースディレクトリ直下にソースファイルが
配置してあり、その状態では問題なくautoconf / automakeが
動いていた。で、今後の拡張に備え、機能毎にサブディレクトリ下に
ソースを移動したところ、automakeに「サブディレクトリには
対応してねえぜ畜生!!」とか怒られる。
畜生はこっちのセリフだぜ畜生!! とか思いつつも対策が思い付かず、
まとまった情報元の必要を感じ、御本購入。
で、御本からの入れ知恵によりサブディレクトリごとにMakefileを
作り、Libtoolライブラリとやらを作るという対策に挑む。
が、今度はautomake実行中に"library used but `LIBTOOL' not defined
in `configure.in'"ってエラーがでて、無視してもリンクで怒られる。
configure.inにはAC_PROG_LIBTOOLってちゃんと書いてるし、
もうわけわからん、のでLibtoolはあきらめて、普通のlibもご.aの
形式のライブラリをこしらえることにして問題回避。
これで終ったかと思ったら今度はソースディレクトリ直下にソースが
ないとプログラム名の.cファイルを勝手にコンパイルしようと
しだして有事。そんなファイルねえよ(苦笑)。
ソースディレクトリ直下のMakefile.amの
bin_PROGRAMS = もご
もご_LDADD = もご/libもご.a ... (以下略)
を
bin_PROGRAMS = もご
もご_SOURCES =
もご_LDADD = もご/libもご.a ... (以下略)
にしたら回避できた。なんじゃそりゃ。
と思ったら今度はリンクが通らない、つーかリンカ(gcc)のコマンド名が
端末にでてない。Makefileを見ると$(LINK)が設定されていない。
とりあえずあれだ、もういい加減やんだぐなった(仙台弁で)ので、
Makefile.amに
LINK = gcc -o もご
と追加して無理矢理逃げる。
なんかインチキにも程があるが、当分configure.inもMakefile.amも
いぢりたくないので、このままでいこうかと(お
もっと上品な解決法ご存知のかたいらっしゃいましたら
ツッコミおねがいいたします(ぺこり)。
ソースファイルをサブディレクトリに置く場合 (スコア:2)
bin_PROGRAMS = もご
もご_SOURCES = dummy.c
もご_LDADD = もご/libもご.a ...
ついでに。作るものが共有ライブラリだとlibtoolも絡んでくるのでもっとややこしくなります。例えばlibfoo.soを作る場合、やり方は以下のようになります。
Makefile.am:
SUBDIRS = sub1 sub2 ...
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = dummy.c
libfoo_la_LIBADD = sub1/spam.lo sub1/egg.lo sub2/spam.lo ...
sub1/Makefile.am:
noinst_LTLIBRARIES = libsub1.la
libsub1_la_SOURCES = spam.c egg.c
まず、共有ライブラリを作る場合に_LIBADDに含めることができるのは.lo(libtool object)と.la(libtool library)だけです。.oや.aを直接リンクすることはできません。
次に注意しなければならないのは、_LIBADDにlibsub1.laを入れてはいけないということです。さもないと、libfoo.soにはlibsub1.soが必要だけど見つからないよ、ということになってしまうので。sub1でlibsub1.laを作っているのは.loを作るためです。
おかげさまでもう一歩前へ。 (スコア:2)
ダミーのソースファイルを置くという対処法は思い付きませんでした。
この対処法でリンクが通らない問題が解決したことはもちろん、
これに味をしめ、調子にのってトップディレクトリのMakefile.amに
lib_LTLIBRARIES = libdummy.la
libdummy_la_SOURCES = dummy.c
と追加したところLibtoolが動かなかった問題も解決しました。
ほんとはダミーなんて使わなくともちゃんとGNU Autotoolsのほうで
対応してくれれば一番いいんですけど、ぼくは手段は割とどうでもいい
人なので(まて)、Autotoolsが対応してくれるまではこの手で
対処しようと思います。
もいちど、ありがとうございます。
ごにい(ろぐいんするのなんかげつぶりだろう)