2001/02/06    ROOT on MacOSX

ようやく  ROOT がまともに動いた。長いトンネルであった。Dynamic Loader と Custom New/Delete の問題、semaphore の問題、それと、Xtools の不具合と、色々な問題が折り重なってその間の切り分けが難しく、それにカーネルの再構築で MacOS X が起動しなくなったりで踏んだり蹴ったり。いったい何度再インストールしたことか。おかげでちっともスキーに行けていない。

事の顛末
 ファイルやメモリーアクセスの排他制御のため、semaphore が必要であるが、MacOS X は posix semaphore しか提供しない。これは、SysV semaphore に比べて使いにくいので、http://www.darwinfo.org/で仕入れた情報により John Bellardo さんの sysv_sem patches を使う事にした。
これをあてて、Darwin 1.2 のカーネルを再構築し、MacOS X PB のものと置き換えたところ起動せず、しかたなくもとに戻したがそれでも起動しなくなってしまった。かねてより UFS を試してみたいという欲求があったので、深く追求する事なく、UFS で再インストール。
ところが、UFS では今までパスしていた CERNLIB の Paw Test に失敗するようになってしまった。これは再コンパイルで直るようなものかも知れないが、  MacOS X 固有のソフト、例えば  IE  が、ローカルファイルを開けなくなってしまったとか、不具合が続出、大文字・小文字の区別ができない以上の問題がでてきて、やむなく、HFS+ に逆戻りで再インストール。
SysV Semaphore のサポートは後回しにして、取り敢えず、ROOT のコンパイルを進める事にした。ここでまず問題になったのは、共有ライブラリーの作り方。MacOS X  では、バイナリーは Linux でおなじみの ELF ではなく、Mach-** なる特有のフォーマットで、いわゆる共有ライブラリー(lib**.dylib)と動的にロードするモジュール (**.bundle) とは別の作り方をしないといけない。
例えば共有ライブラリーなら

c++ -O -dylib -r -nostartfiles -install_name  <SONAME に対応する名前>    hoge1.o hoge2.o ......    -o libhoge.dylib
また、dynamically loadable module なら
c++ -O -bundle -undefined suppress hoge1.o hoge2.o .....  -o hoge.bundle
のような感じ。このオプションを適切に選ばないと duplicate symbols やら 何やらでまともに希望のものを作ってくれない。
これを知ったので、Tcl/Tk を共有ライブラリーにした。

後で書くようにいくつかパッチをあてる事により、取り敢えず、ROOT のコンパイルに成功するが、挙動不審。これは、___builtin_new や ___builtin_delete などの衝突である事が判明。ROOT はオブジェクトの一元管理のために new/delete を上書きして使っているが、一部で、大もとの libcc_dynamic.a にあるものが使われてしまっていた。これは、私の作った /usr/local/lib/libcc_dynamic.a が例えば ___builtin_new を private extern 指定をせずに定義してしまっているせいだった。これはもとの darwin source をいじっていない部分なので不思議であるが、とにかく、このせいで、ld  が ___builtin_new を "text" section でなく "Text" section  にバインドしてしまい、custom new と衝突を引き起こしていた。
gcc を作り直すのが筋だが、標準のものを使うように、応急処置として、問題の libcc_dynamic.a をライブラリーのサーチパスの外に隠してしまう。こうすることで、lib**.dylib に 大もとの ___builtin_new がバインドされる問題を避けられる。

しかし、それでも、Tenon の Xtools を rootless で使っていると、どこか知らない部分で 大もとの ___builtin_new が呼ばれてしまい、しかも、それが起こったり起こらなかったりで訳のわからない状態に陥る。また、GUI がマウスのイベントを受け取ったり取らなかったりもする。 Full screen mode ではこの問題は起こらない。実は、TkDesk のエディターの窓のリサイズは rootless で効かなかったりする問題と根は同じかも知れない。

さらに ROOT 同梱のテストを走らせると、いくつか問題あり(tests/vvector, vmatrix )。

