[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
ラベル Cygwin の投稿を表示しています。 すべての投稿を表示
ラベル Cygwin の投稿を表示しています。 すべての投稿を表示

2011-01-31

rebase for perlbrew Perl on Cygwin

Cygwinperlbrew 環境の Perl を使うときの、関連する DLL を rebase するシェルスクリプトです。

Cygwin には rebaseall や perlrebase がありますが、perlbrew でインストールした Perl の rebase までは面倒を見てくれません。brewedperlrebase (長い…)は perlbrew 環境用の perlrebase です。

どういうこと?

Cygwin は Windows 上に Linux 風の環境を提供するもので、様々な GNU ツールや UNIX 的な機能を利用できるようになります。Windows と UNIX 系 OS のプロセスモデルの最も大きな相違は自プロセスのコピーを生成する fork の有無です。
Cygwin では Windows 上にこの擬似的な fork() を実装するために DLL をロードするアドレスを調整する必要があります。

Cygwin の rebase は DLL のベースアドレスを変更するユーティリティで、プロセスにロードされる DLL のアドレスが重複せずそれぞれ一意となるように調整することで、fork() の親プロセスと子プロセスが同じメモリーイメージを持てるようにします。
基本的にロードされている DLL のアドレスさえ調整されていれば問題ないのですが、沢山ある DLL のうちどの DLL がどのプロセスでロードされるかは事前に知りようがないので、通常は rebaseall を使って Cygwin のほぼすべての DLL を rebase します。rebaseall するには対象となる DLL が使用されていない状態でなければいけないので、Cygwin のプログラムをすべて終了させておく必要があります。

Cygwin のパッケージでインストールされる DLL は既に調整された状態なので、通常の利用では rebase のお世話になることはありません。

しかし Perl のモジュールを CPAN からインストールしたとき、そこに XS を使ったモジュールが含まれていて DLL がインストールされた場合は別です。こういったモジュールを使った Perl プログラムはそのまま動くことが多いと思いますが fork() したときにはエラーが発生します。
例えば、

0 [main] perl 4704 C:\cygwin\bin\perl.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\perl5\5.10\i686-cygwin\auto\Fcntl\Fcntl.dll to same address as parent: 0x64700000 != 0x67290000
0 [main] perl 2520 fork: child 4704 - died waiting for dll loading, errno 11

のような。

これは rebaseall することで解決しますし、いちいち rebaseall するために Cygwin のプログラムをすべて終了させるのが面倒なときには、Cygwin の perl パッケージに含まれる perlrebase を利用することもできます。perlrebase は Perl に関連する DLL だけをまとめて rebase してくれるので、実行時に Perl を使ったプログラムさえ終了させておけば rebase できます。

perlrebase は /bin と /usr/local/bin にある Perl には対応していますが、perlbrew でインストールした Perl までは面倒を見てくれません(2回目)。ということで brewedperlrebase です。

CPAN からの芋づるインストールでは、特に依存関係にあるモジュールをロードしたあとのテスト時に fork() の問題が発生するので、逐次失敗させて rebase しながらインストールを進めるか、モジュールが動作すると分かっている場合にはテストを省略してインストールし最後にまとめて rebase します。

2010-06-02

MinGW gcc 4.5.0 の -march=native を Core i7 860 で

以前 "MSYS gcc 4.5.0" と書いていましたが "MinGW gcc 4.5.0" の間違いです。

MinGW gcc 4.5.0 の -march=native オプションを Core i7 860 で使うと適用されるオプションがおかしい。

のシェルスクリプトを拝借して…、
(一部手動改行)

## 参考に Cygwin で。
$ cat /proc/cpuinfo | grep '^model ' | sort | uniq
model name      : Intel(R) Core(TM) i7 CPU         860  @ 2.80GHz

$ uname -a
CYGWIN_NT-6.1-WOW64 devildoll 1.7.5(0.225/5/3) 2010-04-12 19:07 i686 Cygwin

$ gcc --version
gcc (GCC) 4.3.4 20090804 (release) 1
Copyright (C) 2008 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.

$ ~/work/gcc_native.sh
-march=core2 -mcx16 -msahf --param l1-cache-size=32
--param l1-cache-line-size=64 -mtune=core2


## MinGW / MSYS で。
$ uname -a
MINGW32_NT-6.1 DEVILDOLL 1.0.14(0.47/3/2) 2010-03-17 23:02 i686 Msys

$ gcc --version
gcc.exe (GCC) 4.5.0
Copyright (C) 2010 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.

$ ./work/gcc_native.sh
-march=atom -mcx16 -msahf -mpopcnt -msse4.2 --param l1-cache-size=32
--param l1-cache-line-size=64 --param l2-cache-size=8192 -mtune=core2

(ノ∀`) アチャー atom て

2010-05-14

zlib

こないだ zlib はオフィシャルから配布されてた DLL を使いましたが、新バージョン公開後すぐにバイナリーが上がるわけではないみたい。なので自分で make してみた。

win32/DLL_FAQ.txt によればオフィシャルの DLL を使うよう推奨しているのにね…。

## Cygwin で
$ cd ~/src
$ wget http://zlib.net/zlib-1.2.5.tar.bz2
$ tar xjf zlib-1.2.5.tar.bz2

## MinGW で
$ cd zlib-1.2.5
$ cp contrib/asm686/match.S ./match.S
$ make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o adler32.o adler32.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o compress.o compress.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o crc32.o crc32.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o deflate.o deflate.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o gzclose.o gzclose.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o gzlib.o gzlib.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o gzread.o gzread.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o gzwrite.o gzwrite.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o infback.o infback.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o inffast.o inffast.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o inflate.o inflate.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o inftrees.o inftrees.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o trees.o trees.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o uncompr.o uncompr.c
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o zutil.o zutil.c
gcc -DASMV -Wall -c -o match.o match.S
ar rcs libz.a adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o match.o
windres --define GCC_WINDRES -o zlibrc.o win32/zlib1.rc
gcc -shared -Wl,--out-implib,libzdll.a -DASMV \
        -o zlib1.dll win32/zlib.def adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o match.o zlibrc.o
Creating library file: libzdll.a
strip zlib1.dll
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o example.o example.c
gcc -DASMV -o example.exe example.o libz.a
strip example.exe
gcc -DASMV -O3 -Wall -DNO_VIZ -c -o minigzip.o minigzip.c
gcc -DASMV -o minigzip.exe minigzip.o libz.a
strip minigzip.exe
gcc -DASMV -o example_d.exe example.o libzdll.a
strip example_d.exe
gcc -DASMV -o minigzip_d.exe minigzip.o libzdll.a
strip minigzip_d.exe

$ make test testdll -fwin32/Makefile.gcc
./example
zlib version 1.2.5 = 0x1250, compile flags = 0x255
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
echo hello world | ./minigzip | ./minigzip -d
hello world
./example_d
zlib version 1.2.5 = 0x1250, compile flags = 0x255
uncompress(): hello, hello!
gzread(): hello, hello!
gzgets() after gzseek:  hello!
inflate(): hello, hello!
large_inflate(): OK
after inflateSync(): hello, hello!
inflate with dictionary: hello, hello!
echo hello world | ./minigzip_d | ./minigzip_d -d
hello world

## Cygwin で
$ tar cvzf zlib-1.2.5-win32-x86-unofficial-uch.tar.gz \
> ./zlib-1.2.5/*.{exe,dll}
./zlib-1.2.5/example.exe
./zlib-1.2.5/example_d.exe
./zlib-1.2.5/minigzip.exe
./zlib-1.2.5/minigzip_d.exe
./zlib-1.2.5/zlib1.dll

いちおう置いてみます。オフィシャルの DLL が出たのに気づいたら消します。ダウンロード前に http://www.zlib.net/ をチェックしてみてください。

  • http://w4.hoso.net/files zlib-1.2.5-win32-x86-unofficial-uch.tar.gz

追記@Wed Aug 18 17:03:52 2010

オフィシャルの DLL がでています。

2010-04-18

libXpm, libjpeg, libpng

Windows の Emacs (NTEmacs) のイメージサポートに必要な DLL を作る。

現実逃避メモ。

libXpm

#
# XPM
#

$ cd ~/src/
$ wget http://alpha.gnu.org/gnu/emacs/pretest/windows/libxpm-3.5.7-w32-src.zip
$ unzip libxpm-3.5.7-w32-src.zip
$ cd libXpm-3.5.7/src

# MinGW で
$ make
$ cp -pf libXpm.dll /c/emacs/23/bin

# 後始末
$ rm -f *.{dll,o}

または、

$ wget http://ftp.gnu.org/pub/gnu/emacs/windows/libxpm-3.5.8-w32-src.zip
$ mkdir libXpm-3.5.8
$ cd libXpm-3.5.8
$ unzip ../libxpm-3.5.8-w32-src.zip
$ cd src
$ rm -f *.{dll,o}

# MinGW で
$ make

# 後始末
$ rm -f *.{dll,o}

この libxpm-3.5.8-w32-src.zip はたまたま置いてあるだけかも。バイナリもはいってるし。

libjpeg

#
# JPEG
#
# Independent JPEG Group
# http://www.ijg.org/
#

$ wget http://www.ijg.org/files/jpegsrc.v8a.tar.gz
$ tar xzf jpegsrc.v8a.tar.gz
$ cd jpeg-8a/

# MinGW で
$ ./configure CFLAGS="-O2 -mno-cygwin -march=native"
$ make
$ cp -pf .libs/libjpeg-8.dll /c/emacs/23/bin/libjpeg.dll

# 後始末
$ make distclean

zlib

オフィシャルバイナリありがたや。

#
# zlib
#
# zlib Home Site
# http://www.zlib.net/
#

$ wget http://zlib.net/zlib124-dll.zip
$ unzip zlib124-dll.zip
$ cp -pf zlib-1.2.4/zlib1.dll /cygdrive/c/emacs/23/bin

追記@Fri May 14 02:13:19 2010
その後やっぱり自分で作ってみた。

libpng

#
#PNG
#
# libpng Home Page
# http://www.libpng.org/pub/png/libpng.html
#
$ wget ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.4.1.tar.gz
$ tar xzf libpng-1.4.1.tar.gz
$ cd libpng-1.4.1
$ mkdir include
$ cp png.h pngconf.h include/

# MinGW で
$ cp scripts/makefile.mingw Makefile
$ make CFLAGS="-Ic:/Users/yu-ji/home/src/zlib-1.2.4"
$ cp -pf libpng14.dll /c/emacs/23/bin/libpng.dll

# 後始末
$ make clean

giflib

息抜きに…じゃ済まなさそうなので、またいずれ。

libtiff

#
# TIFF
#
# LibTIFF - TIFF Library and Utilities
# http://www.remotesensing.org/libtiff/

$ wget http://download.osgeo.org/libtiff/tiff-3.9.2.tar.gz
$ tar xzf tiff-3.9.2.tar.gz
$ cd tiff-3.9.2

# MinGW で
$ ./configure CFLAGS="-O2 -mno-cygwin -march=native" \
 --with-zlib-include-dir=c:/Users/yu-ji/home/src/zlib-1.2.4 \
 --with-zlib-lib-dir=c:/Users/yu-ji/home/src/zlib-1.2.4 \
 --with-jpeg-include-dir=c:/Users/yu-ji/home/src/jpeg-8a \
 --with-jpeg-lib-dir=c:/Users/yu-ji/home/src/jpeg-8a
$ make
# 途中でこけるけど
$ cp -pf libtiff/.libs/libtiff-3.dll /c/emacs/23/bin/libtiff.dll

# やっぱダメ

DLL できたけど、なんか変。なのでまたこんど。

configure.bat

emacs/nt/configure.bat

configure.bat --with-gcc --no-cygwin --no-debug --prefix=C:/emacs/23 \
 --cflags -Ic:/Users/yu-ji/home/src/libXpm-3.5.8/include \
 --cflags -Ic:/Users/yu-ji/home/src/libXpm-3.5.8/src \
 --cflags -Ic:/Users/yu-ji/home/src/jpeg-8a \
 --cflags -Ic:/Users/yu-ji/home/src/zlib-1.2.4 \
 --cflags -Ic:/Users/yu-ji/home/src/libpng-1.4.1/include \
 --without-gif --without-tiff

目的

後先ですが…、セキュリティ絡みの修正がでても更新されない gnuwin32 の DLL を卒業したいと思った。

さっと息抜きに済ませるはずが、giflib が手強くって、gnuwin32 からソース落として patch を眺めたところで諦めた。libtiff も時間のあるときに延期。

gnuwin32 が更新されたら何も心配しないで済むんですが…。

2010-02-26

各種スペルチェック用の辞書ファイルをくっつける

GNU Aspell と Firefox と TortoiseSVN のスペルチェック用ユーザ辞書をマージする Perl スクリプト。

ついでに NTEmacs の ddskk と skkime のユーザ辞書から abbrev モードで使う単語も抜き出してくっつけます。

Windows の ActivePerl 5.10.1 と Cygwin の Perl 5.10.1 で動くようにしてあります。

こんなの需要があるか分かりませんが、あのムカつく赤波アンダーラインが嫌いな人向けです。ファイルのバックアップとかしませんので必要なら手動でどぞ…。

2009-11-01

NTEmacs からうまいこと GnuPG を呼び出す patch

mew-dist にあった Kentaro KAWAMOTOさんの NTEmacs から Cygwin の GnuPG 1.4.9 を呼び出すのにうまいことする patch を、GnuPG 1.4.10 の util/ttyio.c にあたるように手を入れただけの patch です。1ヶ所 reject されたのを直しただけで、ほぼそのままです。

参考

余談

Cygwin 環境での configure とか make とか子プロセスぽこぽこ作るプロセスが NIS2010 の SONAR に刺さるのでいちいち鬱陶しいです…。現在配布が中止されている 17.1 の問題が解決されて配布が再開されれば、少しは SONAR が賢くなるらしいんだけど。

追記@Wed Oct 20 07:31:55 2010

GnuPG 1.4.11 に当たるように修正。

2009-08-01

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" あたりでぐぐってくだささい…。

2009-01-21

nkf 2.0.9

まだまだお世話になることの多い nkf、2.0.9 が出たそうな。

  • -Z4 オプションを追加しました。 JIS X 0208 カタカナを JIS X 0201 カタカナに変換します。(つまりカタカナの全角半角変換)
  • -g=0, -g=1, --guess=0, --guess=1 オプションを追加しました。改行コードの推測を行います。

man には -Z4 のことが書いてないですね…。改行コードの判別は、これまでもしていたけど、判別をしないオプションが追加されたってことでいいのかなぁ。

$ ~/src/nkf-2.0.8b/nkf --version
Network Kanji Filter Version 2.0.8 (2007-07-20)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa),2000 S. Kono, COW
Copyright (C) 2002-2007 Kono, Furukawa, Naruse, mastodon
$ nkf --version
Network Kanji Filter Version 2.0.9 (2009-01-20)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2009, The nkf Project.

ぼくは file, file2 と併わせて、以下のような bash のシェル関数で使っています。

file3()
{
    if [ "$1" ]; then
        file $1;
        file2 $1;
        nkf --guess $1;
    else
        echo usage: file3 FILE_NAME
    fi
}

一時期は別のあるテキストビューアの機能で文字エンコーディングなどを調べていたけど、file や nkf のほうがわりとどこにでもあるし使い勝手も良いので戻ってきました。

2008-07-20

UTF-8 Cygwin での .screen ファイル

メモ。

CygwinUTF-8 Cygwin と日本語化 PuTTY と CygTerm での .screen  ファイル。

escape ^z^z
vbell off
startup_message off
defscrollback 1000

defencoding UTF-8
encoding UTF-8 UTF-8

PuTTY の文字コード設定は UTF-8 とか UTF-8/Auto-Detect Japanese とか UTF-8 (CJK) とか。

2008-07-18

Mew で stunnel を使うときのイベントログ出力を抑制する

Mew version 6.1.50(cvs HEAD), NTEmacs 22.2.50(cvs EMACS_22_BASE), stunnel 4.25 (Cygwin) の環境で、Cygwin と stunnel によるイベントログ大放出を抑制してみる。

Index: mew-ssl.el
===================================================================
RCS file: /cvsmew/mew/mew-ssl.el,v
retrieving revision 1.54
diff -u -r1.54 mew-ssl.el
--- mew-ssl.el  5 May 2008 10:03:48 -0000       1.54
+++ mew-ssl.el  18 Jul 2008 05:41:44 -0000
@@ -101,6 +101,7 @@
       (insert (format "verify=%d\n" (mew-ssl-verify-level case)))
       (insert "foreground=yes\n")
       (insert "debug=debug\n")
+      (insert "syslog=no\n")
       (insert "CApath=" (expand-file-name (mew-ssl-cert-directory case)) "\n")
       (insert (format "[%d]\n" localport))
       (insert (format "accept=%s:%d\n" mew-ssl-localhost localport))

Cygwin の syslog は、syslog-ng がインストールされていなければ、Windows のイベントログへだだ流しになるようで。これまでイベントログ監視用のソフトウェアでフィルタしてたけど、生のログを見ながら作業するときには、あまりに量が多いのでうざくなってきた…。

Cygwin のサーバ類は使っていないし、これだけのために syslog-ng 入れるのもイヤなので、Mew 側で stunnel に syslog = no を渡すようにしてみた。Cygwin の syslog まわりで他にやり方がありそうな気もするけど。

Mew で stunnel が使われる様子をみるときには都度 z d か (setq mew-debug t) して *Mew debug* バッファをみる感じで。

追記@Tue Jul 22 18:55:10 2008
mew-ssl.el の revision 1.55 (Mew 6.1.50) で syslog=no を追加してもらえました。