Skip to content

Instantly share code, notes, and snippets.

@rzl24ozi
Last active October 12, 2017 13:51
Show Gist options
  • Save rzl24ozi/b4f4b4d729035d3c439b to your computer and use it in GitHub Desktop.
Save rzl24ozi/b4f4b4d729035d3c439b to your computer and use it in GitHub Desktop.
about patches and how to build emacs on Windows. (Japanese)
※以下は emacs-26 プレテスト前のものなので現在では内容が古くなっているかもしれません。
emacs-26(以降)の README.txt も参照してみてください。
■各パッチについて
emacs-25.3-*.diff は emacs-25.3 に対するパッチです。
GNU emacs(x64) (http://hp.vector.co.jp/authors/VA052357/emacs.html)
の追加機能の主なものを切り出したものと自作のものをいくつか。
# 以前は GNU emacs(x64) に近い形で IME関連、イメージフィットオプション、cmigemo組み込み を
# まとめたものを *-x64.diff として置いていましたが、各機能は個別のパッチにわけてあるし面倒にも
# なってきたので^^; *-x64.diffは削除しました。
# 必要に応じ個別のパッチを使用するようにしてください。
GNU emacs(x64) で独自に実装されていたダイナミックロード機能は私にはうまく動かせなかったので
そのパッチはありませんが、emacs-25 で dynamic module 機能が実装されたので似たようなことは
できるかと思います。
cmigemo を dynamic module で組み込むようにしてみたものを
https://github.com/rzl24ozi/cmigemo-module
に置いているので興味があればお試しください。
あとIMEパッチを使用するなら不要でしょうが mozc_emacs_helper を dynamic module にしてみたもの
https://github.com/rzl24ozi/mozc-emacs-helper-module
とか。
なお GNU emacs(x64) のオリジナルの emacs からの修正部分は GNU emacs(x64) インストール後に
C:\Program Files\GNU\Emacs23\distfiles\ にパッチがあります。
□emacs-25.3-w32-ime.diff (https://gist.github.com/rzl24ozi/8c20b904c9f5e588ba99)
GNU emacs(x64) の IME 関連部分を切り出したものです。
mingw版 emacs、 cygwin版 emacs-w32 に適用できます。
configure に以下のオプションを追加しています。
デフォルトで W32-IME, RECONVERSION, DOCUMENTFEED が有効ですが無効にしたい場合に指定してください。
--without-w32-ime : W32-IME無効(同時にRECONVERSION、DOCUMENTFEEDも無効)
--without-reconversion : RECONVERSION無効(同時にDOCUMENTFEEDも無効)
--without-documentfeed : DOCUMENTFEED無効
□emacs-25.3-image-fit.diff (https://gist.github.com/rzl24ozi/bceff92df3359267657b)
GNU emacs(x64) のイメージフィットオプション追加部分を切り出したものです。
イメージフィットオプションについては GNU emacs(x64) のページを参照してください。
MSYS2 や cygwin のパッケージの jpeg は libjpeg-turbo のようですが この場合イメージフィットオプションが
効かないようです。
試してみるなら http://www.ijg.org/ からソースを取得し自ビルドして使用するなどしてください。
□emacs-25.3-cmigemo.diff (https://gist.github.com/rzl24ozi/6b1207d20970737f44c7)
GNU emacs(x64) でダイナミックロード機能が独自に実装される前の cmigemo 組み込み部分です。
configure に以下のオプションを追加しています。
デフォルトで cmigemo 組み込みが有効ですが無効にしたい場合に以下を指定してください。
--without-cmigemo : cmigemo組み込み無効
emacs 本体に修正を加えるのがためらわれるなら dynamic module として組み込むもの
(https://github.com/rzl24ozi/cmigemo-module)もありますのでお試しください。
□emacs-25.3-cygwin-rsvg.diff (https://gist.github.com/rzl24ozi/b0165eaf404a0c5a47ae)
cygwin版 emacs-w32 に rsvg を組み込みます。
□emacs-25.3-mingw-imagemagick.diff (https://gist.github.com/rzl24ozi/69c54eb86974fa1cbea1)
mingw版 emacs に imagemagick を組み込みます。
□emacs-25.3-disable-w32-ime.diff (https://gist.github.com/rzl24ozi/76aadcfc58404d9e7326)
mingw版 emacs、cygwin版 emacs-w32 に 以下の関数を追加します。
(disable-w32-ime) ; IME無効化(IMEをONにできなくなります)
(enable-w32-ime) ; IME無効化を元に戻す
(w32-ime-disabled-p) ; IMEが無効化されている場合 t を返す
□emacs-25.3-ImmDisableIME.diff (https://gist.github.com/rzl24ozi/4808fbd8fb3122933d7f)
mingw版 emacs、cygwin版 emacs-w32 で 起動時に ImmDisableIME () を使用して IME を無効化します。
IME 有効にはできません。W32-IMEイラネ な人向け。やっていることは
http://d.hatena.ne.jp/pekke/20140525/1401001174
にあるものと同じです。
また emacs git リポジトリ の master ブランチにこれらを適用できるようにしたものを
emacs-master-diffs (https://gist.github.com/rzl24ozi/245b8ca5636f7fd6df80)
として置いています。パッチ作成とリポジトリ更新とのタイミング的に当たらなくなってることもあるかもしれませんが
master ブランチでゴニョゴニョしたい方はどうぞ。
■w32-imeパッチ済バイナリ
emacs が最新版とは限りませんが w32-imeパッチ済バイナリが以下で公開されています。
IME パッチ版を手っ取り早く動かしたい方はどうぞ。
mingw64版: chuntaro 氏により https://github.com/chuntaro/NTEmacs64 にて
mingw32版: Wurly 氏により http://cha.la.coocan.jp/doc/NTEmacs.html にて
(24.5 まで。25.1以降は Wurly 氏の簡易対応版)
cygwin版(32bit): gnupack (http://sourceforge.jp/projects/gnupack/) に
w32-ime, cygwin-rsvg, disable-w32-ime パッチ済 emacs-w32 が同梱
■MinGW 版のビルド
MSYS2 インストールについて詳細は
http://sourceforge.net/p/msys2/wiki/MSYS2%20installation/
などご参照ください。
その他、chuntaro 氏が https://github.com/chuntaro/NTEmacs64 にて公開されているビルド手順など参考に
させていただきました。
ありがとうございます。こちらもご参照ください。
□MSYS2
MSYS2 インストーラー
https://sourceforge.net/projects/msys2/files/Base/x86_64/ の msys2-x86_64-YYYYMMDD.exe (64bit Windows の場合)
https://sourceforge.net/projects/msys2/files/Base/i686/ の msys2-i686-YYYYMMDD.exe (32bit Windows の場合)
(YYYYMMDDは年月日)
をダウンロード、実行しインストール。インストーラーが起動しないようなら別の日付のものを試してみてください。
インストーラー終了時 MSYS2 実行中のチェックを入れたまま完了、起動した MSYS2 シェルで
$ pacman -Syuu
としてシステムを更新。終わったら Alt+F4 で終了。
□emacs のビルド
cygwin をインストールしている環境で cygwin の bin などを PATH に入れているとうまくビルドできない
ことがあるようなので cygwin は PATH から除外しておいてください。
ビルドの邪魔になることがあるのでセキュリティソフトなどは一時的に停止しておいた方がよいかと思います。
以下は 64bit 版のビルドになります。
32bit 版のビルドであれば mingw32.exe を起動し x86_64 を i686 に読みかえて作業してください。
Windows が 32bit 版の場合は当然 64bit 版のビルドは無理なので 32bit 版をビルドしてください。
MSYS2 インストール先の mingw64.exe を起動し、
$ pacman -S base-devel
$ pacman -S mingw-w64-x86_64
$ pacman -S mingw-w64-x86_64-gcc
$ pacman -S mingw-w64-x86_64-giflib
$ pacman -S mingw-w64-x86_64-gnutls
$ pacman -S mingw-w64-x86_64-librsvg
$ pacman -S mingw-w64-x86_64-xpm-nox
でビルド関連のパッケージをインストール。
emacs-25.3 ソースを展開しソーストップディレクトリに移動。
必要に応じパッチを当ててください。
configure.ac を変更するパッチを当てた場合は
$ ./autogen.sh
を実行し configure を生成しなおしておいてください。
emacs-25.3 ソーストップディレクトリで
$ ./configure --host=x86_64-w64-mingw32 --prefix=(emacsインストール場所)
$ make
$ make install
で emacs 本体のインストール完了。
32bit 版では emacs が終了時にクラッシュすることがあるようなので LDFLAGS=-shared-libgcc を指定して
おいた方がよいでしょう。
--prefix は x:/... の形式で指定すると src/epaths.h の PATH_SITELOADSEARCH の設定に失敗し site-lisp
が load-path の デフォルトに入らなくなります。/x/... のように指定してください。
デフォルトで CFLAGS が -g3 -O2 になるのでビルドされた emacs のファイルサイズがデバッグ情報のため
大きくなります。デバッグする必要がないなら configure 時に CFLAGS=-O2 などと指定するか、
make install-strip でインストールするなどしてください。
デフォルトで make install 時に .info や .el が圧縮されますが圧縮したくない場合は configure に
--without-compress-install を指定するか、
$ make GZIP_PROG="" install
でインストールしてください。
最新の MinGW64 のビルドで ScriptFreeCache が GDI32.dll から見つからない のようなメッセージボックスが
出ることがあるようです。(emacs-26 branch, master branch では修正済。Bug#28493)
私の場合 Windows10 でビルドしたものを Windows7 で実行したときに発生しました。
その場合 W32_LIBS で -lusp10 が -lgds32 の前にくるように configure.ac を修正した後 ./autogen.sh を実行し
configure からビルドしなおしてください。
私は試していませんが configure 後 lib/Makefile, src/Makefile の W32_LIBS をそのように修正するのでもよいかと思います。
[imagemagick組み込み]
emacs-25.3-mingw-imagemagick.diff を当てた場合は ImageMagick が組み込めますが、emacs 本体が
ImageMagick-6 までにしか対応していないようなので MSYS2 パッケージの mingw-w64-x86_64-imagemagick
最新版は使えません。以前の ImageMagick-6 のときに何故かうまく画像が表示できなかったこともあり私は
ImageMagick を以下のように自ビルドしています。
パッケージの mingw-w64-x86_64-imagemagick をインストールしていたら
$ pacman -Rs mingw-w64-x86_64-imagemagick
で削除。
http://www.imagemagick.org/download/releases/
から ImageMagick-6.8.9-10 ソースをダウンロードし展開、ソーストップディレクトリに移動して
$ ./configure --host=x86_64-w64-mingw32 --enable-hdri --with-rsvg --prefix=(ImageMagickインストール場所)
$ make install
emacs の configure 実行時に PKG_CONFIG_PATH を
PKG_CONFIG_PATH=(ImageMagickインストール場所)/lib/pkgconfig:$PKG_CONFIG_PATH
に設定、emacs の make 時に PATH に (ImageMagickインストール場所)/bin を追加しておいてください。
ここではとりあえずソースに修正を加えずビルドできたバージョンの imagemagick を使用しましたが、
https://sourceforge.net/projects/msys2/files/REPOS/MINGW/Sources/
の mingw-w64-x86_64-imagemagick-6 パッケージソース(いずれ削除されるかもしれませんが)に含まれている
パッチを参考にすれば ImageMagick-6.9.* はビルドできるかと思います。
新しめのものの方がいいとかであればお試しください。
ImageMagick-6.9.9-19 では emacs で使用する分には以下の修正でよさそうです。
(emacs でいくつか画像表示させた程度しか動作確認していません。それ以外での使用は問題が生じるかもしれないのでご注意)
--- ./magick/magick.c.orig 2017-10-07 20:53:40.000000000 +0900
+++ ./magick/magick.c 2017-10-09 10:01:08.906348700 +0900
@@ -819,12 +819,12 @@
static MagickBooleanType IsMagickTreeInstantiated(ExceptionInfo *exception)
{
- if (magick_list_initialized == MagickFalse)
+ if (magick_list == (SplayTreeInfo *)NULL)
{
if (magick_semaphore == (SemaphoreInfo *) NULL)
ActivateSemaphoreInfo(&magick_semaphore);
LockSemaphoreInfo(magick_semaphore);
- if (magick_list_initialized == MagickFalse)
+ if (magick_list == (SplayTreeInfo *)NULL)
{
MagickBooleanType
status;
--- ./magick/nt-base.h.orig 2017-10-07 20:53:40.000000000 +0900
+++ ./magick/nt-base.h 2017-10-09 10:01:08.909355000 +0900
@@ -39,6 +39,8 @@
#include <errno.h>
#include <malloc.h>
#include <sys/utime.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
#if defined(_DEBUG) && !defined(__MINGW32__)
#include <crtdbg.h>
#endif
[cmigemo組み込み]
emacs-25.3-cmigemo.diff を当てた場合は cmigemo が組み込めます。組み込む場合は
https://osdn.jp/projects/nkf/downloads/64158/nkf-2.1.4.tar.gz/
から nkf のソースを取得してmake、インストールしておき
http://www.kaoriya.net/software/cmigemo (https://github.com/koron/cmigemo)
から C/Migemo のソースコードを取得して展開、ソーストップディレクトリに
移動して
$ ./configure --prefix=(cmigemoインストール場所)
$ make mingw-install
でインストール。
emacs の configure 実行時に
$ CPPFLAGS=-I(cmigemoインストール場所)/include ./confiugre ...
のように指定してください。
[DLLなどのコピー]
MSYS2 環境外でも使えるように dynamic-library-alist にある dll とそれらが依存する dll、emacs 本体が
依存する dll を /mingw64/ 下 (32bit 版であれば /mingw32/ 下) から (emacsインストール場所)/bin/ 下へ
コピーしておいてください。
dll の依存関係は Dependency Walker (http://www.dependencywalker.com/) などでわかります。
私の場合は以下をコピーしました。
libgcc_s_seh-1.dll # 64bit版の場合
libgcc_s_dw2-1.dll # 32bit版の場合
libXpm-noX4.dll
libbz2-1.dll
libcairo-2.dll
libcroco-0.6-3.dll
libexpat-1.dll
libffi-6.dll
libfontconfig-1.dll
libfreetype-6.dll
libgdk_pixbuf-2.0-0.dll
libgif-7.dll
libgio-2.0-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgmp-10.dll
libgnutls-30.dll
libgobject-2.0-0.dll
libgraphite2.dll
libharfbuzz-0.dll
libhogweed-4.dll
libiconv-2.dll
libidn2-0.dll
libintl-8.dll
libjpeg-8.dll
liblzma-5.dll
libnettle-6.dll
libp11-kit-0.dll
libpango-1.0-0.dll
libpangocairo-1.0-0.dll
libpangoft2-1.0-0.dll
libpangowin32-1.0-0.dll
libpcre-1.dll
libpixman-1-0.dll
libpng16-16.dll
librsvg-2-2.dll
libstdc++-6.dll
libtasn1-6.dll
libtiff-5.dll
libunistring-2.dll
libwinpthread-1.dll
libxml2-2.dll
zlib1.dll
imagemagick を組み込んだ場合はさらに
libgomp-1.dll
および (ImageMagickインストール場所)/bin から
libMagickCore-6.Q16HDRI-2.dll libMagickWand-6.Q16HDRI-2.dll # ImageMagick-6.8.9-10
または
libMagickCore-6.Q16HDRI-5.dll libMagickWand-6.Q16HDRI-5.dll # ImageMagick-6.9.9-19
を、cmigemo を組み込んだ場合は (cmigemoインストール場所)/bin から
migemo.dll
をコピーしておいてください。
cmigemo を組み込んだ場合は
(cmigemoインストール場所)/share/migemo/utf-8/*
も (emacsインストール先)/share/emacs/25.3/etc/migemo/utf-8/ 下へコピーしておいてください。
cmigemo.el を load すれば migemo のインクリメンタル検索ができます。
cmigemo.el は emacs-25.3-cmigemo.diff を当てた後の site-lisp/ 下にあります。
■cygwin emacs-w32 のビルド
ビルド関連のライブラリはパッケージの *-devel をインストールしておけばよいです。
pkg-config, autoconf, automake 他、ビルドに必要なコマンド類もパッケージからインストールしておいて
ください。
configure.ac を変更するパッチを当てた場合は configure 実行前に
$ ./autogen.sh
を実行して configure を生成しなおしておいてください。
emacs-25.3-cmigemo.diff を当てて cmigemo を組み込むなら
https://osdn.jp/projects/nkf/downloads/64158/nkf-2.1.4.tar.gz/
から nkf のソースを取得してmake、インストールしておき
http://www.kaoriya.net/software/cmigemo (https://github.com/koron/cmigemo)
から C/Migemo ソースコードを取得、
$ ./configure
$ make cyg-install
でインストールしておいてください。
emacs-25.3 ソーストップディレクトリで
$ ./configure --with-w32 --prefix=(emacsインストール場所)
$ make
$ make install
でインストール完了です。
以上
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment