Saturday, August 1, 2009

NTEmacs 23 を作ってみたメモ。

NTEmacs 23.1

Emacs 23.1 がリリースされたので、Windows 用の NTEmacs 23.1 をビルドするときの個人的な手順メモ。

IME 対応などのパッチを使わない点を除けば、上記のページで広松さんが公開してくださっている手順と同じです。

ほかの部分も、ぼくが NTEmacs 22 を作っていた上記の手順とだいたい同じです。

Cygwin

コンパイルには Cygwin 1.5 の gcc 3.4.4-3, MinGW パッケージ, GNU Make 3.80 を使います。

$ uname -a
CYGWIN_NT-5.1 aspirin 1.5.25(0.156/4/2) 2008-11-18 15:24 i686 Cygwin

$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ make --version
GNU Make 3.80
Copyright (C) 2002  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

$ cygcheck -s | egrep '^(gcc|mingw|make)'
gcc                     3.4.4-3
gcc-core                3.4.4-3
gcc-g++                 3.4.4-3
gcc-mingw               20040810-1
gcc-mingw-core          20050522-1
gcc-mingw-g++           20050522-1
make                    3.80-1
mingw-bzip2             1.0.5-3
mingw-libbz2-devel      1.0.5-3
mingw-libbz2_1          1.0.5-3
mingw-runtime           3.15.2-1
mingw-zlib              1.2.3-3
mingw-zlib-devel        1.2.3-3
mingw-zlib0             1.2.3-3

Cygiwn 1.5 は UTF-8 Cygwin の cygwin1.dll を利用させてもらっています。たぶん NTEmacs のビルドには関係ないですが。
Cygwin 1.7 は現時点でリリースされておらず、環境を作っていないので状況は分かりません。もうすぐリリースなのかな。もう MinGW アプリケーション作れるのだろうか…。

gcc は alternatives 対応直前の gcc-3.4.4-3 を使います。一連の gcc のパッケージのバージョンを keep しておきます。 
gcc-3.4.4-999 を使う場合には alternatives の symlink (ショートカット)をどうにかするか、configure.bat を修正して、COMPILER=gcc-3 を指定する必要があると思います(未確認)。
gcc-4 系は現時点では MinGW アプリケーションを作るための "-mno-cygwin" フラグがサポートから外されているので使用できません。

MinGW はどのパッケージが最低限必要なのか調べていないので、mingw と名のつくパッケージを適当に…。

GNU Make は、emacs/nt/INSTALL によれば 3.81 は使えないらしいので 3.80 に keep してあります。

その他の Cygwin のパッケージは、サーバ系と X 関係、フォント、グラフィック関係を除いて自分が使うものをテキトーに入れてます。

画像サポート用のライブラリ DLL

emacs/nt/INSTALL の "* Optional image library support" を参考にして、DLL とヘッダファイルを用意します。

実験的サポートの SVG は入れてません。

$ \ls -Rgo src/GnuWin32
src/GnuWin32:
total 3524
drwx------+ 3      0 Feb  8 16:57 DLL
-rwx------+ 1 189242 May 15  2005 jpeg-6b-4-bin.zip
-rwx------+ 1  38186 May 15  2005 jpeg-6b-4-lib.zip
-rw-r--r--  1 401037 Jun  5 05:53 libpng-1.2.37-bin.zip
-rw-r--r--  1 134939 Jun  5 05:55 libpng-1.2.37-lib.zip
-rwx------+ 1 285963 Mar  2  2007 libungif-4.1.4-1-bin.zip
-rwx------+ 1  12272 Mar  2  2007 libungif-4.1.4-1-lib.zip
-rwx------+ 1 928480 Mar  2  2007 libungif-4.1.4-1-src.zip
-rwx------+ 1 687244 Mar 31  2006 tiff-3.8.2-1-bin.zip
-rwx------+ 1  38372 Mar 31  2006 tiff-3.8.2-1-lib.zip
-rwx------+ 1  35884 Feb 15  2005 xpm-3.5.1-1-bin.zip
-rwx------+ 1  42484 Feb 15  2005 xpm-3.5.1-1-lib.zip
-rwx------+ 1 622191 Feb 15  2005 xpm-3.5.1-1-src.zip
-rwx------+ 1  99777 Jul 26  2005 zlib-1.2.3-bin.zip
-rwx------+ 1  71569 Jul 26  2005 zlib-1.2.3-lib.zip

