Cygwin で RubyとGitをコンパイルして使おう


Cygwinを使ってRuby、Git最新版(今回は1.8.5)、Vagrantを使えるようにしてみた。  
※投稿した方法でGitをインストールした場合、git cloneをhttps転送で実行すると`fatal: Unable to find remote helper for 'https'`エラーになることが判明。
[こちら](http://tar.hatenablog.com/entry/2014/03/20/004156)のブログに、その原因と対処を記載。2014/3/20 追記


## Cygwin setup

ポイントのみ記載する。詳細手順についてはgoogle先生に聞くと画像付で教えてくれるので割愛した。

### ディレクトリとバージョン

- E:\cygwin ディレクトリを作ってそこへ setup-x86.exe を保存。exeを実行するとパッケージの保管先を聞いてくるので、 E:\cygwin\packages とした。ダウンロードサイトは日本なら http://ftp.jaist.ac.jp などでいいと思う。
- OSがWindowsXPなので32 bit版を使った。このときのCygwin setupバージョンは2.8.31。


### インストールパッケージ

- Base/gawk *

- Base/tar *

- Devel/git

- Utils/bzip2 

- Web/wget

※アスタリスク印はデフォルトでチェックが入っているので、実質「git、bzip、wget」のみチェックを入れた。

- インストール後、E:\cygwin\etc\passwd ファイルを編集。使うユーザーのグループIDを545(Users)に変更。ホームディレクトリを変える場合はここで。例では”/home/user”に変更。

```passwd
  :
- username:unused:1004:513:username,U-WINXP\username,S-1-...-1004:/home/username:/bin/bash
+ username:unused:1004:545:username,U-WINXP\username,S-1-...-1004:/home/user:/bin/bash
  :
```

- E:\cygwin\etc\group ファイルを編集。なしをnobodyに変更。

```group
  :
- なし:S-1-...-513:513:
+ nobody:S-1-...-513:513:
  :
```

## 起動バッチとhomeディレクトリを用意

- E:\cygwin へ Cygwin_mintty.bat を作成。

```Cygwin_mintty.bat
@echo off
%~d0
set cygdrive=%~d0
set cygdir=%~dp0
cd %~dp0\bin

set PATH=%SystemRoot%\system32
set MAKE_MODE=unix
set CYGWIN=noacl nontsec nosmbntsec
set SHELL=/bin/bash
set HOME=

bash.exe -c "/usr/bin/mintty -&"
exit
```

- 作った Cygwin_mintty.bat を実行。minttyでbashが起動するか確認。

- Cygwin実行後、Windowsでもわかりやすい場所にhomeディレクトリを用意（例としてD:\home\user）。Cygwinからシンボリックリンク作成。

```
$ cd /home
$ mv user user_bk                    # 元のhomeディレクトリを退避
$ ln -s /cygdrive/d/home/user/ user  # D:\home\userをcygwinのhomeディレクトリとして見えるようにする
$ cp user_bk/.* user/                # ドットファイルを新しいhomeディレクトリにコピー
```

## apt-cygのインストール

当初、オリジナルのapt-cygを使ったが、cygwinのミラーサイトの構造が変わったようで、パッケージがうまくダウンロードできなかった。
なので、下記のgithubリポジトリのapt-cygを使わせていただく。  
（詳細：http://wiki.livedoor.jp/kou1okada/d/apt-cyg ）

```
$ mkdir /tmp/apt-cyg
$ cd /tmp/apt-cyg
$ git clone https://github.com/kou1okada/apt-cyg .
$ chmod +x apt-cyg
$ mv apt-cyg /bin/
$ apt-cyg --use-setuprc
$ apt-cyg update
```


## コンパイラ/ライブラリ/ツールのインストール

```
$ apt-cyg install gcc-core
$ apt-cyg install make patch vim
$ apt-cyg install libncurses-devel openssl-devel readline libsqlite3-devel libxml2-devel libxslt-devel
```


## git最新版(1.8.5)インストール

### 事前準備とgitのコンパイル

```
$ apt-cyg install autoconf zlib zlib-devel libiconv python openssh tcl
$ apt-cyg install gettext-devel
$ cd /tmp
$ git clone git://github.com/git/git.git
$ cd git
$ make configure
$ ./configure --prefix=/usr/local
$ make all
$ make install
$ cd
$ git --version
  : # 古いgitのバージョンが表示される
$ export PATH=/usr/local/bin:$PATH
$ git --version
  : # 新しいgitのバージョンが表示される
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
```


### git1.8.5のmanページのインストール

```
$ mkdir /tmp/git-manpages
$ cd /tmp/git-manpages
$ wget https://www.kernel.org/pub/software/scm/git/git-manpages-1.8.5.tar.gz --no-check-certificate
$ mkdir /usr/local/man
$ tar xvfz git-manpages-1.8.5.tar.gz -C /usr/local/man
$ man git
  : # 最下段までスクロールするとバージョンが表示されるので確認。
```


## Rubyのインストール


### (方法１)Rubyをコンパイルしてインストール

```
$ mkdir /tmp/ruby
$ cd /tmp/ruby
$ wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p353.tar.gz
$ tar xvfz ruby-2.0.0-p353.tar.gz
$ cd ruby-2.0.0-p353
$ ./configure
$ make
$ make install
$ ruby -v
```

### (方法２)rbenvでインストール

- rbenvのインストール
```
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$PATH:$HOME/.rbenv/bin"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```


- ruby-buildのインストール

```
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/rucby-build
```


- Rubyのインストール

```
$ rbenv install --list
  : # インストールできるrubyバージョンのリストが出るので、お目当てのバージョンを探す
$ rbenv install 2.0.0-p247
  : # めっちゃ時間かかる(笑)
$ rbenv rehash
$ rbenv global 2.0.0-p247
$ which ruby
  : # rubyのインストール場所を確認
$ ruby -v
$ gem -v
```


## .gemrc の作成

これを作っておくと、gemインストール時にドキュメントが含まれずインストールが早くなる。

```
echo 'gem: --no-document' > .gemrc
```



## VirtualBoxのインストール

- Windowsインストーラで4.2.18をインストール

- インストール先はD:\opt\VirtualBox

- D:\opt をcygwin起動時に /opt へマウントするように fstab ファイルを編集する。

```fstab
    :
d:\opt /opt ntfs override,noacl,binary,auto 0 0
```

- fstabの反映と、VirtualBoxディレクトリのパスを通す。

```
$ mount -a
$ export PATH="/opt/VirtualBox:$PATH"
$ echo 'export PATH="/opt/VirtualBox:$PATH"' >> ~/.bash_profile
```

## Vagrantのインストール

- 1.3.5を使用

- D:\opt\Vagrant へインストール


- Vagrant設定ファイルの保管場所を設定し、binディレクトリのパスを通す。

```
$ export VAGRANT_HOME="$HOME/.vagrant.d"
$ echo 'export VAGRANT_HOME="$HOME/.vagrant.d"' >> ~/.bash_profile
$ export PATH="/opt/Vagrant/bin:$PATH"
$ echo 'export PATH="/opt/Vagrant/bin:$PATH"' >> ~/.bash_profile
```

- Vagrantにおまじない

```
$ dos2unix /opt/Vagrant/bin/vagrant
```


## (任意)gitコミットログをsakuraエディタで書けるようにしておく

- cygwin独特のパスを解決させるようにスクリプトを組んでおく。

- d:/opt/sakura/sakura.exeにある前提。

```$HOME/bin/sakura
#!/bin/bash
argv=("$@")

for i in `seq 1 $#` ; do
  case ${argv[$i-1]} in
    -*) ;;                                        # オプション引数はそのまま
    *) argv[$i-1]=`cygpath -w "${argv[$i-1]}"` ;; # ファイルパスはcygpathで変換
  esac