Write vector v to database
Warning in <TClass::TClass>: no dictionary for class TFile is available
Warning in <TClass::TClass>: no dictionary for class TVector is available
Warning in <TClass::TClass>: no dictionary for class TKey is available
Warning in <TClass::TClass>: no dictionary for class TStreamerElement is available

Close database
Warning in <TClass::TClass>: no dictionary for class TList is available
Warning in <TClass::TClass>: no dictionary for class TObject is available
Warning in <TClass::TClass>: no dictionary for class TStreamerInfo is available
Warning in <TClass::TClass>: no dictionary for class TNamed is available
Warning in <TClass::TClass>: no dictionary for class TObjArray is available

Open database in read-only mode and read vector
Error in <TKey::ReadObj>: Cannot create new object of class TList
Error in <TKey::ReadObj>: Cannot create new object of class TVector

Read vector should be same as original still in memory

 *** Break *** bus error

てな感じのエラー。これは、Linux でいうところの -WL,-E  または  -rdynamic に対応するフラッグが立っていない症状(共有ライブラリーでインポートしたシンボルが main から見えない)である。ちょっと調査しただけでは対応するフラッグが見つからなかったので、main の 先頭でApplication Object を作る事で回避する。

しかーし、なおも問題は残る。stress test の終了時、また、TBrowser で root file を見ようとすると seg-fault する。Xtools に対してすっかり信用をなくしたので XFree86 を試す事にする。時間がないのでバイナリーをインストール。実は、バイナリーは共有ライブラリーを提供しないので、X 関連のアプリケーションを再コンパイルする必要があった(どちらが手間か迷ったすえ、既に十分打ちのめされていたので、安全な道を選んでしまった)。しかし、あまり期待していなかったとはいえ、やっぱり駄目であった。

そこで、いよいよ、後回しにしていた semaphore 問題に立ち返る。しかし、一度駄目だったものはやはり駄目、悲惨な事に、またシステムが起動しなくなってしまった。今度は、簡単にはあきらめられずネット上で情報を漁った結果、FAQ であった。つまり、WallStreet では、MacOS X partition は volume の先頭から 8GB 以内になくてはならなかった。うーん、それなら始めからインストールできたり動いたりしないで欲しい。ひとたび mach_kernel の位置を動かしたが最後、 BootX はそれを見失ってしまう。結局あきらめざるをえなかった。救いは、partition を小さくしたら嘘のように SysV Semaphore パッチのあたった custom kernel が起動したこと。

しかし、上記の残された ROOT の問題は解決せず。仕方なく地道なデバッグを始める。デバッグする事半日、ようやく原因をつきとめた。
何と ROOT のバグであった。これを直すと、見事、ROOT が美しく動いてくれた。
ようやく自前のソフトの移植に移行できる。早くスキーにいきたいが、忘れてしまう前に、再インストール後の足跡を簡単に。
 
 
 

[1] 再インストールと開発環境の整備(Xtools 使用の場合)

HFS+ にて再インストール。lan、Apple talk、Dock などの設定の後、
# vi /etc/hosts.deny
ALL:    ALL
# vi /etc/hosts.allow
ALL:    LOCAL ***.**.***.
sshd:   ALL
sshdfwd-X11:    ***.**.***.
# vi /System/Library/StartupItems/SSH/SSH
......
if [ "${SSHSERVER:=-NO-}" = "-YES-" ]; then
.....
        sshd -h /etc/ssh_host_key
fi
....
# vi /etc/hostconfig
....
SSHSERVER=-YES-
# vi /etc/sshd_config
....
Protocol 2,1
....
# vi /etc/ssh_config
....
Host *  ....
        ForwardX11 yes
        ....