src/GnuWin32/DLL:
total 1297
drwx------+ 2      0 May  9  2008 X11
-rwx------+ 1  16189 Oct 25  2005 gif_lib.h
-rwx------+ 1   1800 May 14  2005 jconfig.h
-rwx------+ 1  14488 May 15  2005 jerror.h
-rwx------+ 1  14567 May 14  2005 jmorecfg.h
-rwx------+ 1 127488 May 15  2005 jpeg62.dll
-rwx------+ 1  46359 May 15  2005 jpeglib.h
-rwx------+ 1   2245 Jun  4 22:41 libpng12-config
-rwx------+ 1   4645 Jun  4 22:55 libpng12.def
-rwx------+ 1 260096 Jun  4 22:48 libpng12.dll
-rwx------+ 1 376832 Mar 28  2006 libtiff3.dll
-rwx------+ 1  31232 Mar  1  2007 libungif4.dll
-rwx------+ 1 153839 Jun  4 22:40 png.h
-rwx------+ 1  45382 Jun  4 22:40 pngconf.h
-rwx------+ 1   4959 Oct 25  2004 simx.h
-rwx------+ 1  33725 Dec 27  2005 tiff.h
-rwx------+ 1   2968 Mar 23  2006 tiffconf.h
-rwx------+ 1  23216 Mar 28  2006 tiffio.h
-rwx------+ 1    410 Mar 23  2006 tiffvers.h
-rwx------+ 1  52224 Feb 13  2005 xpm4.dll
-rwx------+ 1  75264 Jul 20  2005 zlib1.dll

src/GnuWin32/DLL/X11:
total 16
-rwx------+ 1 16286 Jan 25  2004 xpm.h

Emacs のソースのチェックアウト

リリースの tarball を入手するか、CVS / git リポジトリから emacs モジュールをチェックアウトします。

Emacs 23.1 で使用する branch は EMACS_23_1_RC です。

CVS
$ cd ~/src/anoncvs
$ cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs \
> checkout emacs
$ cd emacs
$ cvs update -r EMACS_23_1_RC
git
$ cd ~/src/git
$ git clone git://git.savannah.gnu.org/emacs.git
$ cd emacs
$ git checkout --track origin/EMACS_23_1_RC

gmake.defs の修正

Cygwin 環境でビルドするために nt/gmake.defs を修正します。Cygwin で検索すると出てくるので分かりやすいです。

$ cd nt
$ git --no-pager diff gmake.defs
diff --git a/nt/gmake.defs b/nt/gmake.defs
index 018ca15..d860c42 100644
--- a/nt/gmake.defs
+++ b/nt/gmake.defs
@@ -84,9 +84,9 @@ MAKETYPE=gmake
 # remedied before putting this cygpath kludge back in.

 # Convert CURDIR to native file name, if in Cygwin format
-#ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"
-#CURDIR                := $(shell cygpath -m $(CURDIR))
-#endif
+ifeq "$(shell cygpath $(CURDIR))" "$(CURDIR)"
+CURDIR         := $(shell cygpath -m $(CURDIR))
+endif

 THISDIR                = .

@@ -276,7 +276,7 @@ ifeq "$(ARCH)" "i386"
 ifdef NOOPT
 ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN)
 else
-ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O2 \
+ARCH_CFLAGS     = -c $(DEBUG_FLAG) $(NOCYGWIN) $(MCPU_FLAG) -O3 \
                  # -fbuiltin \
                  # -finline-functions \
                  # -fomit-frame-pointer

上記後半の -O3 optimization の修正と、以下の configure.bat の修正は必要なわけではないです。