done

/cygdrive/d/opt/Sakura/sakura.exe ${argv[@]}

```

```.gitconfig
  :
[core]
  editor = 'sakura' \"$1\" \"-CODE=4 -GROUP=9\"
  :
```

## (任意)git-completionの利用とプロンプトにgitブランチ名を表示する

git-completionの利用とプロンプトにgitブランチ名を表示する場合は、gitコンパイル時に /tmp/git/contrib/completion ディレクトリに .git-completion.* と git-prompt.sh ファイルが生成されているので、それをhomeディレクトリに.ファイルとしてコピーして、.bashrcに下記を追加する。

```.bashrc
  :
# git-completionの設定
if [ -e "${HOME}/.git-completion.bash" ] ; then
  source "${HOME}"/.git-completion.bash
fi

# プロンプト
PS1='\[\033]0;Cygwin:${PWD//[^[:ascii:]]/?}\007\]'   # set window title
PS1="$PS1"'\n'                                       # new line
PS1="$PS1"'\[\033[32m\]'                             # change color
PS1="$PS1"'\u@\h '                                   # user@host<space>
PS1="$PS1"'\[\033[33m\]'                             # change color
PS1="$PS1"'\w'                                       # current working directory
if [ -e "${HOME}/.git-prompt.sh" ] ; then
  source "${HOME}"/.git-prompt.sh
  PS1="$PS1"'$(__git_ps1 "(%s)")'                    # git branch name
fi
PS1="$PS1"'\[\033[0m\]'                              # change color
PS1="$PS1"'\n'                                       # new line
PS1="$PS1"'\$ '                                      # prompt: # or prompt: $
export PS1
  :
```


## その他

gemなどをインストールして使おうとすると、下記のようなメッセージが出るときがある。
この場合、「cygwin gem インストール rebaseall」でgoogle先生に尋ねると良い。

```
$ gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.1.11.gem (100%)
Successfully installed rubygems-update-2.1.11
Installing RubyGems 2.1.11
      1 [main] ruby 2180 child_info_fork::abort: unable to remap openssl.so to same address as parent (0x1080000) - try running rebaseall
      0 [main] ruby 2160 child_info_fork::abort: unable to remap fcntl.so to same address as parent (0x2410000) - try running rebaseall
      1 [main] ruby 2828 child_info_fork::abort: unable to remap openssl.so to same address as parent (0x1080000) - try running rebaseall
  :
```

- (参考)cygwin上で下記を実行。

```
$ find /usr -name '*.so' > /tmp/rebase_so.lst
$ find /usr -name '*.dll' >> /tmp/rebase_so.lst
```

- (参考)ashを起動して下記を実行。

```
$ /bin/rebaseall -T /tmp/rebase_so.lst -v
```

## 実際に使ってみた感想

Cygwinは日本語も使えるコマンドライン環境で結構好きー。  
rbenvを使うと、少々重い感じでした。Rubyをコンパイルした場合はサクサク動いてくれるので、私はコンパイルして使ってるよ。