ということで、PB G3 用の外づけ SCSI HD(Wnidows マシン用にたたき売りしていた IO Data の 4.3GB、中身は Samsung の WN34324U (gm030) rev:0105)というもの)を購入して、LinuxPPC DR1 をインストール。
/etc/fstab は
Filesystem
1k-blocks Used Available Use% Mounted on
/dev/sda4
390134 44534 325451 12%
/
/dev/sda6
774871 583370 151469 79% /usr
/dev/sda7
2420344 1049249 1245963 46% /home
てな感じで、
/home/cernlib --> /cern
/home/local --> /usr/local
/home/opt --> /opt
/home/proj --> /proj
/home/redhat --> /usr/src/redhat
てな感じのシンボリックリンクが張ってある。/ と /usr にはオフィシャルなもの、/usr/local には、オフィシャルにはなり得ない過渡的なもの、/opt には、パッケージ毎にディレクトリーが独立しているようなアプリケーション、/proj には仕事関係、/usr/src/redhat を /home にもってきたのは、作った、rpm を移動する必要がないようにするため。これで、システムアップグレードで、/ と /usr を初期化しても、被害は最小限。入れてみて、/ をもう少し減らして /usr を増やすべきだったかと後悔したが、/ は /tmp や /var もいるので安全のためいたしかたない。/usr をマウントしない状態で立ち上がり、最低限のことができないと困る。
インストールは、MkLinux の場合とほとんど同じで、全くすんなりと入った。XF86config は、"fbset -x" を実行して得た情報をもとに作る。keyboard は日本語版を英語配列で使うので、コンソール用は showkey で調べ、
# cd /usr/lib/kbd/keymaps/mac/
# gunzip mac-us-std.kmap.gz
# cp mac-us-std.kmap mac-us-pbg3.kmap
# gzip mac-us-std.kmap
# vi mac-us-pbg3.kmap
....
keycode 93 = grave
asciitilde
....
# gzip mac-us-pbg3.kmap
# vi /etc/sysconfig/keyboard
KEYTABLE="mac-us-pbg3"
KEYBOARDTYPE="adb"
X 用は xev で調べ、
# vi /home/fujiik/.Xmodmap
keycode 59 = BackSpace Delete
keycode 101 = grave asciitilde
keycode 102 = underscore
てな感じ。セキュリティーなどの手当も忘れずしておく。これで、スピーディーにデバッグできる環境ができた。PB G3 の内蔵は、R5 が落ちつくまでしばらく R4.1 のままにしておく(安心して使える環境がなくなるのは危険)。
/etc/sysconfig/ 以下の keyboard や network 関連、/boot/System.map、そして必要なら
/etc/fstab の書き換えで、8115/110 につないでも動作することを確認した。これで、作ったものが
MkLinux でも正常動作するかすぐに試せる。
[5-6] Back to ROOT
あれこれ追求して、cint の中を debug 中に root の新しいバージョンが出た。これをコンパイルしてみると、何の問題もなく動いた。問題のあったバージョンは、LinuxPPC-R4
または MkLinux DR3 + egcs-1.1.2 では問題なく動いたので、何か glibc がらみで
cint がうまく動かなくなる原因があったらしいが、追求する時間がない。時間がとれたら立ち戻ることにするが、取り合えず優先度は低い。
[5-9] Root のデバッグに疲れ切ったので息抜き
コンパイルが早くなったので、気持ちの悪かった Wnn、Canna、kinput2、pTeX を新しいレイアウトにすべく RPM を作りなおした。Canna は "rpm --rebuild" しただけ。Wnn は JRPM のものに長田さんの glibc パッチをあてた。kinput2 は、レイアウトの変更。pTeX は例の mktexltr の問題があり、これを修正するパッチを加えた。また、build 時に latex.ltx でバージョンが古すぎると怒られるので、build の際は該当個所を削除して黙らせるチーティングを SPEC に入れた。ついでに lynx の日本語版も入れておく。pTeX についての mktexlsr のパッチを更新した。
それと、netscape。せっかく glibc2.1 に移行したのだから、何か locale で幸せになることがないと御利益がない。
例えば、$HOME/bin/netscape に
#!/bin/sh
export LANG=ja_JP.eucJP
export XUSERFILESEARCHPATH=$HOME/.Netscape.ad
exec /usr/lib/netscape/netscape-communicator $*
等としておくと幸せになれる。.Netscape.ad は日本語リソース。glibc のデフォールトの
setlocale がちゃんと2バイトロケールを理解してくれる(ロケールが定義されていさえすれば)。リソースは、取り合えず面倒なので、フォントのみの指定。これで、kinput2
での日本語入力もばっちり。メニューの日本語化は時間ができ次第。
[5-10] Scilab-2.4.1
これには、少しパッチが必要だった。varargs.h でなく stdarg.h を使おうとする(POSIX 仕様)ので、va_start(ap) はダメで va_start(ap,last) のように呼ばねばならない。SeeTeX のように、マクロの定義で逃げることも考えたが、真面目に修正することにした。また、例によって、string.h まわりの2重定義問題もある。また、static 変数の初期化で stdout を代入できなくなったのでこの部分も変更が必要。長くなるが、今後のポーティングの参考のため、パッチの全体を引用する。
<ここから>
diff -uNr scilab-2.4.1.orig/routines/graphics/periFig.c scilab-2.4.1/routines/graphics/periFig.c
--- scilab-2.4.1.orig/routines/graphics/periFig.c
Tue Oct 20 23:11:11 1998
+++ scilab-2.4.1/routines/graphics/periFig.c
Sat Jun 19 12:53:52 1999
@@ -82,6 +82,9 @@
#if defined(__CYGWIN32__) || defined(__MINGW32__)
static FILE *file= (FILE *) 0;
#define FPRINTF(x) ( file != (FILE*) 0) ? fprintf x
: 0
+#elif defined(__linux__)
+static FILE *file= (FILE *) 0;
+#define FPRINTF(x) if ( file == (FILE*) 0) {file = stdout; fprintf
x;} else fprintf x
#else
static FILE *file= stdout ;
#define FPRINTF(x) fprintf x
diff -uNr scilab-2.4.1.orig/routines/graphics/periPos.c scilab-2.4.1/routines/graphics/periPos.c
--- scilab-2.4.1.orig/routines/graphics/periPos.c
Tue Oct 20 23:11:12 1998
+++ scilab-2.4.1/routines/graphics/periPos.c
Sat Jun 19 12:52:19 1999
@@ -61,6 +61,9 @@
#if defined(__CYGWIN32__) || defined(__MINGW32__)
static FILE *file= (FILE *) 0;
#define FPRINTF(x) ( file != (FILE*) 0) ? fprintf x
: 0
+#elif defined(__linux__)
+static FILE *file= (FILE *) 0;
+#define FPRINTF(x) if ( file == (FILE*) 0) {file = stdout; fprintf
x;} else fprintf x
#else
#define FPRINTF(x) fprintf x
static FILE *file= stdout ;
diff -uNr scilab-2.4.1.orig/routines/sun/link_SYSV.c scilab-2.4.1/routines/sun/link_SYSV.c
--- scilab-2.4.1.orig/routines/sun/link_SYSV.c Tue Oct 13
21:27:18 1998
+++ scilab-2.4.1/routines/sun/link_SYSV.c
Sat Jun 19 10:36:16 1999
@@ -69,7 +69,9 @@
#define Min(x,y) (((x)<(y))?(x):(y))
#define Max(x,y) (((x)>(y))?(x):(y))
+#if !defined(__linux__)
extern char *strchr();
+#endif
static void Sci_Delsym _PARAMS((int ));
static int Sci_dlopen _PARAMS((char *loaded_files[]));
diff -uNr scilab-2.4.1.orig/routines/xsci/x_screen.c scilab-2.4.1/routines/xsci/x_screen.c
--- scilab-2.4.1.orig/routines/xsci/x_screen.c Tue May
5 22:23:29 1998
+++ scilab-2.4.1/routines/xsci/x_screen.c
Sat Jun 19 10:39:42 1999
@@ -35,8 +35,10 @@
#include "All-extern-x.h"
#include "All-extern.h"
+#if !defined(__linux__)
extern Char *calloc(), *malloc(), *realloc();
extern void free();
+#endif
/*
allocates memory for a 2-dimensional array of
chars and returns a pointer
diff -uNr scilab-2.4.1.orig/intersci/intersci.c scilab-2.4.1/intersci/intersci.c
--- scilab-2.4.1.orig/intersci/intersci.c
Thu Jul 9 17:02:29 1998
+++ scilab-2.4.1/intersci/intersci.c Sat Jun
19 15:30:52 1999
@@ -3291,17 +3291,29 @@
char sbuf[MAXBUF];
/*VARARGS0*/
+#if !defined(__linux__)
void Fprintf(va_alist) va_dcl
+#else
+void Fprintf(FILE *f, int indent, char *format, ...)
+#endif
{
+#if !defined(__linux__)
int i,indent;
+#else
+ int i;
+#endif
static int count=0;
va_list ap;
+#if !defined(__linux__)
FILE *f;
char *format;
va_start(ap);
f = va_arg(ap, FILE *);
indent= va_arg(ap, int );
format = va_arg(ap, char *);
+#else
+ va_start(ap,format);
+#endif
vsprintf(sbuf,format,ap);
for ( i = 0 ; i < (int) strlen(sbuf); i++)
{
@@ -3329,14 +3341,22 @@
/*VARARGS0*/
+#if !defined(__linux__)
void FCprintf(va_alist) va_dcl
+#else
+void FCprintf(FILE *f, char *format, ...)
+#endif
{
va_list ap;
+#if !defined(__linux__)
FILE *f;
char *format;
va_start(ap);
f = va_arg(ap, FILE *);
format = va_arg(ap, char *);
+#else
+ va_start(ap,format);
+#endif
vfprintf(f,format,ap);
va_end(ap);
}
diff -uNr scilab-2.4.1.orig/intersci/intersci.h scilab-2.4.1/intersci/intersci.h
--- scilab-2.4.1.orig/intersci/intersci.h
Mon May 25 16:37:04 1998
+++ scilab-2.4.1/intersci/intersci.h Sat Jun
19 14:28:33 1999
@@ -208,8 +208,8 @@
void InitDeclare _PARAMS((void));
void ResetDeclare _PARAMS((void));
void WriteMain _PARAMS((FILE *f,char *file));
-void FCprintf(); /* _PARAMS((FILE*,char *fmt,...)); */
-void Fprintf() ;/* _PARAMS((FILE*,int,char *fmt,...));
*/
+void FCprintf _PARAMS((FILE*,char *fmt,...));
+void Fprintf _PARAMS((FILE*,int,char *fmt,...));
void white _PARAMS( (FILE *f, int ind));
void AddDeclare _PARAMS((int type, char *declaration));
void InitDeclare _PARAMS((void));
<ここまで>
これが本質的な部分であるが、rpm を作ろうとすると、いろいろやっかいな問題があった。バイナリー実行形式でもスクリプトでもないファイルに、実行権が与えられていると、とんでもないものを要求するパッケージができてしまう。例えば SHELL とか #------------ とか # とか何だこれといったことになる。
これは、新しい rpm が、このようなファイルをスクリプトと思いこみ、インタープリターを探そうとする結果のようである。賢くなる場合には、中途半端では始末におえない、こまったさんである。結局、Makefile* と *.mak の実行権をはずすことで解決したが、最後まで出てこなかったのは、"#" を要求していた
routines/Make.lib.mak
で、これには疲れた。教訓は、実行権の必要ないものには決して実行権を与えないこと。これは安全上も重要。
また、ここでも、__powerpc__ の代わりに __linux__ が使ってある。が、ppc 以外で試したわけではない。また、今後 linux でなく POSIX 準拠の __linux__ を使う事とする。ちなみに gcc -v で見た implicit なフラッグは
-D__GNUC__=2 -D__GNUC_MINOR__=91 -DPPC -D__ELF__ -Dunix -Dlinux -Dpowerpc
\
-D__PPC__ -D__ELF__ -D__unix__ -D__linux__ -D__powerpc__ -D__PPC -D__unix
\
-D__linux -D__powerpc \
-Asystem(unix) -Asystem(linux) -Acpu(powerpc) -Amachine(powerpc) \
-D__CHAR_UNSIGNED__ -D_CALL_SYSV -D_BIG_ENDIAN -D__BIG_ENDIAN__ \
-Amachine(bigendian) -D_ARCH_PPC -D__unix__ -D__linux__ -Dunix -Dlinux
\
-Asystem(unix) -Asystem(linux)
となっている。
テストは全て(tests と examples ディレクトリーでの make tests の全て)通った。今回は、バイナリーパッケージとして、このテストを含めて全て再現できるよう、build
ディレクトリーの全体を入れた。71MB 強ある。/opt にインストールされるので、ここが十分大きくないといけない。
残りは、CERNLIB の mathlib の2つの問題のデバッグ。気が重いが、これをクリアーしないと
R5 への完全移行はなし得ない。