Autotools 格闘中 その2
Boehm GC
Boehm GC は処理系にスタティックリンクしたいので libgc.a を作りリンクする。
できるだけ Boehm GC の configure を生かしたいので
- gc/configure.ac に手を入れて不要なオプションを disabled にする
- その後 autoreconf -i で configure を更新
- monar/Makefile.am で SUBDIRS = $(BOEHM_GC_DIR) とする
今有効にしておきたいのは以下のオプション
- DNO_EXECUTE_PERMISSION=1
- DALL_INTERIOR_POINTERS=1
- DATOMIC_UNCOLLECTABLE=1
- DNO_CLOCK
- UMSWIN32
ちなみにリンクするターゲットの libgc.a は .libs/libgc.a に生成されるんですがこれ使って良いんだろうか。
libgc.la は華麗にスルーした。
鬼車
Boehm GC と同様にやったらうまくいった。
困っていること
compiler.cpp だけ -O2 の指定を外してビルドするようにしたい。(-O2だと死ぬほど時間がかかるので)
どうすればいいんだろう。
とりあえず
XX_LDADD = compiler.o として別枠で管理するか。
追記 id:nyaxt さんからのヒント
noinst_LIBRARIES として compiler.o を ar する。その時に CXXFLAGS を指定する
monar_LDADD = $(GC_LIB) $(REGEXP_LIB) libcompiler.a noinst_LIBRARIES = libcompiler.a libcompiler_a_CXXFLAGS = -O1 libcompiler_a_SOURCES = compiler.cpp
一見うまく行きそうだが
g++ -DHAVE_CONFIG_H -I. -I ./gc-7.1alpha3/include -I ./onig-5.7.0 -O1 -g -O2 -MT libcompiler_a-compiler.o -MD -MP -MF .deps/libcompiler_a-compiler.Tpo -c -o libcompiler_a-compiler.o `test -f 'compiler.cpp' || echo './'`compiler.cpp
誰かが -g -O2 をつけやがる。
追記2
configure.in で CFLAGSが空だと CFLAGS=-O2 -g になってしまうらしい。
なので CFLAGS= " " としてやったらうまくいった。
困っていることその2
Boehm GC の CFLAGS から -g を除きたい。
生成したファイルを消す
CLEANFILES に書けば make clean したときに消えてくれる。
CLEANFILES = $(GENERATED) monar-compiler.o
ビルドに依存するファイルの生成
ヘッダや cpp なファイルをコンパイル時に生成してビルドする場合
monar_DEPENDENCIES = Instruction.h compiler.cpp
のように DEPENDENCIES に書くのは間違いで
BUILT_SOURCES = Instruction.h compiler.cpp
とするのが正しい。
疑問
鬼車と Boehm GC はスタティックリンクするだけなのだから make install で .so やら .aがインストールされるのはうれしくないよね。
ToDo
- ■make dist した結果がきちんとビルドできること
- ■config.h を include してライブラリパスを得ること
- □鬼車/Boehm GC の CFLAGS をまともにする
- □benchmark をとる
- □オプションのパースについて。
- □ドキュメント生成
- □make install で鬼車などのライブラリがインストールされないように
さあ。がんばろう。
続く。
処理系が使うライブラリをどこに置くか?
prefix/lib/monar 的なものを config.h から取り出したい。
こういうのはどうだろう。
configure.in で
AC_SUBST(MONAR_LIB_PATH, "${datadir}")
としてやると
Makefile.am で
echo "@MONAR_LIB_PATH@"
のように @@ で囲めば参照できる。
これは実際の ./configure 後の Makefile では
echo "${datarootdir}"
となっていて最終的には
/usr/local/share
が出力される。
Boehm GC の CFLAGS が -O2 -g となってしまう件
CFLAGS が空だとデフォルトで -g がついてしまう。
なので Boehm GC に元からあった configure.ac に
AC_SUBST(CFLAGS) if test "" = "$CFLAGS"; then CFLAGS="-O2 -fomit-frame-pointer" fi
と追記。
本当は SUBDIRS = gc としている親ディレクトリから CFLAGS がうまく渡れば良いと思うのだけども。
あれ。うまくいかないな。
とりあえず -g をつける文化はやめてほしい。
空ではなくて gc の configure の時点で -O2 -g っぽい。
明日は SUBDIRS の扱いについて詳細をドキュメントで追う。