OpenXMのインストールに関するメモ

OpenXMは数学関連のソフトウアの統合環境である(と理解している)。 ここで、OpenXMのソースパッケージにふくまれるContrib2の中に RISA/ASIRがある。その他に、PARI/GP,Kan等がある。尚、ここに含まれる ASIRは旧版の様にkey-codeを必要としないものである。猶、OpenXM 1.2.1 迄に附属していたfepはi386向けのLinux/FreeBSD環境向けのバイナリで あったが、1.2.2ではソースコード込となっている。更に、1.2.2では pariが二種類あるが、これはpari2.2よりGPLに準拠する為、asirがGPLに 感染する為、GPLでないpari-2.0.17を用いる為である。

ここではSuSE 8.0とSuSE 7.3(GCC-2.9.x)の環境とSuSE 8.2(GCC-3.3)の 環境でOpenXMの環境構築を行っている。先ず、GCC-2.9.xの環境には OpenXM-1.2.1をインストールし、GCC-3.3の環境にはOpenXM-1.2.2を インストールしている。尚、GCC-2.9.xの環境ではインストールが比較的 容易であるが、GCC-3.3の環境では厄介である。

OpenXM 1.2.1のインストール

コンパイルはソースファイルの展開後、必要に応じてMakefileの編集を行い、 make allを実行する。尚、附属のdoc/install-en.txtかdoc/install-ja.txt には必ず目を通しておく。今回は安易に、make allを実行して問題が出た 個所で修正する方法で行ったが、特に問題となったのが、 OpenXM/src/kxx/Makefileの156行目のvar.sm1のコピーを行う個所。コピー する先に実体の無いvar.sm1がある為に、コピーに失敗している。その為、 OpenXM/src/kxx/Makefile.inの156行目の "cp $(KANHOME)/Kan/var.sm1 $(OpenXM_lib)/sm1"を実行する前の行に "-/bin/rm -rf $(OpenXM_lib)/sm1/var.sm1"を追加している。 こうする事で件のコピーの失敗は解決される。尚、Kan/var.sm1の方は 間違っても消さない事。

次に、Mathematicaがあれば、Mathlinkを参照するので /usr/local/mathematicaにインストールしていない場合はリンクを 張るか、OpenMath/ox_mathのMakefile関連を修正するか、どちらかが必要 になる(勿論、使わないと云う方法もあるだろうが)。私は安易にリンクを 張る事で済ましている。又、Mathlinkを用いる為には、Mathlinkの制約から libc5が必要となるらしい。

これらの処理の後に、OpenXM/srcでmake allを実行し、make installで OpenXM/binにコンパイル結果がインストールされる。尚、各種文書のmake も行うが、日本語文書のPostScript、dviファイルの生成の為にはnkfと ptexが必要である。最後にOpenXM/rcにてmake installを実行すると /usr/local/binにasirがインストールされる。このOpenXM/rcでmake install を実行する事は重要である。

Risa/Asirを用いた本"グレブナー基底の計算 実践編"にはRisa/Asirで区間数 を用いる例題がある。この様にAsirで区間数が扱えるが、この区間数を扱う 為には、include/Risa.tmplを書換える必要がある。本には区間数が定義出来 る様に書き直すけで良い様に記述されているが、実際は、PARIを組込む様に 指定して、xmkmf -aを実行してからmake allを実行する必要がある。ここで 区間数の利用では#defined USE_INTERVALのコメントを外す程度で良いが、 これだけでは一部変数が未定義の状態になるので、USE_PARIも設定しておく 必要がある。これは単純に#defined USE_PARIを追加するだけで良い。 更に、OpenXM_HOMEを指定しておくと良い。このOpenXM_HOMEの設定には注意 が必要である。動作が怪しければこの値を見直す事を勧める。基本的に OpenXMの書庫ファイルに含まれるOpenXMへの経路を設定する事になる。 例えば、OpenXMの書庫ファイルを/usr/local/で展開していれば、 OpenXM_HOMEには/usr/local/OpenXM/を設定する。この指定が出来ていないと、 ox_launch(0,"ox_plot")を実行した際にasirが立ち上げられたxterm上で起動 されるだけで、反応が帰って来なくなる事があるので注意が必要である。

