Cygwinであそぼう

このページは、Windows上でCygwinを使って快適な環境を作ってみようというお話です。 やっていることとしては、他のOSを入れるよりよっぽど安全なのでWindowsを吹き飛ばす と困る人はこれでちょっとしたマルチOS気分を味わってみるのも一興ではないでしょうか。 他のOSと比べれば再インストールも楽だし。

他のOSを入れるよりは安全とありますが、だからといってこれのせいでWindowsが 動作不能に陥らない保証はありません。自己責任でお願いします。また、ある程度の unixの基礎的な知識が必要です。まあ多分いじったことがあれば大丈夫です。

もくじ
Cygwinの紹介
Cygwinをいれてみる。
Xを入れてみる。
ウィンドウマネージャを入れてみる。

それは何。

Cygwin というのは、 Cygnus という会社が作ったGNUツールのWin32環境への 移植ライブラリです。今はちなみにこの会社、あの RedHat に合併されたためリンク先もRedHatへの転送になってます。
さて、これがなんであるかというと、オフィシャルサイトの言葉を借りれば Cygwin is a UNIX environment, developed by Red Hat, for Windows. とのことです。つまり、RedHatが作っているWindows上でのUNIX環境です、ということですね。 その実体はunixのシステムコールをWindows向けに変換してWindowsに渡すDLLの形を取って います。なんとカーネルのラッパーですね。すごいことを考える人がいたもんです。 ソースも利用可能のようですが私の不勉強で読んでません。なので、実際どういうことを しているのかはわかりませんが、おそらくこのDLLを使うコンパイラはこのDLLを使うバイナリを 生成するということでしょう。コマンドプロンプト(command.com)からgrepとか普通に動くので 驚きです。

使ってみた感覚としては、GNUツール群というだけあってカーネルとその周りだけ入れた Linuxに近いです。Windows上で欲しい機能としてはまあ十分だしカスタマイズのしがいが あって面白いかもしれません。

インストールしてみる。

まず、 Cygwinのオフィシャルサイト に行って、インストーラであるところのsetup.exeをもらってきます。そしてWindows上で 実行するわけです。すると、いくつかのことを訊ねられるので答えてください。

ダウンロード先は適当なディレクトリでいいでしょう。contribとlatestという サブディレクトリが作られます。ルートディレクトリはデフォルトではc:\cygwinに なると思います。どこか好きな場所にするといいでしょう。専用にパーティションを切って 丸ごと使わせてもいいかもしれません。私はWindowsのパーティションをいくつかに切って いたので、作業用のパーティションにしているf:にf:\cygwinを作ってインストールしました。

ミラーサイトは近場ということで.jpのサイトを選んだ方がいいでしょう。どこから持って きても基本的には同じものだと思います。どのツールを入れるかというのはとりあえず そのままnextを押してしまっていいでしょう。すべて必要なものが入るはずです。 ダウンロードを開始するとコンパイル済みのバイナリがtarballでたくさん落ちてきます。 すべてダウンロードが終わると今度は展開され、先ほど指定したディレクトリにどんどん 詰め込まれていきます。最後にデスクトップやらスタートメニューやらにアイコンができて できあがりです。他のunix系のOSと比べてとても簡単ですね。当たり前かもしれませんが。

とりあえず使ってみる

せっかくインストールしたので使ってみましょう。出てきたアイコンは何かというと、 bashがログインシェルで立ち上がります。ログインシェルにするとウィンドウを作って 立ち上がるようです。こんなプロンプトが出たはずです。

/home/username
$

ほとんど普通にbashとして使えます。パスも通ってます。試しに/bin/lsなどを起動して みてください。ごく普通の挙動を示します。ちなみに、Windowsの環境変数のPATHも 引き継ぐので、Windowsのコマンドも使えます。ただし、予期しない動作をした場合 whichでちゃんとどれが実行されてるのか確認しましょう。コマンド名が かぶっている場合はちゃんとunixばりにpathによって優先づけられます。 他にもいろいろやってみましょう。ファイルを探す場合findを使うと構造上効率が 悪いので、Windowsの検索機能を使った方が速いです。またはlocateを入れるという手も ありますが。どこかで8ビットが通らないらしく日本語入力はちょっと厳しいです。 まだ研究の余地があります。まあシェルスクリプトでも書いてみましょう。

