ROOT の Makefile.arch が色々と更新されちゃったので、その対処法

最近の ROOT では、Makefile.arch が 2 点変更になりました。

  1. $ROOTSYS/test/Makefile.arch から $ROOTSYS/etc/Makefile.arch へ移動した
  2. 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

以上の変更を施した実際の Makefile は、ここで見られます。