rzl24ozi’s gistsにIMEパッチが公開されている。README.txtに詳細なビルド方法が書いてあるのでよく読むこと。
1次情報としてはソースコードツリー内の nt/INSTALL や nt/INSTALL.W64 にWindowsでのビルド方法が書いてある。
Emacs 26.2以降は最低限のIMEサポートがなされているらしいのでIMEパッチを適用しなくても公式ビルドで十分な場合もある。私の場合、ATOK使用時にCtrl+Nで部分確定した文字が正しく入力されなかった(Ctrl+各確定した文字…と解釈されてそんなキーバインドは無いと言われた)のでIMEパッチを使うことにした。
また、ImageMagickサポートがあると画像の拡大縮小ができて大きな画像も無理なく埋め込み表示出来るのでImageMagickパッチも適用することにした。
作業概要
MSYS2環境を構築(後述)してから、MinGW64のシェルから次の作業を行う。各ステップについての詳細は後述する。
# 作業用ディレクトリを作る mkdir emacsbuild cd emacsbuild WORK_DIR=$(pwd) # ImageMagickをダウンロードして展開してビルドする IMAGEMAGICK_VER=ImageMagick-6.9.10-77 wget http://www.imagemagick.org/download/releases/$IMAGEMAGICK_VER.tar.gz tar xvfz $IMAGEMAGICK_VER.tar.gz IMAGEMAGICK_DIR=$WORK_DIR/ImageMagick-6 cd $IMAGEMAGICK_VER ./configure --host=x86_64-w64-mingw32 --enable-hdri --with-rsvg --prefix=$IMAGEMAGICK_DIR make install cd .. # Emacsをダウンロードして展開する EMACS_VER=emacs-26.3 wget http://ftp.gnu.org/gnu/emacs/$EMACS_VER.tar.gz tar xvfz $EMACS_VER.tar.gz # IMEパッチを当てる wget https://gist.githubusercontent.com/rzl24ozi/ee4457df2f54c5f3ca0d02b56e371233/raw/16794e5883211049aed08c681f71240fa32cc28f/emacs-26.1-rc1-w32-ime.diff patch -p0 -d $EMACS_VER <./emacs-26.1-rc1-w32-ime.diff # ImageMagickパッチを当てる wget https://gist.githubusercontent.com/rzl24ozi/2b6dd502f3e0fa5083fb87c808287370/raw/a56d6c576d3f4ca24f87ff7510498f588a67c236/emacs-26.1-rc1-mingw-imagemagick.diff patch -p0 -d $EMACS_VER <./emacs-26.1-rc1-mingw-imagemagick.diff # ImageMagick関連dllファイル名をビルドしたバージョンに合わせて書き替える mv $EMACS_VER/lisp/term/w32-win.el $EMACS_VER/lisp/term/w32-win.el.orig_patched sed 's/-6\.Q16HDRI-5\.dll/-6.Q16HDRI-6.dll/g; s/-6\.Q16-5\.dll/-6.Q16-6.dll/g;' $EMACS_VER/lisp/term/w32-win.el.orig_patched > $EMACS_VER/lisp/term/w32-win.el # Emacsをビルドする EMACS_INSTALL_DIR=/c/app/$EMACS_VER cd $EMACS_VER ./autogen.sh PKG_CONFIG_PATH=$IMAGEMAGICK_DIR/lib/pkgconfig:$PKG_CONFIG_PATH ./configure --without-dbus --with-gnutls --prefix=$EMACS_INSTALL_DIR make -j4 make install-strip cd .. # dllをコピーする cp /mingw64/bin/*.dll $EMACS_INSTALL_DIR/bin cp $IMAGEMAGICK_DIR/bin/libMagickCore*.dll $EMACS_INSTALL_DIR/bin cp $IMAGEMAGICK_DIR/bin/libMagickWand*.dll $EMACS_INSTALL_DIR/bin
Cygwin使用者への注意
Cygwinを使用している場合はCygwinの設定がMSYSと混ざらないように注意すること。
- 環境変数HOMEが指している場所に.bashrcや.bash_profile等の設定ファイルがある場合は、それが読み込まれないようにする。そこにPKG_CONFIGやLIBRARY_PATH等の設定があるとうまくビルド出来ない。
- PATHがCygwinのツールを参照していると問題を起こす場合がある(特にテキストマウントによる改行コードの問題)ので、PATHからCygwin関連へのパスを外す等する。
環境変数HOMEがCygwinの設定ファイルがあるディレクトリを指している場合、例えば次のようにして対処する。
- MSYSを使う前に一時的に環境変数HOMEを削除する
- msys2_shell.cmdの先頭に「set HOME=」を追加する
- cmd.exeから set "HOME=" && (msysインストール先)\msys2_shell.cmd -mingw64 でMinGW64シェルを起動する
-
.bashrcや.bash_profileにCygwin以外(MSYS等)で実行した場合に対応するコードを追加する。例えば次のコードをファイルの先頭に入れるとCygwin以外は何もせず終了する
[[ "$OSTYPE" != "cygwin" ]] && return
MSYS2環境の準備
MSYS2のインストール
MSYS2 homepageからMSYS2(x86_64)のインストーラをダウンロードして実行しインストールする。
MSYS2シェルの起動
スタートメニューから「MSYS2 MSYS」を選ぶとMSYS2シェルが起動する。
MSYS2の更新
すでにMSYS2をインストール済みの場合、ビルドの前に各種パッケージの更新を行う(古いバージョンのMSYS2の場合は入れ直した方が早いかも)。
スタートメニューから「MSYS2 MSYS」を選んで以下を入力。
pacman -Syuu
warning: terminate MSYS2 without returning to shell and check for updates again warning: for example close your terminal window instead of calling exit
のようなメッセージが出たらAlt+F4で終了してスタートメニューからMSYS2 MSYSを起動して再度 pacman -Syuu
を実行する。
何度か繰り返して更新されなくなったらOK。
以前追加したパッケージはここで更新される。
必要なパッケージの追加
必要なパッケージについては nt/INSTALL や nt/INSTALL.W64 を参照のこと。
nt/INSTALL.W64では次のパッケージをインストールしている(2019-12-07現在)。
pacman -S --needed base-devel \ mingw-w64-x86_64-toolchain \ mingw-w64-x86_64-xpm-nox \ mingw-w64-x86_64-libtiff \ mingw-w64-x86_64-giflib \ mingw-w64-x86_64-libpng \ mingw-w64-x86_64-libjpeg-turbo \ mingw-w64-x86_64-librsvg \ mingw-w64-x86_64-lcms2 \ mingw-w64-x86_64-jansson \ mingw-w64-x86_64-libxml2 \ mingw-w64-x86_64-gnutls \ mingw-w64-x86_64-zlib
不要なパッケージ(ImageMagick-7)が入っている場合は削除すること。
pacman -Rs mingw-w64-x86_64-imagemagick
MinGW64シェルに移る
スタートメニューから「MSYS2 MinGW 64-bit」を選ぶ。
Cygwinを使用している場合はCygwin使用者への注意を参照のこと。
作業用ディレクトリを用意する
mkdir emacs_build cd emacs_build WORK_DIR=$(pwd)
以降作業ディレクトリへのパスを $WORK_DIR とする。
ImageMagickのビルド
ImageMagickのソースコードの取得
http://www.imagemagick.org/download/releases/ から6系の最新のソースコードを取得する。
IMAGEMAGICK_VER=ImageMagick-6.9.10-77 wget http://www.imagemagick.org/download/releases/$IMAGEMAGICK_VER.tar.gz tar xvfz $IMAGEMAGICK_VER.tar.gz
ImageMagickのビルド
MinGW64シェルから展開したディレクトリへ移動して
IMAGEMAGICK_DIR=$WORK_DIR/ImageMagick-6 cd $IMAGEMAGICK_VER ./configure --host=x86_64-w64-mingw32 --enable-hdri --with-rsvg --prefix=$IMAGEMAGICK_DIR make install cd ..
$WORK_DIR/ImageMagick-6 にビルド結果が格納される。そのディレクトリを以降 $IMAGEMAGICK_DIR とする。
Emacsのビルド
Emacsのソースコードの取得
Emacsの公式サイトからソースコードをダウンロードして展開する(Cygwinの場合テキストマウントに注意すること)。
EMACS_VER=emacs-26.3 wget http://ftp.gnu.org/gnu/emacs/$EMACS_VER.tar.gz tar xvfz $EMACS_VER.tar.gz
Gitで取得することもできる。
which gitしてgitが見えなければgitへのパスを通す(Git for WindowsなどMSYS2の外でインストールしている場合は見えないと思う)。
export PATH="/c/app/dev/Git/cmd":"$PATH"
emacs.git - Emacs source repository より好きなブランチを選んで入手する。
git clone --depth=1 -b $EMACS_VER git://git.savannah.gnu.org/emacs.git --config core.autocrlf=false
改行コードに注意すること。Windowsだとautocrlfで使っている人もいると思うので、改行コードが変換されないようにオプションを付ける。
IMEパッチを適用
rzl24ozi’s gists より最新のものを入手する。
emacs-26.3にはemacs26.1-rc1用のパッチがそのまま適用できた。
- emacs-26.1-rc1-w32-ime.diff (https://gist.github.com/rzl24ozi/ee4457df2f54c5f3ca0d02b56e371233)
wget https://gist.githubusercontent.com/rzl24ozi/ee4457df2f54c5f3ca0d02b56e371233/raw/16794e5883211049aed08c681f71240fa32cc28f/emacs-26.1-rc1-w32-ime.diff
patch -p0 -d $EMACS_VER <./emacs-26.1-rc1-w32-ime.diff
注意: Cygwinをテキストマウントで使っている場合、Cygwinのpatchを使うと改行コードがCR+LFになることがあるので、その場合はMinGWのpatchを使うこと。
(msys2インストール先)/usr/bin/patch -p0 -d $EMACS_VER <./emacs-26.1-rc1-w32-ime.diff
ImageMagickパッチを適用(+一部手動修正)
ImageMagickを使うときは次のパッチを使う。
- emacs-26.1-rc1-mingw-imagemagick.diff (https://gist.github.com/rzl24ozi/2b6dd502f3e0fa5083fb87c808287370)
wget https://gist.githubusercontent.com/rzl24ozi/2b6dd502f3e0fa5083fb87c808287370/raw/a56d6c576d3f4ca24f87ff7510498f588a67c236/emacs-26.1-rc1-mingw-imagemagick.diff
patch -p0 -d $EMACS_VER <./emacs-26.1-rc1-mingw-imagemagick.diff
した上で
lisp/term/w32-win.el 内の次の場所をDLLのファイル名に合わせて変更する。
'(magickwand "libMagickWand-6.Q16HDRI-5.dll" "libMagickWand-6.Q16-5.dll" "libMagickWand-6.Q16HDRI-2.dll" "libMagickWand-6.Q16-2.dll") '(magickcore "libMagickCore-6.Q16HDRI-5.dll" "libMagickCore-6.Q16-5.dll" "libMagickCore-6.Q16HDRI-2.dll" "libMagickCore-6.Q16-2.dll")
例えばImageMagick-6.9.10-77をビルドすると libMagickCore*-6.dll や libMagickWand*-6.dll ができるので、上の-5.dllを-6.dllへ修正する。
mv $EMACS_VER/lisp/term/w32-win.el $EMACS_VER/lisp/term/w32-win.el.orig_patched sed 's/-6\.Q16HDRI-5\.dll/-6.Q16HDRI-6.dll/g; s/-6\.Q16-5\.dll/-6.Q16-6.dll/g;' $EMACS_VER/lisp/term/w32-win.el.orig_patched > $EMACS_VER/lisp/term/w32-win.el
Emacsのビルド
MinGW64シェルから
EMACS_INSTALL_DIR=/c/app/$EMACS_VER cd $EMACS_VER ./autogen.sh PKG_CONFIG_PATH=$IMAGEMAGICK_DIR/lib/pkgconfig:$PKG_CONFIG_PATH ./configure --without-dbus --with-gnutls --prefix=$EMACS_INSTALL_DIR make -j4 #4コアで make install-strip $EMACS_INSTALL_DIR/bin/runemacs.exe -Q
DLLのコピー
msys64/mingw64/bin/*.dll をEmacsのbinディレクトリへコピーする。
cp /mingw64/bin/*.dll $EMACS_INSTALL_DIR/bin
ビルドして生成されたImageMagick用のdllもコピーする。
cp $IMAGEMAGICK_DIR/bin/libMagickCore*.dll $EMACS_INSTALL_DIR/bin cp $IMAGEMAGICK_DIR/bin/libMagickWand*.dll $EMACS_INSTALL_DIR/bin
その他の注意
MSYS2のライブラリパッケージがバージョンアップするとビルドが通らなくなったり通っても正しく動かなくなったりする場合があります。 emacs-26.2の時はlibgnutlsのバージョンアップに伴いSSL接続が正しく動かなくなった時がありました。 上記手順は2019-12-08にビルドが通ることを確認しました。