$ git --no-pager diff configure.bat
diff --git a/nt/configure.bat b/nt/configure.bat
index 56b8570..21e683a 100755
--- a/nt/configure.bat
+++ b/nt/configure.bat
@@ -325,10 +325,10 @@ set COMPILER=gcc
 echo Using 'gcc'
 rm -f junk.c junk.o
 Rem It is not clear what GCC version began supporting -mtune
-Rem and pentium4 on x86, so check this explicitly.
+Rem and prescott on x86, so check this explicitly.
 echo main(){} >junk.c
-echo gcc -c -O2 -mtune=pentium4 junk.c >>config.log
-gcc -c -O2 -mtune=pentium4 junk.c >>config.log 2>&1
+echo gcc -c -O3 -mtune=prescott junk.c >>config.log
+gcc -c -O3 -mtune=prescott junk.c >>config.log 2>&1
 if not errorlevel 1 goto gccMtuneOk
 echo The failed program was: >>config.log
 type junk.c >>config.log
@@ -336,8 +336,8 @@ set mf=-mcpu=i686
 rm -f junk.c junk.o
 goto gccdebug
 :gccMtuneOk
-echo GCC supports -mtune=pentium4 >>config.log
-set mf=-mtune=pentium4
+echo GCC supports -mtune=prescott >>config.log
+set mf=-mtune=prescott
 rm -f junk.c junk.o
 :gccdebug
 rem Check for DWARF-2 debug info support, else default to stabs

なんでいじったのか覚えていないけど、たぶん Cygwin 1.5 の gcc-4 が使えるようになるのを期待して準備していたような…。 make 時に ARCH_CFLAGS を指定するほうが綺麗なのかも。

configure

$ cd ~/src/git/emacs/nt
$ LANG=C ./configure.bat --with-gcc --no-cygwin --no-debug \
> --cflags=-I/cygdrive/c/Users/yu-ji/src/GnuWin32/DLL \
> --prefix=C:/emacs/23 \
> 2>&1 | tee config.log.yu-ji

うまくいけば "building with PNG support" とかの表示とともに makefile ができあがります。

make して install

$ LANG=C make bootstrap
$ LANG=C make info
$ LANG=C make install

info を作るとき以外は LANG=C の指定いらないかも。tarball からのインストールなら bootstrap は不要らしいです。

bootstrap のあと、../src/oo-spd/i386/emacs.exe が出来てるはずなので -q つけて起動したりして、ちゃんと動くか確認します。

画像用の DLL を PATH の通ったディレクトリか emacs.exe と同じディレクトリにコピーして、NTEmacs 自体のインストールはこれで完了です。

その他の elisp とか

以下はぼくが使っている elisp とかのインストール手順メモ。

emacs-clientw.vbs

上記ページを参考にして emacs-clientw.vbs を使っています。
Emacs の server がいれば emacsclientw -n を、いなければ runemacs するスクリプトです。