そこで、Tenon よりダウンロードした Xtools をインストール。これはパッケージをダブルクリックしてインストール。その後、
# patch -p0 < memo/xtools.config.patch
# cd <somewhere>/fonts
# ls
6x12rk.pcf.gz             fonts.alias.75dpi.added   s5x8.pcf.gz
a12.pcf.gz                fonts.alias.misc.added
elisau10.pcf.gz           k12.pcf.gz
# cp *.gz /usr/X11R6/lib/X11/fonts/misc/
# mkfontdir /usr/X11R6/lib/X11/fonts/misc/
# cat fonts.alias.75dpi.added >> /usr/X11R6/lib/X11/fonts/75dpi/fonts.alias
# cat fonts.alias.misc.added >> /usr/X11R6/lib/X11/fonts/misc/fonts.alias
上記のパッチは共有ライブラリーを正しくインストールさせるために必要(canna で問題になった)。
また、例によって、Xaw3d を入れておく。
# tar -zxvf Xaw3d-1.5-bin.tar.gz -C /
# pushd /usr/X11R6/lib
# mv libXaw.dylib libXaw.dylib.ORIG
# ln -s libXaw3d.dylib libXaw.dylib
# popd
また、日本語環境も適当に。
# tar -zxvf bash-2.03-bin.tar.gz -C /
# cp /usr/local/bin/bash /bin/bash
# tar -zxvf less-358-bin.tar.gz -C /
# tar -zxvf nkf_1.92_1-bin.tar.gz -C /
# tar -zxvf kterm-6.2.0-bin.tar.gz -C /
# tar -zxvf Canna-3.5b2-bin.tar.gz -C /
# tar -zxvf kinput2-v3-bin.tar.gz -C /

# tar -zxvf tcltk-8.0.5jp-bin.tar.gz -C /
# tar -zxvf tkdesk-1.2jp-bin.tar.gz -C /


次に、まず ADC より入手した Apple's developer tools をインストール。これもパッケージをダブルクリックしてインストール。

また、以下のものは Apple の Darwin source repository よりダウンロードし、コンパイルする。/usr/bin/cc また、make は 3.79 を使う事。
コンパイルには

export HOSTTYPE=macintosh
export VENDOR=apple
export OSTYPE=macos
export MACHTYPE=powerpc
export MAKEFILEPATH=/Developer/Makefiles

export RC_ARCHS=ppc
export RC_CFLAGS='-arch ppc'
export RC_OS='macos'
export SRCROOT=`pwd`
export TARGETS=ppc
export HOSTS=ppc

などとしておくと良い。
$ cd bootstrap_cmds-24
$ mkdir tmp
$ su
# make install DSTROOT=`pwd`/tmp
# mkdir /Library/Frameworks
# cp -PR /System/Library/Frameworks/IOKit.framework /Library/Frameworks/IOKit.fr
amework
# mkdir /Local
# ln -s ../Library /Local/Library
# exit
$ ln -s xnu-3-1 xnu
$ cd xnu
$ vi SETUP/setup.sh
....
export SRCROOT=`pwd`
....
$ make exporthdrs
$ make
$ make install
$ ^C # quit when compilation starts

$ IOKitUser-3-1-0-1
$ vi Makefile
....
NEXTSTEP_BUILD_OUTPUT_DIR = /Users/fujiik/sandbox/xnu/BUILD/dst/System/Library/F
rameworks
...
$ make

$ su
# pushd ../xnu/BUILD/dst/System/Library/Frameworks/
# cp -Rp IOKit.framework/Versions/A/Headers/* /Library/Frameworks/IOKit.framewor
k/Versions/A/Headers/

# popd
# pushd ../xnu/BUILD/dst/System/Library/Frameworks/System.framework/
# cp -R libkern /System/Library/Frameworks/System.framework/Headers/libkern
# popd
$ cd ~/sandbox/darwin/build/Libm-18-1
$ su
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Libm-18-1-bin.tar.gz .
# tar -zxvf ../../../tgz/Libm-18-1-bin.tar.gz -C /
# exit

$ cd ../Libcurses-23
$ su
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Libcurses-23-bin.tar.gz .
# tar -zxvf ../../../tgz/Libcurses-23-bin.tar.gz -C /
# exit

$ cd ../Libcompat-14-1
$ su
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Libcompat-14-1-bin.tar.gz .
# tar -zxvf ../../../tgz/Libcompat-14-1-bin.tar.gz -C /
# exit