for file in `ls /etc` ; do
if [ -f /etc/$file ] ; then
cat $file >>log.txt
head /etc/$file >>log.txt
fi
done

特に意味はありませんが/etcにある設定ファイルの頭が出てきます。また、カーソルキーの 上下でコマンドヒストリもたどれます。うれしいですね。タブを2〜3発たたくとコマンド 補完もしてくれます。Ctl+DでEOFでも送ってあげるとウィンドウが消えて終了します。 といった風に、この状態でターミナルのように使えるわけです。

といってもあんまりこれだけでは有り難みがありません。Windowsに入れたんだからWindowsの ファイルやディレクトリも覗けたらいいですね。といってもルートディレクトリからcd ..と やっても上にはあがれません。特殊なディレクトリを使います。

$ cd /cygdrive/c/

とやってやるとWindowsでいうところのC:\に行けます。その他のドライブレターに ついても同様です。ただし、このディレクトリは特殊なので/cygdrive/という ディレクトリはコマンド補完に引っかからないようです。ので、/cygdrive/まで 入力してから補完させましょう。

perlなんかもついているので、いろいろスクリプトを書いて遊べます。まあWindowsにも ActivePerl というありがたいものがあるんですが高機能シェルがありがたいところです。vimもついてます。 emacsはないです。自分でビルドしましょう。ただ、このままだと8ビットは通らないようです。 vimに日本語を入力しようとしても化けます。入力自体はできるんですが、コードをFEPから もらった瞬間に化けるみたいです。もうちょっと研究してみます。.inputrcあたりでもしかして 解決できるかもしれないし。

カスタマイズする。

私はbashはシェルスクリプトくらいにしか使わないので普段tcshを使ってます。 当然ログインシェルもtcshにしたいところです。cygwinはWindows上で動くくらいなので マルチユーザじゃありません。同時にログインできるのは一人です。また、許可属性なども 不完全なようです。Windows側で許されていれば読み書きの制限は引っかからなかったり するようです(未検証)。さて、そういうわけでvipwもありません。chpassもchshもusermodも 何もありません。というわけでviで/etc/passwdを書き換えてしまいたいくらいです。 ところが、ここは起動時に参照されません。ここを参照するのはこのシェルから呼ばれる プログラムなので、konとかxtermがあればtcshにしてくれるでしょうがログインシェルは 変更できないです。

アイコンのリンク先を見てやるとただのバッチファイルです。内容はこんな感じです。

@echo off
f:
chdir f:\cygwin\bin

bash --login -i

ちょっと違うかもしれません。でも、これを見たらbashしか起動してくれないのも当然です。 というわけで私はこんな風に書き換えました。

@echo off
f:
chdir f:\cygwin\bin

set HOME = /home/sao

tcsh -l

DOSのバッチファイルなので環境変数はsetです。ややこしいですね。
ただし、このままだと何も設定を読み込んでくれません。/etc/profileは見に行かないみたいです。 よって.cshrcか.tcshrcを作ってしまいましょう。私の.tcshrcは こんな 感じです。

Emacsなどのアプリケーションを入れることももちろんできます。GNUツール群を移植と言うだけ あって、軽くautoconf,automake対応です。ライブラリも結構そろっているので大概のものは入って しまいます。やってみましょう。

Xいれてみる。

いきなりですが、なんと X までちゃんと動いてしまいます。VMwareとかと比べればそりゃあ見劣り しますが、Windowsの1プロセスとしてX windowが動いてしまうというのはなかなか壮観です。 暇なら是非お試しください。

Xをビルドする

というわけで、まずはXを持ってきます。当然 XFree86 です。Cygwin用にバイナリまであるんですが、私はさらなる目標のためにソースからビルドすることに しました。よってソースを一通り持ってきます。さしあたり/tmpあたりに展開しました。バージョンは 4.2.0です。バイナリはまだないかもしれません。展開すると300MB近くなります。でかいですね。

