2001/04/24    Finally Moved to MacOS X Release

文字通り重い腰をあげて、ようやく正式版に移行した。実は前から Ti PowerBook G4 が注文してあって、それが来たら移行しようと計画していたのだが、 来てみたら初期不良で電源スイッチを押しても全く動く気配がない。で、送り返したらちっとも戻ってこない。 そうこうするうちに WallStreet の Public Beta は起動のたびにもう使うなと警告が出るようになり、ついに観念した訳である。 まぁ、Darwin 1.3.1 がリリースされ、SysV Semaphoreパッチを当てたカスタムカーネルが使えそうな 見通しである点も大きい。この際、Tiが戻ってきたらすぐセットアップできるように、 いろんなものを RPM にしておくことにする。
さて、ついていないときはこういうものなのかも知れないが、今まで Public Beta を入れて散々使ってきた2番目のパーティションに正式版をインストールしたのだが、起動しない。 前にも最初の8GBの問題がありパーティションを切り直してあったのでよもやとは思ったが、どうも欲を出して8GBぎりぎりにしたのがよくなかったようである。 それにしても、それならインストールできないようにしておいて欲しいものである。 実際、はまりついでに今度は8GBよりわずが大きめにしてチェックしたら、 インストーラーがそのパーティションを選択させてくれなくなるので一応プロテクションはしてはいるようだ。 が、どうもトレランスの評価に問題があるようである。 というわけでとりあえずアップデートが効くものかどうか試そうというもくろみははずれ、 新規インストールとなった。今度はカーネルを動かしてもちゃんと再起動できるので大丈夫であろう。
以下に作業メモを載せておく。 いつものように、tar は gnutar を使うこと。私の場合は、tar は gnutar のエイリアスになっている。さもないと、ディレクトリーを symlink で上書きしたり、その逆をやったり、ディレクトリーの所有権やパーミッションが変わってしまったりと、ろくなことはない。
 
 

1. Update Classic Environment to MacOS 9.1

まずは MacOS 9.1 を 9.04 に上書きインストール。

2. Installation of MacOS X

上に書いたようにMacOS X パーティションを最初の8GBに余裕をもって入るようにした。しかし、 これでは何のために30GBのディスクにしたのか。なんだかなーである。まぁ、これで無事インストール+起動に成功。

3. MacOS X Update

自動的にソフトウエア‐アップデータが走り、自分自身を更新した。システム環境設定からもう一度アップデータを走らせると今度は MacOS X 10.0.01 Update ができる。よしよし。

4. Enable SU

ここでとりあえず今後のために su できるようにしておく。手順は
Invoke Netinfo Manager in Applications/Utilities
                        Select Domain:Security:Authentication
                        Select Domain:Security:Activate Root Account
                                        You need to supply root passwd

5. Now check if I can move around mach_kernel

アップデータ‐が走った後(カーネルが置き換わる)ちゃんと再起動したので、今度は8GBの問題はなさそうである。

6. Install Developer kit

うれしいことに開発ツールのCDがついている。インストールはインストーラーをダブルクリックするのみ。

7. Temporary Setting of SSH

SSH のバージョンが古いので後で更新するとしてとりあえず使えるようにする。
# vi /etc/hostconfig
.....
SSHSERVER=-YES-
..... 
# vi /etc/sshd_config
.....
Protocol 2,1
.....
# vi /etc/ssh_config
.....
Hosts *
      ForwardX11 yes
.....

8. Temporary Installation of rpm

今回は真面目に、rpm を作るつもりなので、Public Beta の時にコンパイルした Tar Ball を放り込む(これがないと缶切りは缶の中状態)。
# tar -zxvf rpm-4.0.2-1a-bin.tar.gz -C /
# rpm -initdb
この rpm には、symlink の chown の問題とか(rpm にシンボリックリンクが含まれる場合、 実体が事前に存在していないとインストールできない問題:この場合は仮の実体を touch で作っておく)、 soname を正しく調べない問題などいろいろ問題があるので、早い段階で作り直すことにする。

9. Rebuild bash

