わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

CygwinでRubyの最新版スナップショットをビルド―psych対応―

久しぶりにgem updateをしてみると,長々とエラーが出てきました.

$ gem update
略/ruby/lib/ruby/2.0.0/yaml.rb:6:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
略/ruby/lib/ruby/2.0.0/rubygems/custom_require.rb:36:in `require': cannot load such file -- psych (LoadError)
	from 略/ruby/lib/ruby/2.0.0/rubygems/custom_require.rb:36:in `require'
(略)
	from 略/ruby/bin/gem:21:in `<main>'

「psych」という単語は,ちょっと見慣れません.検索したところ,まず,

を見つけました.「Ruby 1.9.3ではYAMLパーサーとして従来のsyckにかわりpsychが使われるようになった」ということですか.とはいえ方法(コマンド)は,残念ながら,Cygwin環境ではまったく使えません.
次に,

というのを見つけました.喜び勇んで「gem install psych」を実行…ダメでした.おんなじエラーが出てきました.
ビルドをやり直しましょう.コマンドは

に書かれているのですが,

rubyのconfigureでyamlを有効にする方法。--with-opt-dir=/usr/local/libは、--with-opt-dir=/usr/localが正解だった。

http://b.hatena.ne.jp/takumi2077/20120815#bookmark-65677129

というはてブも重要です.
結局のところ,コマンドとしては

$ wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
$ tar xzvf yaml-0.1.4.tar.gz
$ cd yaml-0.1.4
$ ./configure
$ make
$ make install
$ cd ..
$ wget ftp://ftp.ruby-lang.org/pub/ruby/snapshot.tar.gz
$ tar xzvf snapshot.tar.gz
$ cd snapshot
$ ./configure --prefix=/usr/local --with-opt-dir=/usr/local
$ make
$ make install

とすることで,/usr/local/lib/libyaml.aや/usr/local/bin/ruby.exeなどができました.
以前書いたzsh用のfunctionを,修正しておきましょう.(11月10日に書いた修正も,加えました.))

function ruby-snapshot-install() {
    local ECHO="echo"
    local today=$(date '+%Y%m%d')
    local ssflag=1
    local instdir="ruby"
    local configopt=""
    local uri dir1 dir2 tgz

    if [[ $# != 0 ]]
    then
        instdir=$1
        shift
        if [[ $# != 0 ]]
        then
            ssflag=$1
            shift
        fi
    fi
    if [[ $ssflag = "1" ]]
    then
        # 安定版スナップショット
        uri=ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz
        dir1=ruby
        dir2=ruby-ss-$today
        tgz=$dir2.tgz
    else
        # 最新版スナップショット
        uri=ftp://ftp.ruby-lang.org/pub/ruby/snapshot.tar.gz
        dir1=snapshot
        dir2=ruby-sn-$today
        tgz=$dir2.tgz
        if find /usr/local | grep libyaml >/dev/null
        then
            configopt="${configopt} --with-opt-dir=/usr/local"
        fi
    fi
    $ECHO pushd $HOME/src
    $ECHO wget -O $tgz $uri
    $ECHO tar xzf $tgz
    $ECHO mv $dir1 $dir2
    $ECHO popd
    $ECHO pushd $HOME/src/$dir2
    if [[ $ARCHI = "linux" ]]
    then
        configopt="${configopt} --enable-pthread"
    fi
    $ECHO ./configure --prefix=$HOME/Lib/$instdir ${=configopt}
    $ECHO make
    $ECHO make install
    $ECHO popd
}

# Cygwinなら,~/Lib/ruby/bin/ruby が最新版スナップショット,
#             ~/Lib/.ruby18/bin/ruby が安定版スナップショット.
# そうでないなら,~/Lib/ruby/bin/ruby が安定版スナップショット,
#                 ~/Lib/.ruby19/bin/ruby が最新版スナップショット.
if [[ $ARCHI = "cygwin" ]]
then
    function ruby-build() {
        ruby-snapshot-install ruby 0
        ruby-snapshot-install .ruby18
    }
else
    function ruby-build() {
        ruby-snapshot-install
        ruby-snapshot-install .ruby19 0
    }
fi