$ cd ../Libstreams-21-1
$ su
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Libstreams-21-1-bin.tar.gz .
# tar -zxvf ../../../tgz/Libstreams-21-1-bin.tar.gz -C /
# pushd /System/Library/Frameworks/System.framework/
# ln -s Versions/Current/PrivateHeaders .
# popd
# exit

$ cd ../Csu-35
$ su
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Csu-35-bin.tar.gz .
# tar -zxvf ../../../tgz/Csu-35-bin.tar.gz -C /
# exit

$ cd ../libc-149
$ make
$ su
# pushd /Users/Public/SandBox
# ln -s fujiik root
# popd
# make install DSTROOT=`pwd`/tmp
# cd tmp
# tar -zcvf ../../../tgz/Libc-149-bin.tar.gz .
# tar -zxvf ../../../tgz/Libc-149-bin.tar.gz -C /
# exit

$ cd ../cctools-6-1
$ cat ~/memo/setup.sh
export RC_ARCHS=ppc
export RC_CFLAGS='-arch ppc'
export RC_OS='macos'
export TARGETS=ppc
export HOSTS=ppc
export SRCROOT=`pwd`
export OBJROOT=$SRCROOT/BUILD/obj
export SYMROOT=$SRCROOT/BUILD/sym
export DSTROOT=$SRCROOT/BUILD/dst
$ mkdir -p BUILD/{obj,sym,dst}
$ source ~/memo/setup.sh
$ make install >& install.log
$ su
# cd BUILD/dst
# tar -zcvf ../../../../tgz/cctools-6-1-local-bin.tar.gz usr/local
# exit