注意:時間がもったいない、そんなに凝ったことをする予定がないという人はソースからビルドなんて しないでバイナリからインストールした方が楽で速いです。確実だし。下の方に一応解説しました。

#ソースの展開

% tar -xzvf X420src-1.tgz
% tar -xzvf X420src-2.tgz
% tar -xzvf X420src-3.tgz

#fixesにあったファイル

% tar -xzvf 4.2.0.tgz

#patchesにあったファイル

% patch -p0 < 4.2.0-libGLU-bad-extern.patch
% patch -p0 < 4.2.0-xlib-i18n-module.patch

ほんとはここでmake Worldすればいいんですが、ちょっとIPCを有効にしたいので 寄り道です。 CygUtils というサイトはありがたいことにCygwinで動くipcデーモンを配布してくれています。というわけで ここからCygIPCのパッケージをもらってきて展開します。詳しくはREADMEに書いてありますが

% cd /
% tar -xjvf cygipc-1.11-1.tar.bz2
% rehash
% ipc-daemon --install-as-service

とやるとWindows2000ではサービスとして追加されます。次に、これを使ってIPC,SHMを有効に するためにXのconfigファイルを少しだけいじります。いじるのはxc/config/cf/host.defファイル です。こいつは存在しないはずなので作ってください。BUILDにはxf86site.defをコピーしろと ありますが、そこにはCygIPCのオプションはないので自分でつけなければいけません。 こんな行を加えます:

#define UseCygIPC YES
#define InstallJapaneseDocs YES

こいつはホストに特有の設定をするためのファイルで、同じディレクトリのsite.defの最後に includeされています。このオプションを定義するとXはCygIPCを使ってSHMを有効にして ビルドされるはずです。他にもxf86site.defを参考にしていろいろオプションを設定するといい でしょう。InstallJapaneseDocsはおまけです。というわけで

% cd /tmp/xc
% make World >& world.log &

なにせWindows上でコンパイルするので、普通のunix上で同じことをする場合と比べて数倍 時間がかかります。なんでbg動作させているかというと、ここでtail -f world.logとか やると進行状況を覗けるからです。最近のimakeはもう環境を自動判別してMakefileを生成して くれるんで何もすることがないです。まあ見ていましょう。というか、外で食事して来る 位の時間が軽くかかると思うので気長に待ってあげてください。

コンパイルが終わったら、とりあえずエラーがなかったかログを見てみましょう。ないよう でしたらインストールに入れます。これまた長くかかりますが。

% make install >& install.log &
% make install.man >& man.log &

しばらくすると終わりますのでおめでとうございます。

Xをバイナリで入れる。

閑話休題。もっと手っ取り早い方法を紹介します。バイナリが落ちてるのでもらってきましょう。 これはFTPサーバのbinariesというサブディレクトリに落ちています。全部持ってくるのがいい でしょう。これも/tmpに適当なディレクトリでも作って放り込みます。あとは

% cd /tmp/xbin
% sh ./install

これだけです。一瞬ですね。あとは質問[Y/N]に答えるだけです。上で紹介したことのうち SHM関連を除いたものができます。特に拡張しないならソースからビルドなんてしないで バイナリで入れた方が速いです。すごく。

Xを動かしてみる。

さて、それではprofileなり~/.*shrcなりに/usr/X11R6/binをパスに追加するよう記述 したらもうXを起動することができます。ディスプレイなどの設定は全くもっていりません。 ただおもむろにコマンドラインから

% startx

とするだけでもうそこはXの世界。twmが立ち上がっています。例によってXTermが3つと xclockが起動するわけです。ちなみに、上の方にも書きましたがこのときのシェルは /etc/passwdに記述されているものが使われます。

バイナリでインストールした場合、startxwin.batというスクリプトから起動する ように注意されます。私はバイナリでインストールした時もstartxを使っていましたが 安全を期するならやめておいた方がいいかもしれません。

さて、しかしこのとき起動するウィンドウはWindowsのデスクトップ一杯なはずです。 これではWindowsと共存させる意味も小さいというものです。まずはこの大きさを 変えるところから始めましょう。

このウィンドウの大きさは起動オプションで変えられます。つまりXサーバに渡す 引数を変えてやればいいわけです。ここでインストールされているサーバの名前は XFree86ではなくてXWinといいます。~/.xserverrcに以下のように書いて やればうまくいくと思います。

