2019-12-08

Windows用のEmacs26.3をMSYS2でビルドする方法(IMEパッチ、ImageMagick-6)

rzl24ozi’s gistsにIMEパッチが公開されている。README.txtに詳細なビルド方法が書いてあるのでよく読むこと。

1次情報としてはソースコードツリー内の nt/INSTALLnt/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/INSTALLnt/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の場合テキストマウントに注意すること)。

http://ftp.gnu.org/gnu/emacs/

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用のパッチがそのまま適用できた。

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を使うときは次のパッチを使う。

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にビルドが通ることを確認しました。