setup.rb / install.rb / extconf.rb 対応自動インストーラ setuprb を作ってみた

RubyGemsを使わないRubyスクリプトのinstallはsetup.rbが定番だ。だからsetup.rbを入れておくのが礼儀となっている。
現在のバージョン(といっても何年も前だが)は「ruby setup.rb」を実行するだけでいいのだが、パッケージ附属のsetup.rbは古いこともある。その場合、いちいち

ruby setup.rb config
ruby setup.rb setup
sudo ruby setup.rb install

と実行することとなる。ましてやRuby 1.8Ruby 1.9を共存させている人はrubyをruby19と置き換えて再実行する必要がある。面倒この上ない。*1
さらに悪いことに、setup.rbの代わりにinstall.rbを入れていることもある。install.rbも使い方は同じ。だったらsetup.rb / install.rbを自動検出して、↑のコマンドをstep by stepで実行するスクリプトを作ろう。
おまけでextconf.rbが含まれている場合も自動検出してインストールできるようにした。

Rubyインタプリタのファイル名はruby18、ruby19であるとする。適宜書き換えるように。

#!/usr/local/bin/ruby
# setup.rb/install.rb wrappeger
installer = (Dir["setup.rb\0install.rb\0extconf.rb"]).first
raise "no installer" unless installer

def prompt
  print "==== press Enter"; gets
end

def sh(cmd)
  system cmd
  prompt
end

def install(ruby, installer)
  puts "Ruby:#{ruby} Installer:#{installer}"; prompt
  if installer == 'extconf.rb'
    extconf ruby
  else
    aamine ruby, installer
  end
end

def extconf(ruby)
  system "make clean" if File.exist? "Makefile"
  sh "#{ruby} extconf.rb && make"
  sh "sudo make install"
end

def aamine(ruby, installer)
  sh "#{ruby} #{installer} config"
  sh "#{ruby} #{installer} setup"
  sh "sudo #{ruby} #{installer} install"
end

install "ruby18", installer
install "ruby19", installer

追記

setup.rb自身はだいぶ前から安定しているものの、古くからやっているプロジェクトの場合はsetup.rbが古い場合もありますね。
RubyGemsは便利だが、RubyGems自身のオーバーヘッドが問題になることがあります。CGIスクリプトとか、瞬時に終了するスクリプトを作成するのには向いていません。fastRIやErubisはsetup.rb経由で入れています。

*1:今のバージョンのsetup.rbでも古いやり方は使える。