2009-04-24

GaucheをIA-32のSun Studio Expressでビルド

Gauche 0.8.14をSun Studio Express November 2008でビルドできるか? 結論から言えば、できる。でもやる価値があるとは思えない。ただし、調べた内容を捨てるのも勿体無いので、大筋だけ記録しておく。詳細は省く。

configureしてからmakeすると、libgauche.soが生成されずにエラーになる。これは、Gaucheのconfigureの問題。SHLIB_SO_LDFLAGSの-hを-oに置き換えてやれば、処理が進むようになる。

次に、いくつかのシンボルが定義されていないというエラーが出る。これはBoehm GCの問題。SunのCコンパイラでビルドする場合にIA-32がサポートされていないのが原因。ただし、抜け道を使える。AO_USE_PTHREAD_DEFSマクロを定義してビルドすれば、本来の処理をPOSIXスレッドのロックでエミュレートしてくれるので、それを使う。加えて、強制的にSPARC向けのアセンブリコードを使うようになっているので、configureの該当する部分をコメントアウト。need_atomic_ops_asmがtrueでなければ、アセンブリコードは使われない。

以上の修正で、最後までビルドできる。ただ、Boehm GCがIA-32のSun Studioをサポートしていないのは変わらないし、AO_USE_PTHREAD_DEFSは遅いとドキュメントにも書かれている。GCCを使えば、こんな手間は必要ないんだから、余程の理由がない限り、GCCを使う方が良いだろう。

2009-04-09

TRAMP

OpenSolarisをインストールしているホストのファイルを、Windows上のGNU Emacsから編集したくなったので、TRAMPを使おうと思ったところ、勢い良く落とし穴に嵌った。二度三度と嵌りたくないので、記録。

SSH経由での接続を想定。以下注意点。

  • tramp-default-methodをsshxにする
  • OpenSolaris上で実行するシェルは、/bin/shではなくて/bin/bashにする

まず、前者。GNU EmacsのWindowsバイナリからsshコマンドを起動する場合、sshの-tオプションを使わないと、仮想端末が割り当てられないので、リモートホストのシェルのプロンプトが出力されない。TRAMPはリモートホストのシェルのプロンプトの出力を待つため、こうなると処理が永遠に先に進まない。tramp-default-methodをsshxにすることで、sshが-tオプション付きで呼ばれるようになるので、この問題を避けられる。例。

(setq tramp-default-method "sshx")

次に後者。OpenSolarisの/bin/shはksh93へのシンボリックリンクだが、ksh93を使った場合、TRAMPの送るコマンドでクラッシュする。原因は、ksh上でHISTFILE変数を変更しようとすると、segmentation faultが発生するため。正直、目を疑ったが、そういう理由らしい。自分でkshを実行して同じことをしても再現率100%なので間違いない。幸い、/bin/bashが最初からあるので、代わりにこれを使う。

(require 'tramp)

(defun set-tramp-login-args (method args)
  (setcdr (assq 'tramp-login-args
                (assoc method tramp-methods))
          `(,args)))

(defun set-tramp-remote-sh (method sh)
  (setcdr (assq 'tramp-remote-sh
                (assoc method tramp-methods))
          `(,sh)))

(set-tramp-login-args "sshx" '("-e" "none" "-t" "-t" "/bin/bash --posix"))
(set-tramp-remote-sh "sshx" "/bin/bash --posix")

こんな感じ。わざわざ関数を定義しているのは、フックを使ってサーバ毎に設定の切り替えをしたかったからなんだけど、TRAMPにはそういうフックが定義されていなかった。マジですか。

Emacs 23.1付属のTRAMPでは、内部構造が変わったため、ここに書いてある設定では正常に動作しない。ksh93も、HISTFILE変数を変更したときの不具合が修正されたものを、Korn Shell 93 integration/migration projectでダウンロードできる。不具合が修正されたのが2009-06-16のリリースなので、それ以降のリリースでは問題ない。

2009-04-08

OpenSolaris build 111でXの起動に失敗する場合

OpenSolarisVirtualBoxにインストールしていて、Guest Additionsを使っている場合、OpenSolarisをbuild 111にアップデートすると、Xの起動に失敗する問題について。

アナウンス曰く、

3408 X server does not start w/Guest Additions on OpenSolaris guest w/snv_107
http://www.virtualbox.org/ticket/3408

The Xorg driver included with the VirtualBox Guest Additions is
incompatible with the 1.5.3 version of the Xorg server included
in this build.

Work-around: VirtualBox users should remove the VirtualBox
guest additions prior to updating to this build.
Alternatively, VirtualBox 2.2 Beta 1 is reported to have
addressed this issue

http://download.virtualbox.org/virtualbox/2.2.0_BETA1/

とのこと。書いてある通り、VirtualBox 2.2 Beta 1をインストールして、Guest Additionsをインストールし直したら、正常に起動するようになった。