Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • extmk.rb

Class/Module Index [+]

Quicksearch

Object

Constants

EXEEXT
MTIMES

Public Class Methods

new(src) click to toggle source
 
               # File extmk.rb, line 487
def initialize(src)
  super("#{src}.c", "#{src}.#{$OBJEXT}")
end
            

Public Instance Methods

compiled?(target) click to toggle source
 
               # File extmk.rb, line 267
def compiled?(target)
  $compiled[target]
end
            
extmake(target) click to toggle source
 
               # File extmk.rb, line 97
def extmake(target)
  unless $configure_only
    print "#{$message} #{target}\n"
    $stdout.flush
  end

  FileUtils.mkpath target unless File.directory?(target)
  begin
    dir = Dir.pwd
    FileUtils.mkpath target unless File.directory?(target)
    Dir.chdir target
    top_srcdir = $top_srcdir
    topdir = $topdir
    hdrdir = $hdrdir
    prefix = "../" * (target.count("/")+1)
    $top_srcdir = relative_from(top_srcdir, prefix)
    $hdrdir = relative_from(hdrdir, prefix)
    $topdir = prefix + $topdir
    $target = target
    $mdir = target
    $srcdir = File.join($top_srcdir, "ext", $mdir)
    $preload = nil
    $objs = []
    $srcs = []
    $compiled[target] = false
    makefile = "./Makefile"
    ok = File.exist?(makefile)
    unless $ignore
      rbconfig0 = RbConfig::CONFIG
      mkconfig0 = CONFIG
      rbconfig = {
        "hdrdir" => $hdrdir,
        "srcdir" => $srcdir,
        "topdir" => $topdir,
      }
      mkconfig = {
        "hdrdir" => ($hdrdir == top_srcdir) ? top_srcdir : "$(top_srcdir)/include",
        "srcdir" => "$(top_srcdir)/ext/#{$mdir}",
        "topdir" => $topdir,
      }
      rbconfig0.each_pair {|key, val| rbconfig[key] ||= val.dup}
      mkconfig0.each_pair {|key, val| mkconfig[key] ||= val.dup}
      RbConfig.module_eval {
        remove_const(:CONFIG)
        const_set(:CONFIG, rbconfig)
        remove_const(:MAKEFILE_CONFIG)
        const_set(:MAKEFILE_CONFIG, mkconfig)
      }
      Object.class_eval {
        remove_const(:CONFIG)
        const_set(:CONFIG, mkconfig)
      }
      begin
        $extconf_h = nil
        ok &&= extract_makefile(makefile)
        old_objs = $objs
        old_cleanfiles = $distcleanfiles
        conf = ["#{$srcdir}/makefile.rb", "#{$srcdir}/extconf.rb"].find {|f| File.exist?(f)}
        if (($extconf_h && !File.exist?($extconf_h)) ||
            !(t = modified?(makefile, MTIMES)) ||
            [conf, "#{$srcdir}/depend"].any? {|f| modified?(f, [t])})
        then
          ok = false
          if $configure_only
            print "#{$message} #{target}\n"
            $stdout.flush
          end
          init_mkmf
          Logging::logfile 'mkmf.log'
          rm_f makefile
          if conf
            unless verbose?
              stdout, $stdout = $stdout, File.open(File::NULL, "a")
            else
              stdout = $stdout
            end
            begin
              load $0 = conf
            ensure
              $stdout = stdout
            end
          else
            create_makefile(target)
          end
          $defs << "-DRUBY_EXPORT" if $static
          ok = File.exist?(makefile)
        end
      rescue SystemExit
        # ignore
      rescue => error
        ok = false
      ensure
        rm_f "conftest*"
        config = $0
        $0 = $PROGRAM_NAME
      end
    end
    ok = yield(ok) if block_given?
    unless ok
      open(makefile, "w") do |f|
        f.print(*dummy_makefile(CONFIG["srcdir"]))
      end

      mess = "Failed to configure #{target}. It will not be installed.\n"
      if error
        mess.prepend(error.to_s + "\n")
      end

      Logging::message(mess)
      print(mess)
      $stdout.flush
      return true
    end
    args = sysquote($mflags)
    unless $destdir.to_s.empty? or $mflags.defined?("DESTDIR")
      args += [sysquote("DESTDIR=" + relative_from($destdir, "../"+prefix))]
    end
    if $static
      args += ["static"] unless $clean
      $extlist.push [$static, $target, File.basename($target), $preload]
    end
    FileUtils.rm_f(old_cleanfiles - $distcleanfiles)
    FileUtils.rm_f(old_objs - $objs)
    unless $configure_only or system($make, *args)
      $ignore or $continue or return false
    end
    $compiled[target] = true
    if $clean
      FileUtils.rm_f("mkmf.log")
      if $clean != true
        FileUtils.rm_f([makefile, $extconf_h || "extconf.h"])
      end
    end
    if $static
      $extflags ||= ""
      $extlibs ||= []
      $extpath ||= []
      unless $mswin
        $extflags = ($extflags.split | $DLDFLAGS.split | $LDFLAGS.split).join(" ")
      end
      $extlibs = merge_libs($extlibs, $libs.split, $LOCAL_LIBS.split)
      $extpath |= $LIBPATH
    end
  ensure
    unless $ignore
      RbConfig.module_eval {
        remove_const(:CONFIG)
        const_set(:CONFIG, rbconfig0)
        remove_const(:MAKEFILE_CONFIG)
        const_set(:MAKEFILE_CONFIG, mkconfig0)
      }
      Object.class_eval {
        remove_const(:CONFIG)
        const_set(:CONFIG, mkconfig0)
      }
    end
    $top_srcdir = top_srcdir
    $topdir = topdir
    $hdrdir = hdrdir
    Dir.chdir dir
  end
  begin
    Dir.rmdir target
    target = File.dirname(target)
  rescue SystemCallError
    break
  end while true
  true
