zt日記

書いているのは Kazuhiro NISHIYAMA a.k.a. ZnZです。
2001|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|
2012|04|05|06|09|

この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。

xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法インストールメモXREA + tDiary + Namazuをどうぞ。


2007年01月04日(Thu)

[ruby] ruby -vの内容をrubyレベルで

matzrubyというブランチが増えて、simple_versionのやり方のpatchlevel対応だけだと無理が出てきそうな気がしたので、pipeを使って標準出力を奪って、version.cのruby_show_versionという関数の出力を取り出そうという作戦に変更しようとしてみた。

DLを使えばいいのかと思いきや、使い方がよくわからずに適当にやってみたら使えたり、現在のtrunkだとdlがmake installでインストールされなかったので、rbconfigにも対応してみたりした。

module RubyShowVersion
  module_function
 
  # dl依存版
  def dl_version
    require 'dl/import'
    eval(<<-'RUBY_CODE', binding, __FILE__, __LINE__+1)
      module RubyShowVersion
        if defined?(DL::Importable)
          extend DL::Importable
          dlload nil
        else
          extend DL::Importer
          dlload DL::Handle.new(nil)
        end
        extern "void ruby_show_version()"
        ruby_show_version
      end
    RUBY_CODE
  end
 
  # rbconfig依存版
  def rbconfig_version
    require 'rbconfig'
    c = Config::CONFIG
    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
    system(rubypath, '-v')
  end
 
  # patchlevel対応版(matzruby未対応)
  def simple_version
    if defined?(RUBY_PATCHLEVEL)
      puts "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE} patchlevel #{RUBY_PATCHLEVEL}) [#{RUBY_PLATFORM}]"
    else
      puts "ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
    end
  end
 
  # version情報表示
  def version
    IO.popen('-', 'r') do |io|
      return io.read if io
      begin
        dl_version
      rescue LoadError
        begin
        rbconfig_version
        rescue LoadError
          simple_version
        end
      end
      $stdout.flush
      exit!(0)
    end
  end
end

copyright © 2001-2013 ZnZ
Key fingerprint = 6E14 2C9C DBD7 874D 8B3C CAA8 9B58 5538 ED7E 1B73