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 の扱いについて詳細をドキュメントで追う。