end
            
extract_makefile(makefile, keep = true) click to toggle source
 
               # File extmk.rb, line 52
def extract_makefile(makefile, keep = true)
  m = File.read(makefile)
  if !(target = m[/^TARGET[ \t]*=[ \t]*(\S*)/, 1])
    return keep
  end
  installrb = {}
  m.scan(/^install-rb-default:.*[ \t](\S+)(?:[ \t].*)?\n\1:[ \t]*(\S+)/) {installrb[$2] = $1}
  oldrb = installrb.keys.sort
  newrb = install_rb(nil, "").collect {|d, *f| f}.flatten.sort
  if target_prefix = m[/^target_prefix[ \t]*=[ \t]*\/(.*)/, 1]
    target = "#{target_prefix}/#{target}"
  end
  unless oldrb == newrb
    if $extout
      newrb.each {|f| installrb.delete(f)}
      unless installrb.empty?
        config = CONFIG.dup
        install_dirs(target_prefix).each {|var, val| config[var] = val}
        FileUtils.rm_f(installrb.values.collect {|f| RbConfig.expand(f, config)},
                       :verbose => verbose?)
      end
    end
    return false
  end
  $target = target
  $extconf_h = m[/^RUBY_EXTCONF_H[ \t]*=[ \t]*(\S+)/, 1]
  if $static.nil?
    $static ||= m[/^EXTSTATIC[ \t]*=[ \t]*(\S+)/, 1] || false
    /^STATIC_LIB[ \t]*=[ \t]*\S+/ =~ m or $static = false
  end
  $preload = Shellwords.shellwords(m[/^preload[ \t]*=[ \t]*(.*)/, 1] || "")
  $DLDFLAGS += " " + (m[/^dldflags[ \t]*=[ \t]*(.*)/, 1] || "")
  if s = m[/^LIBS[ \t]*=[ \t]*(.*)/, 1]
    s.sub!(/^#{Regexp.quote($LIBRUBYARG)} */, "")
    s.sub!(/ *#{Regexp.quote($LIBS)}$/, "")
    $libs = s
  end
  $objs = (m[/^OBJS[ \t]*=[ \t](.*)/, 1] || "").split
  $srcs = (m[/^SRCS[ \t]*=[ \t](.*)/, 1] || "").split
  $distcleanfiles = (m[/^DISTCLEANFILES[ \t]*=[ \t](.*)/, 1] || "").split
  $LOCAL_LIBS = m[/^LOCAL_LIBS[ \t]*=[ \t]*(.*)/, 1] || ""
  $LIBPATH = Shellwords.shellwords(m[/^libpath[ \t]*=[ \t]*(.*)/, 1] || "") - %w[$(libdir) $(topdir)]
  true
end
            
parse_args() click to toggle source
 
               # File extmk.rb, line 271
def parse_args()
  $mflags = []
  $makeflags = [] # for make command to build ruby, so quoted

  $optparser ||= OptionParser.new do |opts|
    opts.on('-n') {$dryrun = true}
    opts.on('--[no-]extension [EXTS]', Array) do |v|
      $extension = (v == false ? [] : v)
    end
    opts.on('--[no-]extstatic [STATIC]', Array) do |v|
      if ($extstatic = v) == false
        $extstatic = []
      elsif v
        $force_static = true if $extstatic.delete("static")
        $extstatic = nil if $extstatic.empty?
      end
    end
    opts.on('--dest-dir=DIR') do |v|
      $destdir = v
    end
    opts.on('--extout=DIR') do |v|
      $extout = (v unless v.empty?)
    end
    opts.on('--make=MAKE') do |v|
      $make = v || 'make'
    end
    opts.on('--make-flags=FLAGS', '--mflags', Shellwords) do |v|
      v.grep(/\A([-\w]+)=(.*)/) {$configure_args["--#{$1}"] = $2}
      if arg = v.first
        arg.insert(0, '-') if /\A[^-][^=]*\Z/ =~ arg
      end
      $makeflags.concat(v.reject {|arg2| /\AMINIRUBY=/ =~ arg2}.quote)
      $mflags.concat(v)
    end
    opts.on('--message [MESSAGE]', String) do |v|
      $message = v
    end
    opts.on('--command-output=FILE', String) do |v|
      $command_output = v
    end
  end
  begin
    $optparser.parse!(ARGV)
  rescue OptionParser::InvalidOption => e
    retry if /^--/ =~ e.args[0]
    $optparser.warn(e)
    abort $optparser.to_s
  end

  $destdir ||= ''

  $make, *rest = Shellwords.shellwords($make)
  $mflags.unshift(*rest) unless rest.empty?

  def $mflags.set?(flag)
    grep(/\A-(?!-).*#{flag.chr}/i) { return true }
    false
  end
  def $mflags.defined?(var)
    grep(/\A#{var}=(.*)/) {return $1}
    false
  end

  if $mflags.set?(?n)
    $dryrun = true
  else
    $mflags.unshift '-n' if $dryrun
  end

  $continue = $mflags.set?(?k)
  if $extout
    $extout = '$(topdir)/'+$extout
    RbConfig::CONFIG["extout"] = CONFIG["extout"] = $extout
    $extout_prefix = $extout ? "$(extout)$(target_prefix)/" : ""
    $mflags << "extout=#$extout" << "extout_prefix=#$extout_prefix"
  end
end
            
sysquote(x) click to toggle source
 
               # File extmk.rb, line 43
def sysquote(x)
  @quote ||= /os2/ =~ (CROSS_COMPILING || RUBY_PLATFORM)
  @quote ? x.quote : x
end
            
verbose?() click to toggle source
 
               # File extmk.rb, line 48
def verbose?
  $mflags.defined?("Q") != "@"
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.