ROOT の Makefile.arch が色々と更新されちゃったので、その対処法
最近の ROOT では、Makefile.arch が 2 点変更になりました。
- $ROOTSYS/test/Makefile.arch から $ROOTSYS/etc/Makefile.arch へ移動した
- ld の引数に -undefined を使わなくなったので、明示的に使用する library を与えないといけない
そのため、古い ROOT、新しめの ROOT の両方に対応できる Makefile を書くには、いくつか変更を要します。
まず 1 点目。これまで、自分は $ROOTSYS/test/Makefile を真似して Makefile を書いてきました。同じことをしている人は多いでしょう。しかし $ROOTSYS/test/Makefile.arch が $ROOTSYS/etc/Makefile.arch に移動したため、これを Makefile の中で include しては、file が存在しないと怒られてしまいます。Revision 41594 以降でこの問題が現れます。
そこで、従来
include $(ROOTSYS)/test/Makefile.arch
としてきたものを、次のように書き換えました。
MAKEARCH := $(shell find $(ROOTSYS)/test -name Makefile.arch) ifeq ($(MAKEARCH), ) # 41594 or later MAKEARCH := $(shell find $(ROOTSYS)/etc -name Makefile.arch) endif include $(MAKEARCH)
このようにすることで、実際に存在するほうの Makefile.arch を読んでくれます。もう少し綺麗な書き方があると思いますが、Makefile あんまり詳しくないので、これで良いことにします。
2 点目。Revision 40240 から、OS X 上では ld の -undefined という引数が使われなくなることになりました。そのため、標準的でない ROOT の library や外部 library を使用する時には、ld をする時点で明示的にそれら library を link してやる必要があります。僕の場合は、libGeom と libGeomPainter を使う library を書いています。
$ROOTSYS/test/Makefile を見ると、40240 以降では以下のような書き方に変わっています。
ifeq ($(PLATFORM),macosx) # We need to make both the .dylib and the .so $(LD) $(SOFLAGS)$@ $(LDFLAGS) $^ $(OutPutOpt) $@ $(EXPLLINKLIBS)
それ以前だと、該当箇所は以下の通りです。
ifeq ($(PLATFORM),macosx) # We need to make both the .dylib and the .so $(LD) $(SOFLAGS)$@ $(LDFLAGS) $^ $(OutPutOpt) $@
Makefile.arch の中に $(EXPLLINKLIBS) という変数が追加されており、この中に必要な library が記述されるようになりました。変数の中身は、-L/usr/local/root/lib -lGpad -lHist のようなものです。
40240 より前では -undefined が引数に与えられていたため、このような library の指定がなくとも ld が動きました。しかし、40240 以降を使う場合は、以下のように libGeom などを $(EXPLLINKLIBS) に追加しましょう。
ifneq ($(EXPLLINKLIBS), ) EXPLLINKLIBS += -lGeom -lGeomPainter endif