XWin :0 -screen 0 1024x768x24

最初の引数は起動するディスプレイです。-screenオプションにはディスプレイ 番号と画面の広さ、色数を書いてやります。これを保存してXを起動し直すと 1024x768の画面が現れます。

また、最初にでてくるターミナルや時計が鬱陶しいという人はとりあえず /etc/X11/xinit/xinitrcを~/.xinitrcにコピーして編集しましょう。 最後の方にある行を、

twm &
xclock -geometry 50x50-1+1 &
xterm -geometry 80x50+494+5 &
xterm -geometry 80x20+494-0 &
exec xterm -geometry 80x66+0+0 -name login



exec twm

このようにしてしまえば何も現れなくなります。それはそれで寂しいですが・・・

ウィンドウマネージャを入れる

まあ実際最近のWindowsなんてものを見慣れていると、懐かしのtwmとはいえ少々 物足りなく思えてくるものです。というわけで何かウィンドウマネージャを ビルドしてみましょう。

WindowMaker

メジャー路線ということでWindowMakerです。バイト先の会社のマシンではこれを 使ってます。これのいいところは、ほとんどライブラリを要求しないところでしょうか。

わずかこれだけで動きます。ということで、libPropListを持ってきます。

Now in construction!

Enlightenment

さて、いよいよここからが実は本題です。なぜにSHMなどを有効にしてわざわざ make Worldをしなくてはならなかったのか?知る人ぞ知る、Enlightenmentウィンドウ マネージャはこれがないとビルドできないんです。以前一度動いたのを確認しているので 今回も頑張ればインストールできると思います。とりあえずの目標はETermを動かすことです。 ちなみに、以前ビルドに成功した時は非常に重く感じました。もはや趣味の領域です。 また、Translucentでウィンドウを動かそうとしてもOpaqueになってしまいました。 以上のことをご理解いただけて、私の途方もない(記録もない)暇つぶしの再現に お付き合いいただける方だけお読みください。おそらく不毛です。あまりにも。

GTK+

とりあえず色々と前提条件があります。まずはImLibを入れたいところなので、 GTK+ (The GIMP ToolKit) とGLibを持ってきます。まずこの二つをインストールしました。

% tar -xzvf glib-1.2.10-tar.gz
% cd glib-1.2.10-tar.gz
% ./configure
% make

いやあautoconf,automakeってありがたいですね。
・・・と思ったら怒られました。なんか、g_strfuncs.cでstrsignalのexternが違ってるという 感じのエラーです。ソースを確認してみると

/usr/include/string.h line 70:
const char *_EXFUN(strsignal, (int __signo));
glib-1.2.10/gstrfuncs.c line 704:
#ifdef HAVE_STRSIGNAL
 extern char *strsignal (int sig);

これじゃだめですね。まあシステムを修正するよりは・・・ということでglibのソースの方を いじりました。

extern const char *strsignal (int sig);

一応make checkをやってみてからmake installです。suはいりません。これでめでたく

% make check
...
===================
All 11 tests passed
===================
% make install
% rehash
% glib-config --version
1.2.10

ということで入りました。次はGTK+です。全体にunixネイティブと比べてえらくビルドが 遅いですがWindows上なのであきらめてください。

% tar -xzvf gtk+-1.2.10.tar.gz
% cd gtk+-1.2.10
% ./configure --with-locale=ja_JP.sjis
% make && make install
% rehash
% gtk-config --version
1.2.10

Zlib

次は Zlib です。gzipをいじる奴ですね。

% tar -xzvf zlib.tar.gz
% cd zlib-1.1.3
% ./configure
% make test
% make install

libTIFF

ImLibの前提にあるので入れます。 TIFF 画像がいじれるようです。

% tar -xzvf tiff-v3.5.7.tar.gz
% ./configure
% make

今度はmake installがうまくいきません。なんか//usr/local/bin/とかいうパスに 必死で書き込もうとしています。ありません。よーく見ると、悪さをしているのは port/install.shスクリプトにこんな風に定義されてるからのようでした。

