99/06/20     CERNLIB, ROOT, ... continued, and Scilab

[5-8] やっぱり 8115/110 での CERNLIB、ROOT のデバッグはつらい

ということで、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 への完全移行はなし得ない。
 


Back to Keisuke Fujii's MkLinux/LinuxPPC Life