![]() |
Cygwin1.x環境 |
Windows OS上にUNIX環境を構築(エミュレート)するソフトウェア群がCygwinです。
Cygwinを使う理由にはいろいろあります。
UNIXは、コマンド環境(俗にCUI:Character-based User Interface)が非常に洗練されています。これがWindows OS上で、コマンド環境を使用するとあまりの貧弱さに苛立ち、ストレスを覚えます。そこで、Windows OS上でもUNIXのような快適なコマンドライン環境を使用するために、Cygwinを利用できます。
UNIX(特にLinux)ではさまざまなツールがオープンソースで公開され利用できます。UNIXの思想で、単機能コマンドを組み合わせて強力な機能を柔軟に組み立てるということが容易に行えます。こうしたツール群を利用できるととても快適になります。Windows OS上でもUNIXのツール群を揃えているCygwinを利用できます。
UNIXでは、GCCを用いたC/C++(Java/Fortran他)のプログラム開発ができます。Cygwinでは、GCCを始め各種開発ツール、またUNIX系のAPIも提供しているので、UNIX環境と同等のプログラム開発が行えます。gdb, automake, 各種スクリプト言語などもあります。
UNIXでは、GUI環境としてX Window Systemが使われます。X Window SystemをWindows上でもCygwinで動かすことができます。
Cygwinは、GNUライセンスにしたがってフリーで入手できます。非常に多くのパッケージから構成され、インストール時には必要なパッケージを選んでインストールすることになります。また、アップデートもネットワーク経由で簡単にできます。このインストールおよびアップデートには、Cygwinのsetup.exeを使います。setup.exeを含めてCygwinの各パッケージは頻繁にバージョンアップしています。setup.exeは、下記からダウンロードします。
Cygwinホームページ(http://sources.redhat.com/cygwin/)
まずsetup.exeをダウンロードします。2002.3.21現在setup.exeのバージョンは2.457.2.2となっています。ダウンロードしたsetup.exeを、適切なアーカイブ場所に保存します。インターネットに太い回線でつながっているなら別ですが、細い不安定な回線でしか接続できないときは、いったんCygwinのパッケージをローカルに保存しておく方がよいでしょう。仮にE:\archives\gnu\cygwin以下にアーカイブするならば、setup.exeをE:\archives\gnu\cygwin\setup.exeに保存します。
ダウンロードしたら、setup.exeを実行します。(注:このとき、Cygwinのアプリはすべて終了させておきます)

インストールには、ダウンロード、ネットワークから直接インストール、ローカルに保存しているアーカイブからのインストールが選べます。常時接続している環境ならば直接インストールが、ダイアルアップ環境等ではいったんダウンロードしてから、ローカルからインストールするのがよいでしょう。

Installを選んだ場合、インストール先ディレクトリとインストールオプションを設定するダイアログウィンドウが表れます。
Root Directoryでは、Cygwinをインストールするディレクトリを指定します。
Install Forでは、インストールした時にスタート・メニュー、デスクトップ、マウントテーブルを作成する対象ユーザを選びます。All
Usersにすると、そのマシンの他のユーザにも反映され、Just
Meにすると、インストールを実行したユーザの環境にだけ反映されます。
Default Text File TypeではUnixにしておきます。これは、テキストファイルを読み書きするときに、改行コードを変換するかしないかを指定します。Cygwinでは主としてUNIX形式のファイルを扱うことが多いので、Unixにしておいた方が無難です。

まずCygwinの各パッケージをダウンロードするアーカイブ場所を指定します。先ほどE:\archives\cygwin以下に置くことにしたので、これを指定します。

注)ディレクトリを先に作成しておかないとエラーが出るので、あらかじめディレクトリを作成しておきます。
ダウンロードするサーバへの接続方法を指定します。途中ファイヤーウォール等介してなければ直接接続(Direct Connection)とします。IE5の接続情報を参照できるので、もしIEでインターネットへ接続できているならば、Use IE5 Settingを選べばよいでしょう。Proxyを指定することもできます。