'
' C:\emacs\23\bin\emacs-clientw.vbs
'
Set objShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 1 Then
  strComputer = "."
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
  Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
  Dim isRunning
  isRunning = False
  For Each objItem in colItems
    If InStr(objItem.CommandLine, "emacs.exe") Then
      isRunning = True
    End If
  Next
  If isRunning Then
    objShell.Run("""" & fso.GetParentFolderName(WScript.ScriptFullName) & "/emacsclientw.exe"" -n """ & WScript.Arguments(0) & """")
  Else
    objShell.Run("""" & fso.GetParentFolderName(WScript.ScriptFullName) & "/runemacs.exe"" """ & WScript.Arguments(0) & """")
  End If
Else
  objShell.Run(fso.GetParentFolderName(WScript.ScriptFullName) & "/runemacs.exe")
End If

個人的には Emacs の外からファイルを開かせることはそれほど無いのですが、やっぱり使えないと困るときもあるので。

APEL

Daredevil SKK で使われている APEL

$ cd ~/src/anoncvs/apel
$ cvs update -dP
$ cvs diff -u makeit.bat | nkf -w
Index: makeit.bat
===================================================================
RCS file: /cvs/root/apel/makeit.bat,v
retrieving revision 1.1
diff -u -r1.1 makeit.bat
--- makeit.bat  1 Feb 2001 03:19:36 -0000       1.1
+++ makeit.bat  25 Mar 2009 01:27:54 -0000
@@ -102,9 +102,10 @@
 rem --- なお、DEFAULT_MAKE_ARG に可能な値は make1.bat を御覧ください。
 rem --- (Please see make1.bat for possible values of DEFAULT_MAKE_ARG.)

-set PREFIX=
-set EMACS=
-set LISPDIR=
+set PREFIX=c:\emacs
+set EMACS=%PREFIX%\23\bin\emacs.exe
+set LISPDIR=%PREFIX%\site-lisp
+set VERSION_SPECIFIC_LISPDIR=%PREFIX%\23\site-lisp
 set DEFAULT_MAKE_ARG=


$ ./makeit.bat install
Daredevil SKK / ddskk

Emacs 内では ddskk を、Windows の他のアプリケーションでは skkime を使っています。

$ cd ~/src/anoncvs/skk/main
$ cvs update -dP
$ cvs diff -u makeit.bat | nkf -w
Index: makeit.bat
===================================================================
RCS file: /circus/cvsroot/skk/main/makeit.bat,v
retrieving revision 1.4
diff -u -r1.4 makeit.bat
--- makeit.bat  3 Oct 2008 15:03:39 -0000       1.4
+++ makeit.bat  25 Mar 2009 01:39:39 -0000
@@ -102,9 +102,10 @@
 rem --- なお、DEFAULT_MAKE_ARG に可能な値は make1.bat を御覧ください。
 rem --- (Please see make1.bat for possible values of DEFAULT_MAKE_ARG.)

-set PREFIX=
-set EMACS=
-set LISPDIR=
+set PREFIX=c:\emacs
+set EMACS=%PREFIX%\23\bin\emacs.exe
+set LISPDIR=%PREFIX%\site-lisp
+set VERSION_SPECIFIC_LISPDIR=%PREFIX%\23\site-lisp
 set DEFAULT_MAKE_ARG=


$ ./makeit.bat install
color-theme

site-lisp 以下に展開するだけ。

emacs-w3m
$ cd ~/src/anoncvs/emacs-w3m
$ cvs update -dP
$ ./configure \
> --with-lispdir=/cygdrive/c/emacs/23/site-lisp/w3m \
> --infodir=/cygdrive/c/emacs/23/info \
> 2>&1 | tee config.log.yu-ji
$ make
$ make install
Mew
$ cd ~/src/anoncvs/mew
$ cvs update -dP
$ ./configure \
 --prefix=/cygdrive/c/emacs/23 \
 --with-elispdir=/cygdrive/c/emacs/23/site-lisp/mew \
 --with-etcdir=/cygdrive/c/emacs/23/site-lisp/mew/etc \
 --infodir=/cygdrive/c/emacs/23/info \
 --mandir=/usr/man \
 2>&1 | tee config.log.yu-ji
$ make
$ make install && make install-info && make install-jinfo

info を自分で作るときは info/Makefile を修正したり、Cygwin じゃなくてコマンドプロンプトから作ったりの手順が必要っぽいです。環境によるかも。ちゃんと調べてないですが。

おしまい。

別の記事で載せてるフォント指定の設定はそのうち整理します。

関連記事

追記@Sun Aug 30 18:17:22 2009

「Emacs 23 で使用する branch は EMACS_23_1_RC」と書いてたのを修正。23.2 で新しい branch を切るか、このまま trunk から出すか、まだ決まってないっぽいです。メンテナは trunk からのつもりっぽい?

追記@Mon Jul 05 10:11:06 2010

この記事は Cygwin 1.5 の gcc 3 系を使って MinGW アプリケーションとして Emacs をビルドするものです。
Cygwin 1.5 の gcc 4 系および Cygwin 1.7 の gcc は MinGW アプリケーションのコンパイルをサポートしていません。

新たにビルド環境を整えるかたには、MSYS + MinGW によるビルドをお薦めします。

"msys mingw gcc emacs" あたりでぐぐってくだささい…。

No comments:

Post a Comment