私は bash な人なので、まずは bash から。
# cd /usr/local/src/apple/SPECS
# rpm -ba bash.spec
# rpm -ivh ../RPMS/ppc/bash-2.03-1a.ppc.rpm
それでもって、Terminal Application の default shell を /bin/bash にする。
 

10. g77

次に、最近どういうわけだか、問い合わせの多い g77 を作り直す。どうも、Public Beta で作ったものは、そのままでは動かない人が多いらしい。というわけでまずは ADC の Darwin 1.3.1 サイトからソースを入手する。
$ tar -zxvf gcc-926-3.tar.gz
$ mv gcc-3 gcc-2.95.2-g77
これに、オリジナルの gcc-2.95.2 に含まれる g77 部分を上書きする。
$ tar -zxvf patches/gcc-2.95.2-g77.tar.gz
$ cd gcc-2.95.2-g77/
$ patch -p1 -s < ../patches/gcc-2.95.2-macosx-rel.patch
このパッチは以前のものと本質的に同じだが、-fPIC を default にする変更を含む 。これで cc と default が同じになる。
$ export RC_ARCHS=ppc
$ export RC_CFLAGS='-arch ppc'
$ export RC_OS='macos'
$ export TARGETS=ppc
$ export HOSTS=ppc
$ export SRCROOT=`pwd`
$ make >& make.log &
$ make install >& install.log &
ROOT のコンパイルに必要なので、以下のヘッダーも入れておく(古い API)。
$ cp libio/stream.h libio/stdiostream.h dst/usr/include/gcc/darwin/2.95.2/g++/
$ patch -p1 -s < ../patches/gcc-2.95.2-libg2c.patch
$ cd gcc
$ for i in ../obj/cc-ppc-on-ppc/*.h; do ln -s $i .; done
$ cd ..
$ mkdir obj/ppc/libf2c
$ pushd obj/ppc/libf2c
$ CFLAGS='-traditional-cpp' $SRCROOT/libf2c/configure --srcdir=$SRCROOT/libf2c --host=ppc --target=ppc
$ make
$ cp -pP libg2c.a ../../../dst/usr/lib/gcc/darwin/2.95.2/
$ popd
$ patch -p1 -s < ../patches/gcc-2.95.2-libg2c-static.patch
$ pushd obj/ppc/libf2c
$ make distclean
$ CFLAGS='-traditional-cpp' $SRCROOT/libf2c/configure --srcdir=$SRCROOT/libf2c --host=ppc --target=ppc
$ make
$ cp -pP libg2c.a ../../../dst/usr/lib/gcc/darwin/2.95.2/libg2c_static.a

$ cp g2c.h ../../../dst/usr/include/gcc/darwin/2.95.2/
$ ln -s gcc/darwin/2.95.2/g2c.h ../../../dst/usr/include/.
$ ln -s gcc/darwin/default/libg2c.a ../../../dst/usr/lib/libg2c.a
$ ln -s gcc/darwin/default/libg2c_static.a ../../../dst/usr/lib/libg2c_static.a
$ cd ../../cc-ppc-on-ppc/
$ cp g77 ../../dst/usr/bin/f77
$ cp f771 ../../dst/usr/libexec/gcc/darwin/ppc/2.95.2/
$ su
# cd ../../dst
# chown -R root:wheel usr
# pushd usr/bin
# ln -s c++ g++
# ln -s cc gcc
# ln -s f77 g77
# popd
# tar -zcvf /gcc-cvs20010413-with-g77-bin.tar.gz usr/

これをバイナリーオンリーの RPM にしたのが
        gcc-with-g77-926.3-1a.ppc.rpm
 
 

11. Preparation for RPM

11.1 Csu

rpm を -static でスタティックリンクするために、起動ファイルcrt0.o が必要(結局、MacOS X の標準開発環境では PIC なしの static 版ライブラリーがないことに気づき、libSystem.B.dylib のスタティック版をつくるのは骨なのであきらめる羽目になるが)。
Building of Csu requires cctools's indr, and cctools requires Libstreams's streams/streams.h
and Libc's architecture/ppc/processor_facilities.h and libc.a but cctools needs ctr0.o contained in Csu:-(
cctools also requires libm_static and libcc.a:-(
というようにからみあっており大変めんどくさい。結局あきらめるのだからやめときゃよかった。 ひょっとしたら、必要になることがあるかもしれないので、記録のみはとっておく。また、基本的に Source Tar Ball は、ADC の Darwin 1.3.1 からとってきた(CVS からとってくることもできるが、 一応正式版と同期が取れていたほうが気持ちがよいということで)。RPM にしたものはバイナリーは RPMS Directory、またソースは SRPMS Directory に置いてある。以降、make の仕方は特に必要でない限り省略するので、気になる人は SRPM を見てほしい。または、SPECS Directory および SOURCES Directory(ここにパッチがある)を参照のこと。

11.2 Libstream and Libm

これらは難なく RPM になった。
# rpm -ivh ../RPMS/ppc/Libstreams-22-1a.ppc.rpm
# rpm -ivh ../RPMS/ppc/Libm-devel-18-1a.ppc.rpm
で放り込む。
 

11.3 Libc

# cd Libc-167
# make install DSTROOT=`pwd`/tmp
# cd tmp
# mkdir -p tmp/usr
# cd tmp
# cp -pPR ../usr/local usr/
# cp -pPR ../System .
# ln -s B System/Library/Frameworks/System.framework/Versions/Current
# ln -s Versions/Current/PrivateHeaders System/Library/Frameworks/System.framework/.
# cd ..
# tar -zcvf ../../../../tgz/Libc-167-1-bin.tar.gz .
# tar -zxvf ../../../../tgz/Libc-167-1-bin.tar.gz -C /
# cd ../..
これについては、作るのが大変なので、バイナリーオンリーの RPM
                Libc-167-1a.ppc.rpm
を用意した。
 

11.4 indr in cctools

# bash
# cd cctools-7
# 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}
# make install
# cp -P BUILD/dst/usr/local/bin/indr /usr/local/bin
# exit

11.5 Csu

この段階では、RPM にするのは簡単。
# rpm -ivh ../RPMS/ppc/Libstreams-22-1a.ppc.rpm

11.6 Back to cctools

これでようやく cctools のコンパイルが最後まで行く。
# bash
# cd cctools-7
# 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}
# make install
# tar -zcvf ../../../tgz/cctools-353-7-local.tar.gz -C BUILD/dst usr/local
# tar -zxvf ../../../tgz/cctools-353-7-local.tar.gz -C /
これについても面倒なので、バイナリーオンリー RPM:cctools-7-1a.ppc.rpm のみ。

11.7. gettext

CFLAGS に -traditional が必要だった以外、すんなりと RPM になる。
# rpm -ivh ../RPMS/ppc/gettext-0.10.35-1a.ppc.rpm

11.8. db3

今回は共有ライブラリーを作ることにした。
作り方は、CFLAGS として
cc -arch "ppc" -fsigned-char -O2 -dynamic -fno-common -c xxx.c
LDFLAGS としては
cc -arch "ppc" -dynamiclib -undefined suppress -install_name xxx.dylib -o xxx.dylib
こうなるように、ltconfig にパッチをあてる。ここで、-dynamic は default なので書かなくてもよい。 また、-install_name hogehoge は、soname の指定と思えばよい。
# rpm -ivh ../RPMS/ppc/db3*-3.2.9-1a.ppc.rpm

12. Rebuild rpm

12.1 List up dylib in /usr/lib

# find /usr/lib -name ‘lib*.dylib’-print > dylib.list

12.2 rpm

すでに述べたようにパッチを改善して作り直し。
# rpm -ivh ../RPMS/ppc/popt-1.7-0.34a.ppc.rpm
# rpm -ivh ../RPMS/ppc/rpm*-4.0.2-0.34a.ppc.rpm

13. Libcompat and dlcompat

CERNLIB のために BSD compatibility library および SysV style 動的ローダーも入れる。簡単に RPM になる。
# rpm -ivh ../RPMS/ppc/libcompat-14.1-1a.ppc.rpm
# rpm -ivh ../RPMS/ppc/dlcompat-20010123-1a.ppc.rpm

14. Misc. Other Packages

14.1 Some Tips for RPM Making

%configure マクロを使うと libtoolize がないと怒られる。邪道だが、
# vi /usr/local/lib/rpm/macros
.....
%__libtoolize true
....
などとしておけばよい。
それと bzip2 を使う場合は
# vi /usr/local/lib/rpm/macros
.....
%_bzip2bin   /usr/local/bin/bzip2
....
としておく。ただし、bzip2 の RPM を入れた場合。

それと、xmkmf を使う場合、cpp に __APPLE__ FLAG を立ててもらうために

# vi /usr/bin/cpp
.....
ALST="-traditional -D__GNUC__ -D__APPLE__ -$"
....
などとしておく。
また、共有ライブラリーが作りたかったら、Tenon の Xtools に含まれる /usr/X11R6/lib/X11/config/{darwinLib.rules,darwinLib.tmpl} をパチッテきて darwinLib.rules を darwin.cf の最後で include しておけばよい。
%configure で libtool を使ったものの場合は、
# cd <wherever appropriate>
# cp /usr/share/libtool/{config.guess,config.sub,ltconfig,ltmain} .
とする。APPLE 標準の ltconfig では 共有ライブラリーに soname がつかないので、つけたければ、 私が多少手を加えた私家版 ltconfig を使う。 このポイントは、コンパイル時には
cc -O2 -arch "ppc" -fsigned-char -fno-common -c hogehoge.c
のように、また共有ライブラリーを作る際には
cc -arch "ppc" -dynamiclib -undefined suppress -install_name libFoo.n.dylib -o libFoo.n.m.dylib $(OBJS)
のようにすること。動的ロードモジュールの場合、
cc -arch "ppc" -bundle -undefined suppress -nostdlib -install_name libFoo.n.so -o libFoo.n.m.so $(OBJS)
のような感じ。

それともうひとつはまったこと。make install とやっても install が up to date と言われて、 install してくれない場合、おうおうにして、その Makefile のいるディレクトリーに INSTALL というファイルがある。 これは HFS+ が小文字と大文字を区別しないので、INSTALL というファイルは更新の必要なしと言っているわけである。こんな場合、

$ vi Makefile
..........
PHONY: install
.........
とつけ加えて、install が単なる FLAG であることを教えてあげる。

14.2 List of Other RPMs

めんどうになってきたので、SRPMS のリストのみ。実体が見たい人は一番下のリンクを参照のこと。
readline-4.1-8a.src.rpm
ncurses-5.0-10a.src.rpm
ncftp-3.0.2-1a.src.rpm
nkf-1.92-4a.src.rpm
less-358-16a.src.rpm
libtool-1.3.5-8a.src.rpm
automake-1.4-8a.src.rpm
bzip2-1.0.1-3a.src.rpm
Xaw3d-1.5-2a.src.rpm
kterm-6.2.0-20a.src.rpm
fvwm2-2.2.4-9a.src.rpm
jp-tcltk-8.0.5-36a.src.rpm
jp-blt-2.4m-2a.src.rpm
jp-TkDesk-1.2-2a.src.rpm
Canna-3.5b2-5a.src.rpm
kinput2-v3-2a.src.rpm
gettext-0.10.35-1a.src.rpm
gettext-0.10.35-2a.src.rpm
freetype-1.3.1-2a.src.rpm
VFlib2-2.24.2-8a.src.rpm
tkaddwd-1.0-1a.src.rpm
tkps-2.0-1a.src.rpm
psutils-1.17-10a.src.rpm
pstoedit-3.16-1a.src.rpm
libjpeg-6b-15a.src.rpm
libpng-1.0.9-1a.src.rpm
今までにコンパイルしたMacOS X Release 用の rpm については、 spec ファイル、パッチ、ソース RPM、バイナリー RPM それぞれについて SPECSSOURCESSRPMSRPMS に対応するものが置いてある。バイナリーのみの RPM および Tar Ball のみのパッケージの場合には、ソースおよびパッチは src に、また、Tar Ball は tgz にそれぞれ置いてある。 いつものように使う場合は自己責任で。

Back to Keisuke Fujii's MkLinux/LinuxPPC Life