Cygwinのミラーサイト一覧を取り寄せ、Cygwin各パッケージをダウンロードするFTPサーバ一覧を表示します。
ミラーサイト一覧を取り込み終わると、ダウンロードサイト一覧が表示されるので、好きなところ(ネットワーク的に近くて太いところ、tracertコマンド等で調べるとよいでしょう)を選択します。

僕の環境ではtracertコマンドで最寄りのサイトがどれか調べたところasahi-netかso-netが割と近かったので、ftp://ring.so-net.ne.jpを選んでみました。
サイトを選択して[次へ(N)]を押すと、setup.iniファイルを取り込みます。このファイルには、Cygwinのパッケージ構成情報が記載されており、随時更新されています。
インストーラは取り込んだsetup.iniに記載されている構成情報からダウンロードするパッケージのバージョン、ファイル名等をチェックしています。既にCygwinをインストール済みの場合も、バージョンアップ有無をチェックします。
注)この画面は、setup.exeのバージョンが上がっていく際に頻繁に変更されています。

カテゴリ単位にインストールするか否かを選択することができます。Defaultは、カテゴリによってSkipかインストールかが決まっています。Defaultの個所をクリックすると、(Install)-(Reinstall)-(Uninstall)-(Default)と順次切り替えることができます。
Current欄には、既にインストールしているパッケージがあればそのバージョン番号が表示されます。新規の場合は空欄になっています。
Newは、構成情報に書かれている新しいバージョンです。
また、新しいバージョンには正規リリースと実験的リリースの2種類あり、どちらかを選べるようになっています。画面上部の[Curr]を押せば正規リリース版に、[Exp]ボタンを押せば、実験リリース版になります。
詳細はカテゴリのツリーを展開して見ることができます。

カテゴリ単位ではなく、詳細に見たい場合は、[View]ボタンを押します。パッケージ順にソートされた一覧を見ることができます。パッケージ単位にインストールするかしないかを指定することができます。

カテゴリ一覧を次の表に示します。
| カテゴリ名 | Default | 主な内容 | |
|---|---|---|---|
| Archive | Skip | sharutils,unzip,zip,lha | |
| Base | Install | ash,base-files,base-passwdbash,bash,cygwin,diffutils,fileutils,findutils,gawk,gdbm,grep,gzip,libncurses*,libreadline*,login,ncurses,readline,sed,sh-utils,tar,termcap,terminfo,textutils,which,zlib | |
| Database | Skip | db2,db3.1,libdb2*,libdb3*,postgresql | |
| Devel | libintl,libintl1だけInstall | autoconf*,automake*,binutils,bison,byacc,ccache,compface,ctags,cvs,dejagnu,dpkg,expat,flex,gcc*,gdb,gettext*,gperf,guile-devel,indent,libiconv,libtool*,libxml2,libxslt,make,mingw-runtime,mktemp,openssl-devel,pkgconfig,rcs,swig,tetex-devel | |
| Doc | Skip | cygwin-doc,expat,guile-doc,libxml2,libxslt,man,newlib-man,perl-manpages,pinfo,tetex-doc,texinfo | |
| Editors | Skip | ed,emacs*,mc,nano,vim | |
| Games | Skip | cgoban,fortune,gnugo,robots | |
| Graphics | Skip | ghostscript*,jbigkit,jpeg,libpng*,opengl,tiff,xpm-nox | |
| Interpreters | GawkだけInstall | expat,expect,gawk,guilde,libxml2,libxslt,m4,perl,python | |
| Libs | libintl1,ncurses関連,,pcre,termcap,zlipだけInstall | compface,crypt,curl,expect,gettext,gsl,guile-devel,jbigkit,jpe,libbz2*,libcharset1,libguile14,libiconv*,libintl*,libkpathsea3,libttd3,libncurses*,libpng*,libpopt0,libungif,libxml2,libxslt,mingw-runtime,ncurses,opengl,openssl*,pcore,popt,regex,tcltk,termcap,tetex-devel,tiff,ucl,w32api,xpm-nox,zlib | |
| Skip | compface,fetchmail,mutt,pine,procmail,ssmtp | ||
| Math | Skip | bc | |
| Net | Skip | apache,inetutils,irc,mod_auth_mysql,mod_auth_ntsec,mod_dav,mod_php4,mod_ssl,ncftp,openssh,openssl,rsync,setup,tcp_wrappers,ttcp,whois | |
| Publishing | Skip | libpathsea3,tetex-* | |
| Shells | ash,bash,sh-utilsだけInstall | ash,bash,mc,rxvt,sh-utils,tcsh,zsh | |
| System | Skip | setup | |
| Text | Skip | enscript,expat,figlet,groff,less,libpathsea3,libxml2,libxslt,more,tetex*,texinfo,texmf*,tidy | |
| Utils | Skip | bc,bzip2,clear,compface,cpio,cygutils,file,gnupg,keychain,mc,mt,patch,setup,time,utils,upx | |
| Web | Skip | apache,curl,links,lynx,mod_auth_mysql,mod_auth_ntsec,mod_dav,mod_php4,mod_ssl,squid,tidy,wget | |
| XFree86 | Skip | cgoban,fvwm,lesstif,libPropList,openbox,WindowMaker,x2x,Xaw3d,XFree86-* |
指定したパッケージを順次ダウンロードしていきます。ダウンロード中は図のように進捗バーが各パッケージごとに表示されます。

