top page > PC unix > here

FreeBSD における mule


概要

FreeBSD 5, 6 系にて,mule が X Window System の上で動作せず,core dump します. その対策を提示します.

検討した環境は次のようなものです.

  1. OS は FreeBSD 4.11, 5.3, 6.2, 7.2, 8.2, 8.3, 8.4 です. (4.11 は比較のため.)
  2. X Window System と gcc, ld とは,各々の OS の標準のものです.
  3. mule は各々の ports/packages の mule-freewnn, mule-wnn7 です.

また,FreeBSD 7.2, 8.2 にて mulemake したので,その方法を提示します.


目次

1. 状況
2. 対策
3. あとがき
4. その後
5. さらにその後

1. 状況

FreeBSD 5, 6 系にて,mule が X Window System の上で独自の Window を開く形では動作しなくなっています. 起動すると core dump します.
一方,console や (option に -nw を付けての) kterm の上では動作します.

FreeBSD 4 系では X Window System の上で独自の Window を開く形でも動作しています.

当方にて確認した環境は下表の通りですが,原理的にはすべての 5, 6, 7, 8 系に共通の問題です.

FreeBSD X Window System gcc ld 備考
4.11XFree86 4.4.02.95.42.12.1 それ以前の 4 系でも動作していた.
5.3 X.Org 6.7.0  3.4.2 2.15   5 系は 5.3 以外は確認せず.
6.2 X.Org 6.9.0  3.4.6 2.15   6 系は 6.2 以外は確認せず.

2. 対策

ソースを次のように修正すれば解決できます. この patch はこの中にあります. → mule.tgz
修正の手順は同封の文書である README をお読み下さい.

--- src/s/freebsd.h.org Thu Jun 28 22:40:44 2007
+++ src/s/freebsd.h     Thu Jun 28 22:45:23 2007
@@ -134,3 +143,14 @@

 /* XIM does not work very well, so the next is set (by taoka@FreeBSD.org) */
 #define X_I18N_INHIBITED
+
+/* The `combreloc' setting became the default, and it seems to be
+   incompatible with unexec.  Symptom is an immediate SEGV in
+   XtInitializeWidget when starting Emacs under X11.  */
+
+#if defined __FreeBSD_version && __FreeBSD_version >= 500042
+#define LD_SWITCH_SYSTEM_TEMACS -znocombreloc
+#else
+#define LD_SWITCH_SYSTEM_TEMACS
+#endif
+
--- src/Makefile.in.org Tue Aug 18 14:48:35 1998
+++ src/Makefile.in     Wed Jun 27 22:35:15 2007
@@ -473,7 +473,7 @@
 #endif /* not COFF_ENCAPSULATE */
 #endif /* not ORDINARY_LINK */

-ALL_LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH_MACHINE LD_SWITCH_SITE LD_SWITCH_WNN LD_SWITCH_CANNA $(LDFLAGS)
+ALL_LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH_MACHINE LD_SWITCH_SITE LD_SWITCH_WNN LD_SWITCH_CANNA LD_SWITCH_SYSTEM_TEMACS $(LDFLAGS)

 /* A macro which other sections of Makefile can redefine to munge the
    flags before they're passed to LD.  This is helpful if you have

この修正は /usr/ports/editors/emacs のそれに倣ったもので,compile の際に ld に option -znocombreloc を加えるものです.

この対策は 2007.6.29 に send-pr しました. しかし,2007.9.10 に editors/mule は ports/packages からはずした旨返答がありました. 従って,FreeBSD 6.3 以降は自分で別途 mule を工面しない限り使えなくなります. この点に関しては その後 も御覧下さい.

3. あとがき

(ここは 2007 年の時点での記述です.) この 4 月に,久々に FreeBSD を version up しました. 4.11, 5.3 から 6.2 ですから 2 年ぶりです.

そもそも私が mule のこの問題に気付き,むきになって取り組んだのは,6.2 の ports/packages に現在常用している ja-xemacs-mule-freewnn がなく,そ の一方で過去に使い慣らした ja-mule-{freewnn,wnn7} があったからです.

emacs20, 21 は使ったことがないので「無意識に」選択肢からはずしていましたが,今後 emacs (emacs21) も使ってみて,乗り換えの候補にした方が良いかもしれないと考えています. 当分はまとまった時間が取れないので,FreeBSD 6.2 では mule を使い続けます.
(今回 mule に費やした時間をそちらに使っていれば... ということは考えないことにします.)

4. その後

emacs として emacs21, emacs22 を使ってみました. これらは以前から使っていた xemacs も含めて非力な PC では重いので,使い分けたいと考えて FreeBSD 7.2, 8.2, 8.3 でも mulemake を試みました.

ところが compile error が多発し,それなりにソースを修正しないと make できませんでした. FreeBSD の ports としてのメンテがされなくなったら,一気に敷居が高くなってしまいました. (逆に言えば,今までメンテして下さった方の御苦労が実感できます.) 結局,なんとか make, make install ができて動く状態にすることができました. patch は 2 節の mule.tgz に同封しておきましたので,参考にして下さい.
(ただし,これをやるには mule があった頃の ports の関連する directory (japanese/mule-*, editors/mule, editors/mule-common) が必要です. 私は古い ports のものを流用しております.)

そこそこの性能の CPU を載せた PC をお使いならば,これを試みないことをお勧めします.

5. さらにその後

2 節にて配布した patch により,FreeBSD 8.3 までは make ができていました. ところが FreeBSD 8.4 においては compile error が生じて make できません. (gcc の version は 8.3 までと同じなのに...)

理由は,c の文法に対するチェックがさらに厳格になったことです. (理由はその他にもあるかもしれません.) そのうち修正に挑戦するつもりです.