尚、私の環境(SuSE 8.0とSuSE 7.3)では何故かdefで定義した関数を実行 すると、stack overflowを起している。これは以下の関数の様に単に10を 返すだけの関数でも生じている。

[716] def f() {
return 10;
}
[717] f();
stack overflow
return to toplevel
[717]         
    

このstack overflowを出力しているのは OpenXM_contrib2/asir2000/parse/eval.cのstack sizeの検証の個所のみである。 以下に関連する個所を抜き出しておく。

    473         switch ( f->id ) {
    474                 case A_BIN:
    475                         if ( !n ) {
    476                                 cur_binf = f;
    477                                 (*f->f.binf)(&val);
    478                         } else {
    479                                 args = (LIST)eval(a);
    480                                 cur_binf = f;
    481                                 (*f->f.binf)(args?BDY(args):0,&val);
    482                         }
    483                         cur_binf = 0;
    484                         break;
    485                 case A_PARI:
    486                         args = (LIST)eval(a);
    487                         cur_binf = f;
    488                         val = evalparif(f,args?BDY(args):0);
    489                         cur_binf = 0;
    490                         break;
    491                 case A_USR:
    492                         /* stack check */
    493 #if !defined(VISUAL) && !defined(__CYGWIN__)
    494                         if ( !stack_size ) {
    495                                 struct rlimit rl;
    496                                 getrlimit(RLIMIT_STACK,&rl);
    497                                 stack_size = rl.rlim_cur;
    498                         }
    499                         if ( !stack_base )
    500                                 stack_base = (void *)GC_get_stack_base();
    501                         if ((stack_base - (void *)&args) +0x100000 > stack_size )
    502                                 error("stack overflow");
    503 #endif
    

上に表示した個所は与えられた関数の種類分けを行って対処する個所で、 f->idの値がA_BIN、即ち、RISA/ASIRの組み込み関数であった場合、 f->idの値がA_PARI、つまり、pari関数でpariの命令を利用する場合、 最後がf->idの値がA_USR、即ち、def関数で定義した利用者関数の三種類に 分けている。問題となっている501行目が含まれている個所 は、A_USRの個所 である。ここでA_USRの場合は最初にstackのチェックを行う。このチェック はMS-Windows上のVISUALやCYGWINと云った環境であれば実行されない個所に なる。今回、直接の問題となっているのが501行目のif文である。どうも、 RLIM_INFINITYの値は-1となっているらしく、その為、501行目の条件文が TRUEになっている。そこで、501行目の条件文にstack_size!=-1の場合のみ、 この検証を行う様に修正を加えている。

そこで取り敢えず動作させるには、このチェックを外してしまえば良い事に なる。勿論、stackのチェックを外す事で、大規模な計算を実行している場合 は致命的な事になるかもしれない。但し、一寸した使い方では、そんなに簡 単にチェックに引っ掛かるとは思えない。

この問題の個所を見ると、先ず、stack_sizeに値が代入されていない場合、 getrlimitでstackの上限値を求めている。このgetrlimitに関してはmanで 動作を調べる事が可能である。このgetrlimitはresourceの設定値を入手 する関数で、設定する関数がsetrlimitである。 又、getrlimit(RLIMIT_STACK,&rl);でrl.rlim_curにstackの上限値が代入 される事が分る。ここで、このrl.rlim_curの値を表示させると-1が入って いる。このgetrlimitに対応するsetrlimitがasir2000のファイルに含まれて いない事から、stackの上限値が設定されていない。getrlimitを実行する とstack_sizeはRLIM_UNLIMIT(上限無し)を意味する-1となる。すると、 (stack_base - (void *)&args) +0x100000は1073572や1090452となる為、 stackのチェックで撥ねられてしまうので"stack overflow"で落る事になる。 従って、この問題の解決方法としてはstackの大きさの上限を適正な値に設定 するか、-1であればチェックを外す工夫が必要と思われる。今回は501行目に stack_sizeが-1でない場合に、通常のチェックを行い、-1の場合は RLIM_UNLIMITであるとして、チェックを飛す事にする。

尚、コンパイルはSuSE 7.1、7.3と8.0の環境で行っている。但し、SuSE 8.0 でglibcを2.2.5-105にアップデートした環境でasirをコンパイルすると、 bindに関係したエラーが発生して、ox_launch(0,"ox_plot")に失敗する。 どうも、Addressが既に使われているとかで、接続に失敗する為らしい。 但し、これに関してはセキュリティ絡みの問題とも思えるが、良く判って いない。

OpenXM1.2.2のインストール(現在作業中)

SuSE 8.2ではgcc3.3(のpre版?)が用いられている為、コンパイルが簡単に 出来ない問題がある。先ず、OpenXM/util/oxweave.cの様にexitがexit()と なっている個所で引っ掛かる。これは他にもあり、Kanやkxx等でもこのエラー 出てくる。この場合、安易にexit(0)にして対処している。

asir2000も無修正でコンパイルする事が出来ない。先ず、GCC-3.3に関連する ものとして、OpenXM_contrib2/asir2000にあるparse/comp.cのvarargs.hを stdargsに変更する。これはif definedでPPCとMachに適合させる様にすれば 良い。これも安易に

#if defined(VISUAL) || (defined(__MACH__) && defined(__ppc__)) || defined(linux)
#include 
#else
#include 
#endif
    

に示す様に、defined(linux)を追加しているだけである(他に良い方法がある のだろうが、安易にこれでやりくりしでいる)。これと同じ修正をasir2000の ディレクトリ下のparse/parse.hとparse/util.cに対しても行う。 次にbuiltin/file.cとbuiltin/parif.cにはpariのgenpari.hを参照する様に 修正を行う。私の場合、genpari.hを"/usr/local/include/pari"に インストールする様にpari-2.0.17でしていた為、 #include "/usr/local/include/pari/genpari.h"としている。これは、 builtin/strobj.c,engine/bf.c,engine/cplx.c,engine/pari.c, engine/pari-mp.c, io/spexpr.c, io/bsave.c, io/bload.c,io/ox_asir.c, eval.c,glob.cでも同様の修正を加えている。

ここで、区間数を利用する為にはOpenXM-1.2.1と同様の指定を行う必要が ある。OpenXM-1.2.2ではasir2000デイレクトリで--enable-INTERVALと --with-pariオプションを付けてconfigureを実行するが、ここで、prefix としてOpenXM_HOMEと同じディレクトリを指定すべきである。これは後に OpenXMを利用する上で非常に重要である。これは先ず、OpenXM/rcで make installを実行すると、asirの起動スクリプトが/usr/local/binに コピーされる。ここで、OpenXM_HOMEとprefixに齟齬があれば、例えば、 ox_launch(0,"ox_plot");を実行すると立ち上がるウインドウで別途asirが 起動されて反応が帰らなくなる等の問題が生じる。これもOpenXM-1.2.1 と同様である。

次に、pari-2.2のコンパイル自体には大きな問題がない。而し、pari-2.0.17 ではgcc-3.3で廃止されたオプションが色々と用いられている事に加えて、 SuSE 8.2のgccでは最適化オプションのバグの為か、コンパイルに失敗する。 この場合は単純に最適化オプションを外せば良い様だが、修正はこれだけで 済まず、他の箇所も修正する必要がある。具体的には、最適化を-O3から-O0 にし、-malign-loops=2 -malign-jumps=2 -malign-functions=2のmalignを falginに変更する。最後にranlibが上手く行かないので、OpenXM/src/pariの 下にあるMakefileの最終行をranlib ../../../lib/libpari.aの様に"../"を 一つ増す必要がある。尚、pari-2.2を用いる場合も同じ修正が必要であった。

次に、fepのコンパイルではMakefileにlibtermcapを参照する箇所があるが、 SuSEにはlibtermcapがないので、ここでもコンパイルに失敗する。これは 単純にlibncursesを参照するように修正するだけで済む。つまり、Makefile の-ltermcapを-lncursesにするだけである。他には問題が無い。

コンパイルで厄介なのがgmpである。gcc-3.3のSuSE 8.2では上手く出来ない 為に諦めて、SuSE 8.2に含まれているgmp-4.1.2を用いる方針に変更した。 この場合、SRPMから/usr/src/packages/BUILD/gmp-4.1.2を生成しておく。 このgmpはKanのコンパイルで用いられるので、KanのMakefileでGMP_HOME 等の環境変数に/usr/src/packages/BUILD/gmp-4.1.2を指定する様にする。 更に、ライブラリの参照では直接/usr/lib/libgmp.aや/usr/lib/libmp.aを 指定する。次に、kan96/pluginsでerrnoが未定義となる幾つかのファイル (file2.c,mytcpio.c,sm1Socket.c)とKan/ext.cには #include <errno.h>を追加しておく。これが無ければerrnoが未定義 のままで、makeに失敗する。又、kxx/oxserver00.cにはexit()があるので、 ここも安易にexit(0)にしている。

他にgnuplotもあるが、SuSE 8.2ではコンパイルが上手く出来ない為、SuSEに 附属しているものを用いる事にした。尚、コンパイルが上手く出来ないのは、 configure.inの272行目で引っ掛かっており、AC_LANGが問題らしい。 この点に関しては現在調査中。

最後にコンパイルが無事通れば、OpenXM/rcに移ってmake installを実行する。 それで動作する筈である。一応、asirでifplotを用いた代数曲線の表示で 問題が無い様である。

現在、asirとpariの動作は確認しているが、細かなチェックはまだ出来て いないので、他の修正も必要になるかもしれない。更に、gmpはOpenXMに 附属のものと比べて新しいものである為、整合性の問題も出るかもしれない。

OpenXM-1.2.3

このOpenXM-1.2.3では、コンパイルの際に必要なファイルをネット経由で 入手する様になっている。コンパイルの方法は、OpenXM-1.2.3.tar.gzを 展開し、OpenXM/srcでmakeを行う。Makefileの内容を見ると、どの様な 事が行えるかが判って良い。又、prefixは/usr/local/となっている。 この辺は各個人の利用環境に合せて変更すると良い。

私の環境ではRisa/Asirとpariのコンパイルで問題が生じる。 pariは2.0系と2.2系の二種類が使える。デフォルトでは2.0系である。 私の環境では2.0系のコンパイルに失敗するものの、2.2系のコンパイルの 方が簡単に通るので、2.2系を用いる事とする。ここで、Risa/Asirを使い たければ、Risa/Asirでpariの2.2系を用いる事を教えてやらなければなら ない。ここをいい加減にしていると、デフォルトでpariの2.0系で コンパイルを行なおうとして失敗する。

先ず、pariのMakefileを書き換えて、PARI-2.2を用いる様に変更する。 その為、先ずはOpenXM/src/pari/Makefileの書き換えを行う。 これはPARI_VERの行を以下の様に変更する。

 
      #PARI_VER=2.0
      PARI_VER=2.2
      

次に、asir2000でpari-2.2を用いる様にconfigureを実行する。 configureには--with-pari=new --enable-plot --enable-intervalと する。--with-pariでは2.0系を用いる設定になるので注意が必要である。 更に、engine/Z.cのifdef(VISUAL)とifdef(i386)の個所で引っ掛るので、 その内容をコメントアウトしておく。

取り敢えず、コンパイルには成功している。prefixが間違っていると、 ox_launchで問題が生じる場合があるが、この場合はエラーの内容を 吟味すれば容易に分る。


Risa/Asir関連に戻る
ponpoko
Last modified: Sat Aug 2 12:27:23 JST 2003