#! /usr/local/bin/ruby # -*- ruby -*- $force_static = nil $install = nil $destdir = nil $clean = nil $nodynamic = nil $extinit = nil $extobjs = nil if ARGV[0] == 'static' $force_static = true ARGV.shift elsif ARGV[0] == 'install' $install = true $destdir = ARGV[1] || '' ARGV.shift elsif ARGV[0] == 'clean' $clean = "clean" ARGV.shift elsif ARGV[0] == 'distclean' $clean = "distclean" ARGV.shift elsif ARGV[0] == 'realclean' $clean = "realclean" ARGV.shift end $extlist = [] $:.replace ["."] require 'rbconfig' srcdir = Config::CONFIG["srcdir"] $:.replace [srcdir, srcdir+"/lib", "."] require 'mkmf' require 'find' require 'ftools' require 'shellwords' $topdir = $hdrdir = File.expand_path(".") $top_srcdir = srcdir Object.class_eval do remove_method :create_makefile end def create_makefile(target) $target = target if target.include?('/') target_prefix, target = File.split(target) target_prefix[0,0] = '/' else target_prefix = "" end rm_f "conftest*" if CONFIG["DLEXT"] == $OBJEXT libs = $libs.split for lib in libs lib.sub!(/-l(.*)/, %%"lib\\1.#{$LIBEXT}"%) end $defs.push(format("-DEXTLIB='%s'", libs.join(","))) end $DLDFLAGS = CONFIG["DLDFLAGS"].dup if $configure_args['--enable-shared'] or CONFIG["LIBRUBY"] != CONFIG["LIBRUBY_A"] $libs = CONFIG["LIBRUBYARG"] + " " + $libs $LIBPATH.unshift $topdir end defflag = '' if RUBY_PLATFORM =~ /cygwin|mingw/ and not $static if not File.exist? target + '.def' open(target + '.def', 'wb') do |f| f.print "EXPORTS\n", "Init_", target, "\n" end end defflag = target + ".def" elsif RUBY_PLATFORM =~ /bccwin32/ deffile = target + '.def' if not File.exist? target + '.def' open(deffile, 'wb') do |f| f.print "EXPORTS\n", "_Init_", target, "\n" end end end if RUBY_PLATFORM =~ /mswin32|bccwin32/ libpath = $LIBPATH.join(';') else $LIBPATH.each {|d| $DLDFLAGS << " -L" << d} if /netbsdelf/ =~ RUBY_PLATFORM $LIBPATH.each {|d| $DLDFLAGS << " -Wl,-R" + d unless d == $topdir} end end $srcdir = File.join($top_srcdir,"ext",$mdir) mfile = open("Makefile", "w") mfile.binmode if /mingw/ =~ RUBY_PLATFORM mfile.printf < /dev/null || true " end elsif CONFIG['DLEXT'] != $OBJEXT mfile.print "$(DLLIB): $(OBJS)\n" if /bccwin32/ =~ RUBY_PLATFORM mfile.print "\t$(LDSHARED) $(DLDFLAGS) C0D32.OBJ $(OBJS), $@,, CW32.LIB IMPORT32.LIB WS2_32.LIB $(LIBS), #{deffile}\n" else if /mswin32/ =~ RUBY_PLATFORM if /nmake/i =~ $make mfile.print "\tset LIB=$(LIBPATH:/=\\);$(LIB)\n" else mfile.print "\tenv LIB='$(subst /,\\\\,$(LIBPATH));$(LIB)' \\\n" end end mfile.print "\t$(LDSHARED) $(DLDFLAGS) #{OUTFLAG}$(DLLIB) $(OBJS) $(LIBS) $(LOCAL_LIBS)\n" end elsif RUBY_PLATFORM == "m68k-human" mfile.printf "\ $(DLLIB): $(OBJS) ar cru $(DLLIB) $(OBJS) " else mfile.printf "\ $(DLLIB): $(OBJS) ld $(DLDFLAGS) -r -o $(DLLIB) $(OBJS) " end if File.exist?("#{$srcdir}/depend") dfile = open("#{$srcdir}/depend", "r") mfile.printf "###\n" while line = dfile.gets() line.gsub!(/\.o\b/, ".#{$OBJEXT}") if /bccwin32/ =~ RUBY_PLATFORM line.gsub!(/(\s)([^\s\/]+\.[ch])/, '\1{$(srcdir)}\2') else line.gsub!(/(\s)([^\s\/]+\.[ch])/, '\1{$(srcdir)}\2') if /nmake/i =~ $make end mfile.printf "%s", line.gsub(/\$\(hdrdir\)\/config.h/, '$(topdir)/config.h') end dfile.close end mfile.close end def extmake(target) if $force_static or $static_ext[target] $static = target else $static = false end unless $install or $clean return if $nodynamic and not $static end $OBJEXT = CONFIG['OBJEXT'] $LIBEXT = "a" $objs = nil $libs = CONFIG['DLDLIBS'].dup $local_flags = "" if /mswin32/ =~ RUBY_PLATFORM $LIBEXT = "lib" $local_flags = "-link /INCREMENTAL:no /EXPORT:Init_$(TARGET)" elsif /bccwin32/ =~ RUBY_PLATFORM $LIBEXT = "lib" end $LOCAL_LIBS = "" # to be assigned in extconf.rb $CFLAGS = "" $CPPFLAGS = CONFIG['CPPFLAGS'] $LDFLAGS = "" $LIBPATH = [$libdir] dir_config("opt") begin dir = Dir.pwd File.mkpath target unless File.directory?(target) Dir.chdir target $target = target $mdir = target unless $install or $clean if $static_ext.size > 0 || !File.exist?("./Makefile") || older("./Makefile", $setup) || older("./Makefile", "#{$top_srcdir}/ext/extmk.rb") || older("./Makefile", "#{$top_srcdir}/ext/#{target}/makefile.rb") || older("./Makefile", "#{$top_srcdir}/ext/#{target}/extconf.rb") then $defs = [] Logging::logfile 'mkmf.log' if File.exist?("#{$top_srcdir}/ext/#{target}/makefile.rb") load "#{$top_srcdir}/ext/#{target}/makefile.rb" elsif File.exist?("#{$top_srcdir}/ext/#{target}/extconf.rb") load "#{$top_srcdir}/ext/#{target}/extconf.rb" else create_makefile(target) end end end if File.exist?("./Makefile") if $static $extlist.push [$static, $target, File.basename($target)] end if $install if /bccwin32/ =~ RUBY_PLATFORM system "#{$make} -DDESTDIR=#{$destdir} install" else system "#{$make} install DESTDIR=#{$destdir}" end elsif $clean system "#{$make} #{$clean}" else unless system "#{$make} all" if ENV["MAKEFLAGS"] != "k" and ENV["MFLAGS"] != "-k" exit end end end end if $static $extlibs ||= "" $extlibs += " " + $DLDFLAGS if $DLDFLAGS $extlibs += " " + $LDFLAGS unless $LDFLAGS == "" $extlibs += " " + $libs unless $libs == "" $extlibs += " " + $LOCAL_LIBS unless $LOCAL_LIBS == "" end ensure rm_f "conftest*" Dir.chdir dir end end $make = ENV["MAKE"] $make ||= with_config("make-prog", "make") File::makedirs('ext') Dir::chdir('ext') # get static-link modules $static_ext = {} for setup in [CONFIG['setup'], File::join($top_srcdir, "ext", CONFIG['setup'])] if File.file? setup f = open(setup) while line = f.gets() line.chomp! line.sub!(/#.*$/, '') next if /^\s*$/ =~ line if /^option +nodynamic/ =~ line $nodynamic = true next end target = line.split[0] target = target.downcase if /mswin32|bccwin32/ =~ RUBY_PLATFORM $static_ext[target] = true end $setup = setup f.close break end end ext_prefix = "#{$top_srcdir}/ext" for d in Dir["#{ext_prefix}/**/*"] File.directory?(d) || next File.file?(d + "/MANIFEST") || next d.slice!(0, ext_prefix.length + 1) if $install print "installing ", d, "\n" elsif $clean print "cleaning ", d, "\n" else print "compiling ", d, "\n" if RUBY_PLATFORM =~ /-aix/ and older("../ruby.imp", "../miniruby") load "#{$top_srcdir}/ext/aix_mksym.rb" end end $stdout.flush extmake(d) end if $install or $clean Dir.chdir ".." exit end $extinit = "" unless $extinit ruby = CONFIG["RUBY_INSTALL_NAME"] + CONFIG["EXEEXT"] miniruby = "miniruby" + CONFIG["EXEEXT"] $extobjs = "" unless $extobjs if $extlist.size > 0 for s,t,i in $extlist f = format("%s/%s.%s", s, i, $LIBEXT) if File.exist?(f) $extinit += format("\ \tInit_%s();\n\ \trb_provide(\"%s.so\");\n\ ", i, t) $extobjs += "ext/" $extobjs += f $extobjs += " " else false end end if older("extinit.c", $setup) || older("extinit.c", "#{$top_srcdir}/ext/extmk.rb") f = open("extinit.c", "w") f.printf "void Init_ext() {\n" f.printf $extinit f.printf "}\n" f.close end if older("extinit.#{$OBJEXT}", "extinit.c") cmd = CONFIG["CC"] + " " + CFLAGS + " -c extinit.c" print cmd, "\n" system cmd or exit 1 end Dir.chdir ".." if older(ruby, $setup) or older(ruby, miniruby) rm_f ruby end $extobjs = "ext/extinit.#{$OBJEXT} " + $extobjs if RUBY_PLATFORM =~ /m68k-human|beos/ $extlibs.gsub!("-L/usr/local/lib", "") if $extlibs end system format(%[#{$make} #{ruby} EXTOBJS='%s' EXTLIBS='%s'], $extobjs, $extlibs) else Dir.chdir ".." if older(ruby, miniruby) rm_f ruby system("#{$make} #{ruby}") end end #Local variables: # mode: ruby #end: