Emacs 24.5 build on Cygwin

目次

1 この文書は

2016年10月時点でCygwinパッケージでは Emacs 25.1が配布されています。 Emacs 24.5のビルドを新たに行う事は無いかも知れませんが、25系で致命的な不具合があった時 の一時しのぎで古いバージョンが欲しい場合などに向けて、「Emacsの雑記」の24.5のビルド方法 の文書を切り出しました。個人的には本文書が「役に立つ事が無い」のを願います。

2 Emacs-W32 on Cygwinについて

TANEが2013年頃からメインに使用しているのはCygwinのEmacs-W32です。 Cygwin上で動作しながらもウインドウ描画などはWindowsネイティブ という組み合わせで動作するという、ありそうで何故か無かった組み合わせです。 Cygwin上で動作するのでDLL依存がありますが、外部プロセス実行で発生するもろもろの問題が 解決される(解決が容易になる)利点があります。 ただ、CygwinでパッケージインストールしたEmacs-W32では、MeadowのようにMS-IMEを使用する ことはできません。そこで、NTEmacsからIME制御部分(いわゆるIMEパッチ)をEmacs-W32とマージして 使用しています。

rzl24ozi氏の作成されたパッチ が IMEパッチのデファクトスタンダードとなっています。 ところが、24.4をTANEの環境下でCygwinで野良ビルドして使用していると、IME入力中に 何故かSegmentFaultで落ちる場合があった為、以降自前パッチを使用しています。 Cygwin64に対応していないなどrzl24ozi氏のパッチに比べると 対応状況はイマイチですが、セカンドソースとしてお役に立つ事があれば幸いです。

  1. 予めCygwinパッケージのemacs-w32をインストールしておきます。
  2. Cygwinでビルドします。ビルドに必要なツールやライブラリが揃ってなければ揃えてください。 emacs-24.5のtar-ballは適当な所から拾ってください。 パッチは emacs-w32_24.5_20150419.patch.xzをダウンロード してください。
  3. 適当なディレクトリで 以下の手順でビルドします。2.でダウンロードしたファイルは ~/downloads ディレクトリ下に置いてあるものとしています。
    xz -dc ~/downloads/emacs-24.5.tar.xz | tar xf -
    xz -dc ~/downloads/emacs-w32_24.5_20150419.patch.xz | patch -p0
    cd emacs-24.5
    ./configure --prefix=/usr --with-w32 --without-imagemagick
    make
    
  4. /usr/bin/emacs-w32.exe をビルドしたsrc/emacs.exe で置き換える。 元の実行ファイルは別名で退避しておくのが良いでしょう。
  5. lisp/international/w32-ime.el と lisp/international/w32-ime.elc を/usr/share/emacs/24.5/lisp/international/. にコピーする。
  6. 以下の設定を.emacs(オールドスタイルですみません)に追加する。
    ;;
    ;; IME setup
    ;;
    (set-language-environment "Japanese")
    (if (eq 'w32 (window-system))
        (progn
          (load "international/w32-ime")
          (setq w32-ime-buffer-switch-p nil)  ; 全バッファでIME状態同期
          (kill-local-variable 'w32-ime-mode-line-state-indicator)
          (setq default-input-method "W32-IME")
          (setq-default w32-ime-mode-line-state-indicator "[-]")
          (setq w32-ime-mode-line-state-indicator-list '("[-]" "[あ]" "[-]"))
          (w32-ime-initialize)))
    

以上で使えるんじゃないかと思いますが、エラーとか出た時はうまく対応してください(^^;

パッチのざっくりした内容や注意事項は以下です。

  • IMEパッチ自体は emacs-24.2-ime-2012-09-02.patch.tar.gz(リンク切れ)と emacs-24.3-ime-2013-05-03.patch.tar.gz(リンク切れ)を 元にしています。2013-05-03ではMinGW特化されてしまってそのままではCygwinビルドできなかった為、 ダメだった所は2012-09-02を使用した感じになってます。
  • IMEは全バッファで状態同期するモードで使用しています。termモード でバッファ再描画を非同期に行った際、IME制御の構造上の問題で勝手に入力確定される場合が あった為です(参考)。ただ、単純に w32-ime-buffer-switch-pをnilにしただけではインジケータの再描画がうまく対応できていなかった為、 lisp/international/w32-ime.elに少し手を入れています。
  • オリジナルではJPEG画像表示の時に減色されてしまうのですがフルカラー表示に強制しています (参考)。
  • imagemagickパッケージはconfigure実行時に意図的に外しています。 含めてもビルドは完了すると思いますが24.3の時には動作不安定な実行ファイルが できあがりました(参考)。 24.4,24.5ではpdf-tools との相性が悪かった為 (参考)、 引き続き意図的に外してビルドしています。
  • Cygwinでのビルドしか考えてませんのでconfigure.batはメンテしていません。
  • Cygwin64には対応していません。
  • termモードのターミナルエミュレーション表示が遅い点を改造しています (参考)。

[2015/11/3 追記]

2015年8月頃にリリースされたCygwin-2.2.1くらいからtimer_getoverrunというシンボルが 見つからなくてリンクできないというエラーが出るようになりました。 /usr/include/time.hに定義はあるようなのですが実体がどこにも無いようです。 src/profiler.cに以下のような仮対処を入れて、とりあえずリンクが失敗しないように して使っています。

--- src/profiler.c.orig 2015-04-02 16:23:06.000000000 +0900
+++ src/profiler.c      2015-09-21 19:34:04.815678200 +0900
@@ -235,9 +235,9 @@
 #ifdef HAVE_ITIMERSPEC
       if (profiler_timer_ok)
        {
-         int overruns = timer_getoverrun (profiler_timer);
-         eassert (overruns >= 0);
-         count += overruns;
+//       int overruns = timer_getoverrun (profiler_timer);
+//       eassert (overruns >= 0);
+//       count += overruns;
        }
 #endif
       eassert (HASH_TABLE_P (cpu_log));

3 履歴

  2016/10/15 : 「Emacsの雑記」から分離。

TOP PREV

著者: TANE

Emacs 25.1.1 (Org mode 8.2.10)