$ cd gcc-2
$ cp -PR <somewhere>/libf2c .
$ cp -PR <somewhere>/gcc/f gcc/.
$ patch -p1 -s < <somewhere>/gcc-2.95.2-libg2c.patch
$ patch -p1 -s < <somewhere>/gcc-2.95.2-macosx.patch
$ make >& make.log &
$ cd gcc
$ for i in ../obj/cc-ppc-on-ppc/*.h; do ln -s $i .; done
$ cd ..
$ mkdir obj/ppc/libf2c
$ cd obj/ppc/libf2c
$ CFLAGS='-traditional-cpp' $SRCROOT/libf2c/configure --srcdir=/Users/fujiik/sandbox/gcc-2/libf2c --host=ppc --target=ppc
$ make TARGETS='ppc' HOSTS='ppc' >& make.log &

[2] dlcompat

www.darwinfo.org で libdl の改良版がある事を知る。これは LD_LIBRARY_PATH などが効くのでありがたい。
 
$ cd dlcompat-20010123
$ cat dlcompat-20010123-makefile.patch
--- dlcompat-20010123/Makefile.ORIG     Fri Jan 19 01:30:29 2001
+++ dlcompat-20010123/Makefile  Fri Jan 26 14:44:28 2001
@@ -31,7 +31,7 @@
 CFLAGS=-Wall -O2 -DDEBUG=$(DEBUG)
 AR=ar cru
 RANLIB=ranlib
-INSTALL=install
+INSTALL=install -c

 OBJS = dlopen.o

@@ -39,12 +39,14 @@
 all: libdl.a libdl.dylib

 install: all
-       if test ! -d $(prefix)/lib ; then mkdir $(prefix)/lib ; fi
-       $(INSTALL) -m 644 libdl.a $(prefix)/lib
-       $(RANLIB) $(prefix)/lib/libdl.a
-       chmod 644 $(prefix)/lib/libdl.a
-       $(INSTALL) -m 755 libdl.dylib $(prefix)/lib
-       if test ! -d $(prefix)/include ; then mkdir $(prefix)/include ; fi
+       if test ! -d $(prefix)/lib/system ; then mkdir -p $(prefix)/lib/system ;
 fi
+       $(INSTALL) -m 644 libdl.a $(prefix)/lib/system
+       $(RANLIB) $(prefix)/lib/system/libdl.a
+       chmod 644 $(prefix)/lib/system/libdl.a
+       ln -s system/libdl.a $(prefix)/lib/.
+       $(INSTALL) -m 755 libdl.dylib $(prefix)/lib/system
+       ln -s system/libdl.dylib $(prefix)/lib/.
+       if test ! -d $(prefix)/include ; then mkdir -p $(prefix)/include ; fi
        $(INSTALL) -m 644 dlfcn.h $(prefix)/include
$ patch -p1 -s < dlcompat-20010123-makefile.patch
$ make
$ su
# make install prefix=usr/local
# tar -zcvf dlcompat-2001023-bin.tar.gz usr
# tar -zxvf dlcompat-2001023-bin.tar.gz -C /

[3] 共有ライブラリー版 Tcl/Tk と TkDesk

共有ライブラリーの作り方を覚えたので作り直し。
$ for i in *.tar.gz; do tar -zxvf $i; done
$ tcl8.0.5/
$ patch -p2 < ../../tcl8.0.3-glibc21.patch
$ patch -p2 < ../../tcl8.0.5-sigpwr.patch
$ patch -p0 < ../../tcl8.0.5jp1.6.patch
$ patch -p1 < ../../tcl8.0.5-macosx-shared.patch
$ cd ../itcl3.0.1/
$ patch -p5 -s < ../../itcl_fix.diff
$ patch -p1 -s < ../../itcl3.0.1jp-tkpath.patch
$ patch -p1 < ../../tk8.0.5-macosx-shared.patch
$ cd ../tk8.0.5/
$ patch -p0 -s < ../../tk8.0.5jp1.6a.patch
$ patch -p1 -s < ../../tk8.0.5jp1.6a-im.patch
$ patch -p2 -s < ../../tcl8.0.5jp-path.patch
$ patch -p1 < ../../itcl3.0.1-macosx-shared.patch

$ cd tcl8.0.5/unix
$ ./configure --enable-shared --enable-gcc --prefix=/usr/local
$ make >& make.log      # with libc and libm, I don't need to set LIBS

$ cd tk8.0.5/unix
$ ./configure --enable-shared --enable-gcc --with-tcl=../../tcl8.0.5/unix --pref
ix=/usr/local
$ make >& make.log      # with libc and libm, I don't need to set LIBS

$ cd itcl3.0.1/
$ ./configure  --enable-shared --prefix=/usr/local -enable-gcc \
        --with-tcl=/Users/fujiik/sandbox/mypkg/src/tcltk/build/tcl8.0.5/unix/ \
        -with-tk=/Users/fujiik/sandbox/mypkg/src/tcltk/build/tk8.0.5/unix/
$ make CC='gcc -DKANJI -DKINPUT2 -DXIM_IMPROVE' >& make.log &

そして、TkDesk。
$ tkdesk-1.2
$ patch -p1 < ../tkdesk-1.2+jp.patch
$ patch -p0 < ../exit-save-dd.diff
$ cd tcldesk/
$ patch -p0 < ../../appbar-dnd.diff
$ patch -p0 < ../../empty-trash.diff
$ patch -p0 < ../../find-dd.diff
$ cd ..
$ ./configure --prefix=/usr/local
$ make CC_OPTS="-O2  -DKANJI -DKINPUT2 -DXIM_IMPROVE"
$ mkdir -p usr/local/{bin,lib,man}
$ make install INSTALL_ROOT=`pwd`

[4] CERNLIB Related

高エネルギー業界、標準ツール。
# tar -zxvf lesstif-08102000.tar.gz -C /
# pushd /usr/X11R6/include/
# ln -s ../../local/LessTif/Motif1.2/include/Xm .
# ln -s ../../local/LessTif/Motif1.2/include/Mrm .
# cd include
# ln -s ../Xm .
# ln -s ../Mrm .
# cd ../lib
# ln -s ../../local/LessTif/Motif1.2/lib/libXm.a .
# ln -s ../../local/LessTif/Motif1.2/lib/libMrm.a .
# popd
# mkdir /cernlib
# ln -s cernlib /cern
# ln -s 2000 /cern/pro
# for i in cernlib-2000-*; do tar -zxvf $i -C /cernlib/; done
# tar -zxvf patchy-4.15-bin.tar.gz -C /

# tar -zxvf readline-4.1-bin.tar.gz -C /
# tar -zxvf termcap-2.0.8-bin.tar.gz -C /
# tar -zxvf dis45-v1.36-bin.tar.gz -C /

# tar -zxvf freetype-1.3.1-bin.tar.gz -C /

[5] XFree86 を試す

XFree86 が Darwin を正式サポートしている。つまり、バイナリー配布があるという事。時間もないので共有ライブラリーがないという問題はあるが取り敢えずできあいのもので間に合わせる。
Xtools でひっくり返っていたマウスの真中と右ボタンが XFree86 では正しい。キーボードも標準で Ascii 配列で嬉しい。
要注意なのは、/private/etc/X11 が実ディレクトリーである事。Xtools では symbolic link。もちろん、XFree86 が正しい。
 
# cd /etc
# mv X11 X11.tenon
# cd /usr
# mv X11R6 X11R6.tenon
# cd <somewhere>
# sh Xinstall.sh
# tar -zxpvf XAqua0.2.tgz -C /
# cd <somewhere>/fonts
# ls
6x12rk.pcf.gz             fonts.alias.75dpi.added   s5x8.pcf.gz
a12.pcf.gz                fonts.alias.misc.added
elisau10.pcf.gz           k12.pcf.gz
# cp *.gz /usr/X11R6/lib/X11/fonts/misc/
# cat fonts.alias.75dpi.added >> /usr/X11R6/lib/X11/fonts/75dpi/fonts.alias
# cat fonts.alias.misc.added >> /usr/X11R6/lib/X11/fonts/misc/fonts.alias
# pushd /usr/X11R6/lib/X11/config
# vi Imake.cf
.....
#if defined(__APPLE__)
# undef __APPLE__
# define MacroIncludeFile <darwin.cf>
# define MacroFile darwin.cf
# define DarwinArchitecture
# define MacOSXArchitecture             # for convenience
#endif


Lesstif の代わりに OpenMotif にしてみる。

# cd <somewhere>
# ls
Mrm-headers.tar.gz                      libUil.a.gz
Uil-headers.tar.gz                      libXm.a.gz
Xm-headers.tar.gz                       usr-include-headers.tar.gz
libMrm.a.gz
# for i in Mrm-headers.tar.gz Uil-headers.tar.gz Xm-headers.tar.gz; do tar -zxpv
f $i -C /usr/X11R6/include; done
# cp libXm.a.gz libMrm.a.gz libUil.a.gz /usr/X11R6/lib
# pushd /usr/X11R6/lib
# gunzip libXm.a.gz libMrm.a.gz libUil.a.gz
# for i in libXm.a.gz libMrm.a.gz libUil.a.gz; do ranlib -s $i; done
# cd ../include/X11
# for i in ../Xm ../Mrm ../Uil; do ln -s $i .; done
OpenGL も
# cd ../../lib
# cp /usr/X11R6.tenon/lib/libGLU.a .
# cp /usr/X11R6.tenon/lib/libglut.a .
# for i in libGLU.a libglut.a; do ranlib -s $i; done
# cp -pPR /usr/X11R6.tenon/include/GL /usr/X11R6/include
これでもって、Xaw3d、fvwm2、kinput2、Tcl/Tk、TkDesk など X 関連をリンクし直し。うーん、やっぱり共有ライブラリーが欲しい。
tdr、cernlib executables、dis45 もリンクし直し。XFree86 でリンクし直したものは -xf86 というタグをつけてある。

日本語キーボードを ascii 配列で使うため

$ vi ~/.Xmodmap
keycode 101 = grave asciitilde
などとしておく。また、X 起動時に fvwm2 と TkDesk が立ち上がるようにしておく。
$ cat $HOME/bin/tkdesk
#!/bin/bash
source ~/.profile
xmodmap ~/.Xmodmap
export SHELL=/bin/bash
exec /usr/local/bin/tkdesk $*
$ vi ~/.xinitrc
.....
$HOME/bin/tkdesk $* &
exec /usr/local/bin/fvwm2

$ ln -s .Xdefaults ~/.Xresources

とにかく、bash を使いたいので、.profile で export SHELL=/bin/bash にする反則技を使っている。

Xtools に戻るには /etc/X11 と /usr/X11R6 を入れ換えれば良い。
 

[6] Mach Kernel with Bellardo's  SysV Semaphore

まずは Darwin の Kernel Source、xnu-3-1 を Apple の Darwin 1.2 source tree より入手。
$ cd xnu
$ pushd bsd/kern
$ patch -s < ~/sandbox/xnu-patches/sysvsem_bsd_kern.patch
$ mv sysv_sem.c sysv_sem.c.ORIG
$ cp ~/sandbox/xnu-patches/sysv_sem.c
$ cd ../sys
$ patch -s < ~/sandbox/xnu-patches/sysvsem_bsd_sys.patch
$ mv sem.h sem.h.ORIG
$ cp ~/sandbox/xnu-patches/sem.h .
$ cd ../conf/
$ patch -s < ~/sandbox/xnu-patches/sysvsem_bsd_conf.patch
$ popd
$ make installhdrs
$ make install
パッチ、および precompiled kernel はここ。私のマシンでは動いたが、動作する保証は全くないので使う場合は自己責任で
 

[7] ROOT 3.00.02

開発環境は
        mach_kernel: xnu-3-1 with John Bellardo's sysv_sem patches
        libdl.dylib: dlcompat-20010123 by Christoph Pfisterer
        standard gcc*-2 + g77 in gcc*-2-macosx-with-g77.tar.gz
        XFree86-4.0.2
        freetype-1.3.1

コンパイルの仕方は

$ tar -zxvf ../orig/root_v3.00.02.source.tar.gz
$ tar -zxvf ../orig/ttf_1.1.tar.gz
# mv ttf/fonts /usr/share/fonts/ttf
# pushd /cern/pro/lib
# ln -s libpythia6134.a libPythia.a
# pushd /System/Library/Frameworks/System.framework/Headers/c++
# cp -p <somewhere>/stream.h .
# cp -p <somewhere>/stdiostream.h .
$ cd root
$ export ROOTSYS=`pwd`
$ export LD_LIBRARY_PATH=$ROOTSYS/lib
$ export PATH=$ROOTSYS/bin:$PATH
$ patch -p1 -s < ../orig/root_v3.00.02-macosx-0.2.patch
$ export PATH=/usr/bin:$PATH    # use standard cc and c++
$ ./configure darwin
$ make
$ cd lib
$ for i in *.dylib; do lib=`basename $i .dylib`; \
        g++ -O -bundle -undefined suppress -o $lib.so $i; done
stream.h と stdiostream.h は g++ のもの。Apple の標準ではインストールされない。私家版の MacOSX パッチには、ROOT 自体の問題に対する以下のパッチも含まれる。
--- 3.00.02/gui/src/TGButton.cxx.ORIG   Tue Oct 17 21:34:52 2000
+++ 3.00.02/gui/src/TGButton.cxx        Tue Feb  6 16:14:45 2001
@@ -76,6 +76,7 @@
    fMsgWindow   = p;
    fUserData    = 0;
    fTip         = 0;
+   fGroup       = 0;

    fNormGC   = norm;
    fState    = kButtonUp;

この問題のせいで、fGroup にゴミが入っていると、実体がいると思って参照先を delete に行って seg-fault する。
 

今までにコンパイルしたもののソースおよびパッチは macosx/src に、またバイナリーの tar ball は macosx/tgz または macosx/darwin.tgz にそれぞれ置いてある。いつものように使う場合は自己責任で。
 


Back to Keisuke Fujii's MkLinux/LinuxPPC Life