これが表示されると、ダウンロードの終了です。
もし、不幸にも途中でダウンロードが中断してしまった場合でも、再度setu.exeを起動すれば、途中から再開してくれます。そのときは、パッケージ一覧には、既にインストール(ダウンロード)したパッケージは表示されません。
ローカルにダウンロードしたパッケージをインストールするときは、再度setup.exeを実行します。

setup.exeを実行すると、パッケージ構成情報を取得してバージョンアップされたパッケージがあれば、パッケージ一覧に表示されます。ローカルにダウンロードするなりインストールするなりしていきます。
また、seutp.exe自体もバージョンアップされるので、ときどきsetup.exeも入手し直します。
インストールが成功すると、デスクトップにCygwinのショートカットが出来ており、スタートメニューにもCygnusが出来ているはずです。Cygwinを実行すると、コンソール窓が開きます。

マウント設定はインストールしたユーザ(上記の場合Administrator)だけ有効な設定なので、全ユーザで有効にするため、-sオプ ションを追加してmountし直します。
また、テンポラリディレクトリとユーザのホームディレクトリへのマウントを追加します。ここでは、テンポラリディレクトリをE:\tmp、ユーザのホームディレクトリが置かれるディレクトリをE:\homeとした場合の実行の様子です。
$mount Device Directory Type Flags E:\cygwin\bin /usr/bin user binmode E:\cygwin\lib /usr/lib user binmode E:\cygwin / user binmode $mount -s -b E:\cygwin / $mount -s -b E:\cygwin\bin /usr/bin mount: warning - /usr/bin does not exist. $mount -s -b E:\cygwin\lib /usr/lib mount: warning - /usr/lib does not exist. $mount -b -s E:\tmp /tmp $mount -s -b E:\home /home mount: warning - /home does not exist. $mount Device Directory Type Flags E:\cygwin\bin /usr/bin system binmode E:\cygwin\bin /usr/bin user binmode E:\cygwin\lib /usr/lib system binmode E:\cygwin\lib /usr/lib user binmode E:\cygwin / system binmode E:\cygwin / user binmode E:\home /home system binmode E:\tmp /tmp system binmode $umount --remove-user-mounts $mount Device Directory Type Flags E:\cygwin\bin /usr/bin system binmode E:\cygwin\lib /usr/lib system binmode E:\cygwin / system binmode E:\home /home system binmode E:\tmp /tmp system binmode |
先に/, /usr/bin, /usr/lib をumountしないのは、それらをumountした直後からコマンドが実行できなくなってしまうからです。
bashは起動時にホームディレクトリ上にある設定ファイル(.bashrc)を読み込んで環境設定を行います[*1]。ホームディレクトリのパスは、Windowsの環境変数HOMEを参照するので、あらかじめ環境変数HOMEにホームディレクトリとしたいパスを指定しておきます。WindowsNTならコントロールパネルのシステム→環境でユーザー環境変数欄に追加します。Windows95/98ならAUTOEXEC.BATに指定します。
[*1]bashには、ログインシェルとして起動されたか否かによって、読み込む設定ファイルが異なる。ログインシェルの場合は、次のとおり。
/etc/profileを読み込み実行
~/.bash_profile
~/.bash_login
~/.profile
の順にファイルを探し、最初に見つかったファイルを読み込んで実行する。すなわち、~/.bash_profileが見つかればこれを実行し、以降のファイルは探さない。
.bashrcの例
.bash_aliasesの例
".bashrc"をメモ帳などのWindows用編集ツールで記述した場合、改行コードの問題でエラーが生じる。理由は、.bashrcの改行コードがメモ帳で編集したためDOS改行コード(CR+LF)であるのに対してbashがDOS改行コードを正しく処理できていないため。対策は以下の2案:
あるべき姿は、(2)でMeadowを使用することとする。ただし現時点ではまだMeadowをインストールしていないので、暫定処置として(1)とする。ただし、(1)はシステム全体を変更するのではなく、ユーザ環境だけ設定する。
mount e:/home /home
Cygwin1.1では、システムのmount設定とユーザのmount設定が重なった場合、ユーザのmount設定が優先されるらしい。
2000年12月22日時点で、CygwinにPerlパッケージが追加されました。Perl-5.6.1-1がcontribに加わっています。/usr/bin/perlがパスになるので、もし/usr/local/bin/perlを指定するスクリプトがあるのならば修正する。(シンボリックリンクだけで逃げられるかは不明)
Obsoluted
次のサイトでCygwin1.1用のPerlが公開されています。バイナリ版をダウンロードし、cygwinの/ディレクトリで解凍・展開すればOk.現在は、Perl-5.6.0が公開されています。
Cygwin1.1には標準で(インストールしていれば)gcc-2.95.2があります。gccで作成した実行ファイル(exe)は、実行時にCygwin1.dllを必要とします。しかし、Cygwin1.dllを必要とせずに、WindowsOS上でそのまま実行できる形式を作成することもできます。これをmingw32というそうです。
$ls hello.c $gcc -o hello -mno-cygwin hello.c $ls hello.c hello.exe |
しかし、残念ながらこれはCコンパイラだけ有効で、C++/FORTRAN/Objective-Cをコンパイルして実行形式を生成するときにはリンクエラーが発生してしまいます。これは、Cygwinのgccパッケージには、mingw32のランタイムライブラリがC用のものしか提供されていないからです。
$c++ -o hello -mno-cygwin hello.cpp /usr/lib/libstdc++.a(iostream.o)(.text+0x154):iostream.cc: undefined reference t o `_imp___ctype_' /usr/lib/libstdc++.a(iostream.o)(.text+0x521):iostream.cc: undefined reference t o `_imp___ctype_' /usr/lib/libstdc++.a(iostream.o)(.text+0x17c7):iostream.cc: undefined reference to `_impure_ptr' /usr/lib/libstdc++.a(iostream.o)(.text+0x17d8):iostream.cc: undefined reference to `_impure_ptr' /usr/lib/libstdc++.a(streambuf.o)(.text+0x3e7):streambuf.cc: undefined reference to `__errno' /usr/lib/libstdc++.a(stdstrbufs.o)(.text+0x4e):stdstrbufs.cc: undefined referenc e to `_impure_ptr' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x60):iovfscanf.c: undefined reference t o `_imp___ctype_' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x8d):iovfscanf.c: undefined reference t o `_imp___ctype_' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x584):iovfscanf.c: undefined reference to `_imp___ctype_' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x5d1):iovfscanf.c: undefined reference to `_imp___ctype_' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x85c):iovfscanf.c: undefined reference to `_imp___ctype_' /usr/lib/libstdc++.a(iovfscanf.o)(.text+0x8b4):iovfscanf.c: more undefined refer ences to `_imp___ctype_' follow /usr/lib/libstdc++.a(fileops.o)(.text+0x194):fileops.c: undefined reference to ` __errno' /usr/lib/libstdc++.a(fileops.o)(.text+0x206):fileops.c: undefined reference to ` __errno' /usr/lib/libstdc++.a(fileops.o)(.text+0x261):fileops.c: undefined reference to ` __errno' /usr/lib/libstdc++.a(fileops.o)(.text+0x390):fileops.c: undefined reference to ` __errno' /usr/lib/libstdc++.a(fileops.o)(.text+0x459):fileops.c: undefined reference to ` __errno' /usr/lib/libstdc++.a(fileops.o)(.text+0x5b1):fileops.c: more undefined reference s to `__errno' follow /usr/lib/libstdc++.a(floatconv.o)(.text+0x1273):floatconv.c: undefined reference to `__infinity' /usr/lib/libstdc++.a(floatconv.o)(.text+0x13cd):floatconv.c: undefined reference to `__errno' collect2: ld returned 1 exit status $ |
そこで、C++用のランタイムライブラリを別途入れてあげれば、C++でもmingw32によるCygwin1.dllに依存しない実行ファイルを作成することができるようになります。
ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/gcc-2.95.2-mingw-extra.tar.gz
$cd /usr/local $mkdir mingw $cd mingw $pwd /usr/local/mingw $tar xvfz //e/archives/cygwin/opt/gcc-2.95.2-mingw-extra.tar.gz ./ lib/ lib/libm.a lib/libiberty.a lib/libg2c.a lib/libgcc.a lib/libobjc.a lib/libstdc++.a lib/libmingw32.a include/ include/_G_config.h $ |
mingwのヘッダファイルとライブラリファイルのあるディレクトリを、コンパイル時に指定する必要があります。
$ls hello.cpp $c++ -o hello -mno-cygwin -I/usr/local/mingw/include -L/usr/local/mingw/lib hello.cpp $ls hello.cpp hello.exe |
vimは、ハイライト(キーワード等で文字表示色を変える)機能があるが、標準では背景が黒に適合している。したがって背景色を白系統の明るい色に変更すると、見えない色が存在する。そこで、背景色が明るいときに適合するハイライト指定を行う。
1) /usr/share/vim/vimrcを、ホームディレクトリに.vimrcというファイル名でコピーする。
2) set background=darkとなっている部分を、set
background=lightに変更する。
デフォルトでは日本語ファイル名が???? のように置き換えられてしまいます。そこで、lsのコマンドラインオプションに、--show-control-chars と付けてあげるとよいでしょう。毎回指定するのは面倒なので、aliasに設定しておきます。 alias ls='ls --show-control-chars'
ftpサーバ、telnetサーバ、sshサーバなどをマシンを起動したときに自動で起動するようにしておくためには、これらをWindowsサービスとして設定しておきます。
$ /usr/sbin/inetd --install-as-service $ |
このコマンドを実行した直後にWindowsのサービスを見ると、CYGWIN inetdという名前でサービスが追加されているのが分かります。
サービスを解除するには、
$ /usr/sbin/inetd --remove-as-service $ |
どのサービスを起動するかの設定は、/etc/inetd.confファイルに記述されています。不要なサービスがあれば、#でコメントアウトしておくとよいでしょう。デフォルトでは以下のサービスが起動するようになっています。
~$ cat /etc/inetd.conf |egrep -v "^#" echo stream tcp nowait root internal echo dgram udp wait root internal discard stream tcp nowait root internal discard dgram udp wait root internal daytime stream tcp nowait root internal daytime dgram udp wait root internal chargen stream tcp nowait root internal chargen dgram udp wait root internal time stream tcp nowait root internal time dgram udp wait root internal ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd shell stream tcp nowait root /usr/sbin/in.rshd in.rshd -L login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd talk dgram udp wait root /usr/sbin/in.talkd in.talkd ntalk dgram udp wait root /usr/sbin/in.talkd in.talkd uucp stream tcp nowait uucp /usr/sbin/in.uucpd in.uucpd ~$ |