[Meadowで開発へ戻る]

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/)

Cygwin 1.x Net Releaseのインストール

まず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の起動

ダウンロードしたら、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以下に置くことにしたので、これを指定します。

注)ディレクトリを先に作成しておかないとエラーが出るので、あらかじめディレクトリを作成しておきます。

FTPサーバへの接続方法設定

ダウンロードするサーバへの接続方法を指定します。途中ファイヤーウォール等介してなければ直接接続(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
Mail 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を実行します。


Cygwinのアップデート

setup.exeを実行すると、パッケージ構成情報を取得してバージョンアップされたパッケージがあれば、パッケージ一覧に表示されます。ローカルにダウンロードするなりインストールするなりしていきます。
また、seutp.exe自体もバージョンアップされるので、ときどきsetup.exeも入手し直します。


Cygwinの設定

インストールが成功すると、デスクトップにCygwinのショートカットが出来ており、スタートメニューにもCygnusが出来ているはずです。Cygwinを実行すると、コンソール窓が開きます。

mount設定

マウント設定はインストールしたユーザ(上記の場合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環境設定

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案:

  1. mountのモードをバイナリモード(binmode)からテキストモード(textmode)に変更する
  2. UNIX改行コードを扱えるエディタを使用して.bashrcを編集する

あるべき姿は、(2)でMeadowを使用することとする。ただし現時点ではまだMeadowをインストールしていないので、暫定処置として(1)とする。ただし、(1)はシステム全体を変更するのではなく、ユーザ環境だけ設定する。
mount e:/home /home
Cygwin1.1では、システムのmount設定とユーザのmount設定が重なった場合、ユーザのmount設定が優先されるらしい。

[目次へ戻る]


Cygwin1.1用Perlのインストール

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にmingw32を追加する

背景

Cygwin1.1には標準で(インストールしていれば)gcc-2.95.2があります。gccで作成した実行ファイル(exe)は、実行時にCygwin1.dllを必要とします。しかし、Cygwin1.dllを必要とせずに、WindowsOS上でそのまま実行できる形式を作成することもできます。これをmingw32というそうです。

mingw32によるgccのCコンパイラ使用例
$ls
hello.c
$gcc -o hello -mno-cygwin hello.c
$ls
hello.c    hello.exe

問題点

しかし、残念ながらこれはCコンパイラだけ有効で、C++/FORTRAN/Objective-Cをコンパイルして実行形式を生成するときにはリンクエラーが発生してしまいます。これは、Cygwinのgccパッケージには、mingw32のランタイムライブラリがC用のものしか提供されていないからです。

mingw32によるgccのC++コンパイラ使用例(Cygwin標準)
$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に依存しない実行ファイルを作成することができるようになります。

mingw32ラインタイムの取得

ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/cygwin/gcc-2.95.2/gcc-2.95.2-mingw-extra.tar.gz

/usr/local/mingwの下に、1.で入手したものを展開
$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
$
C++プログラムのmingw32による実行ファイル生成

mingwのヘッダファイルとライブラリファイルのあるディレクトリを、コンパイル時に指定する必要があります。

mingw32によるgccのC++コンパイラ使用例
$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

設定に関するTips

vimの設定

背景が明るい表示色設定にする

vimは、ハイライト(キーワード等で文字表示色を変える)機能があるが、標準では背景が黒に適合している。したがって背景色を白系統の明るい色に変更すると、見えない色が存在する。そこで、背景色が明るいときに適合するハイライト指定を行う。

1) /usr/share/vim/vimrcを、ホームディレクトリに.vimrcというファイル名でコピーする。
2) set background=darkとなっている部分を、set background=lightに変更する。

lsの設定

lsコマンドで日本語ファイル名を表示する

デフォルトでは日本語ファイル名が???? のように置き換えられてしまいます。そこで、lsのコマンドラインオプションに、--show-control-chars と付けてあげるとよいでしょう。毎回指定するのは面倒なので、aliasに設定しておきます。 alias ls='ls --show-control-chars'

インターネットサービスの設定

Windowsサービスとしてインターネットサービスを起動する

ftpサーバ、telnetサーバ、sshサーバなどをマシンを起動したときに自動で起動するようにしておくためには、これらをWindowsサービスとして設定しておきます。

inetdのWindowsサービス設定例
$ /usr/sbin/inetd --install-as-service
$

このコマンドを実行した直後にWindowsのサービスを見ると、CYGWIN inetdという名前でサービスが追加されているのが分かります。

注意1)
システムの環境変数PATHに、cygwin1.dllのあるディレクトリを指定しておかないと、サービスの状態は停止となっています。

サービスを解除するには、

inetdのWindowsサービス解除例
$ /usr/sbin/inetd --remove-as-service
$

どのサービスを起動するかの設定は、/etc/inetd.confファイルに記述されています。不要なサービスがあれば、#でコメントアウトしておくとよいでしょう。デフォルトでは以下のサービスが起動するようになっています。

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
~$

[目次へ戻る]