t = "$ROOT/$DESTDIR/$f"

どうやらこれのせいです。Makefileも含めて丸ごと解析する気はないので何とも 言えませんが、DESTDIRに/usr/local/*でも入ってるんでしょうか。これをどう直すかは 責任持てないのでお任せします。私は${ROOT}${DESTDIR}/$fのように修正したら 正常にインストールされました。

libPNG

GIFに代わってスタンダードとなりつつある PNG のライブラリです。これもImLibに必要です。

% tar -xzvf libpng-1.2.1.tar.gz
% cd libpng-1.2.1
% cp scripts/makefile.cygwin ./Makefile
% make
% make test
% make install

make installとするとエラーがでました。何かというと、実はCygwinはWindowsに 載っているため、内部で引数の大文字と小文字を混乱することがあるようなのです。 つまり、このディレクトリにあるINSTALLというドキュメントをインストールしようと しているのに、INSTALLをMakefileだと思って操作してしまうのです。というわけで viでMakefileを開いて

DOCS = ANNOUNCE CHANGES INSTALL ....

この行を下のように

DOCS = ANNOUNCE CHANGES _INSTALL ....

書き換えてしまいます。ついでにINSTALLを同じように_INSTALLとリネームしてやります。 ここで再びmake installとすると正常にインストールされました。迷惑な仕様ですね。

libJPEG

ImLibに必要なのはこれで全部のようです。 ここ にあります。これもダウンロードしてきてインストールします。

% tar -xzvf jpegsrc.v6b.tar.gz
% cd jpeg-6b
% ./configure
% make && make test
% make install

これは簡単にインストールが終了しました。

libunGIF

Unisysのライセンスに引っかからずに使えるGIFライブラリらしいです。LZW圧縮を 使っていないとのこと。オプションですが一応入れました。

% tar -xzvf libungif-4.1.0.tar.gz
% cd libungif-4.1.0
% ./configure
% make

入りません。util/ディレクトリで引っかかります。なんか、gif2epsnのコードで undefined referenceというのがいくつか出てきます。ライブラリもちゃんと 設定されているはずなんですが・・・

ImLib

ようやくこれが入れられます。 Enlightenmentのサイト から入手できます。 (2002/3/4補足)DLできなくなってました。 ここで見つけました。

% tar -xzvf imlib-1.9.10.tar.gz
% cd imlib-1.9.10
% ./configure
% make
% make install

% rehash
% imlib-config --version
1.9.10

何事もなくインストールできました。

Fnlib

Enlightenmentのサイト から入手できます。

% tar -xzvf fnlib-0.5.tar.gz
% cd fnlib-0.5
% ./configure
% make
% make install

何事もなくインストールできました。

Freetype

Freetype は、フォントをいじるライブラリですね。XにFreetype2が入っているよう ですが、ライブラリの構成が違うようで面倒なので入れてしまいます。

% tar -xzvf imlib-1.9.10.tar.gz
% cd
% ./configure
% make
% make install

make installとやるとmake: `install' is up to date.と出て進みません。 先の例のようにmv INSTALL _INSTALLとやると、正常にインストールが 行われるようです。

libghttp

なんだかあった方がいいらしいです。

% tar -xzvf imlib-1.9.10.tar.gz
% cd
% ./configure
% make
% make install

普通にインストールできました。

Enlightenment

というわけで、ついに本体までたどり着きました。以前やった時はここからが正念場だった 気がするので、気合いを入れていってみましょう。
Enlightenmentのサイト から入手できます。けっこうでかいです。
もうE17も入手できるんですが、まだリリースされていない不安定版をCygwinで ビルドする気にはさすがになれないのでリリース版の0.16.5を入れてみることに します。

% tar -xzvf enlightenment-0.16.5.tar.gz
% cd enlightenment-0.16.5
% ./configure
% make

なんか、エラーが出ます。内容は undefined reference to `gettext'というのが たくさんです。最後のリンクで問題があるようです。というわけで、-lintlを src/Makefileに足してあげました。IMLIB_LIBSにたくさん-lが指定してあったので ついでに割り込ませてもらいました。トップディレクトリのMakefileをいじっても 意味ないです。

IMLIB_LIBS = -L/usr/local/lib -lImlib -ljpeg -ltiff -lpng -lz -lm -lXext -L/usr/X11R6/lib -lSM -lICE -lXext -lX11 -lintl

これでもう一度makeとすると通りました。うれしいです。では

% make check
% make install

どうやらインストールできました。というわけで~/.xinitrcを書き換えます。

exec /usr/local/enlightenment/bin/enlightenment

これでstartxとやるとめでたくEnlightenmentが立ち上がります。 お疲れさまでした。せっかくなんで二つくらいスクリーンショットを 取ってみました。 これ(27.8kB) これ(23.0kB) です。

ETerm

これ は、かっこいいKTermとして使えます。後ろの壁紙が透けて見えたりもするし、 色々と楽しいのでぜひ欲しいところです。

Imlib2

これがいるらしいので入れます。ここまでのEnlightenmentを入れる作業で 前提条件はクリアしてるみたいです。

% tar -xzvf imlib2-1.0.5.tar.gz
% cd imlib2-1.0.5.tar.gz
% ./configure
% make
% make install

% rehash
% imlib2-config --version
1.0.5

ということで入りました。

libast

ここ で手に入りました。見たところではどうやら文字列をいじるライブラリのようです。

% tar -xzvf libast-0.4.tar.gz
% cd libast-0.4
% ./configure
% make && make install

インストールされました。

Eterm

ということで本物を入れてみます。

% tar -xzvf Eterm-0.9.1.tar.gz
% cd Eterm-0.9.1
% ./configure
% make

なんかエラーがでました。XmuInternAtomがないそうです。・・・LDFLAGがおかしいのか? src/Makefileの中を少しいじりました。

LIBS = -last -lImlib2 -lttf -lSM -lICE -lXext -lX11 -lm
LIBS = -last -lImlib2 -lttf -lSM -lICE -lXext -lX11 -lm -lXmu

で、再びmake・・・今のエラーは消えましたが次はsetreuid,setregidがないと言われます。 system.cの中のsystem_waitとsystem_no_waitという関数で呼ばれてるようです。何を やってるのか見てみると、system()とほぼ同様の動作です。つまり、 fork()してできた子プロセスにコマンドをexeclであげてるだけです。no_waitの方は 子プロセスの終了を待ちません。で、このとき子プロセスの uidとgidをセットしているんですが、あいにくCygwinではそんなものほとんど関係ない はずなのでこれをコメントしてしまいます。そしてmake・・・

次はXtMallocというのがないと言われました。なるほど、-lXtが入ってません。 入れてあげましょう。

LIBS = -last -lImlib2 -lttf -lSM -lICE -lXext -lX11 -lm -lXmu
LIBS = -last -lImlib2 -lttf -lSM -lICE -lXext -lX11 -lm -lXmu -lXt

・・・えらいたくさんエラーがでました。なんでしょう。Sm***とかIce***とか ばっかりですね。・・・-lSMと-lICEは入ってるんですけど。・・・ なるほど、入れる位置が違いました。馬鹿ですね。-lSMと-lICEの前に入れるべき なのでは・・・

LIBS = -last -lImlib2 -lttf -lSM -lICE -lXext -lX11 -lm -lXmu
LIBS = -last -lImlib2 -lttf -lXt -lSM -lICE -lXext -lX11 -lm -lXmu

今度こそmakeが通りました。

% make install
% rehash
% eterm &
(もちろんX上で)

これでEtermが起動するはずです。すばらしい。なお、Windowsは大文字と 小文字を識別する能力がないのでEtermではなくetermで起動します。 Enlightenmentのメニューから起動できない場合、自分でEtermをeterm に直してやりましょう。

Eterm-Background

このままだと背景画像があんまりないのでこれも入れます。Etermと 同じところにあります。

% tar -xzvf Eterm-bg-0.9.1.tar.gz
% cd bg
% cp scale/* /usr/local/share/Eterm/pix/scale/
% cp tile/* /usr/local/share/Eterm/pix/tile/
% cd /usr/loca/share/Eterm/pix/
% Etbg_update_list

これで大丈夫なはずです。

Now in construction!


Top