From e7ce523bb172c36b61cd5fc8d141a4488323bd84 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 21 Oct 2002 14:03:46 +0000 Subject: * configure.in (XCFLAGS): CFLAGS to comile ruby itself. * configure.in (LIBEXT): suffix for static libraries. * configure.in (LIBPATHFLAG): switch template to specify library path. * configure.in (LINK_SO): command to link shared objects. * configure.in (DEFFILE, ARCHFILE): miscellaneous system dependent files. * configure.in (EXPORT_PREFIX): prefix to exported symbols on Windows. * configure.in (COMMON_LIBS, COMMON_MACROS, COMMON_HEADERS): libraries, macros and headers used in common. * configure.in (RUBYW_INSTALL_NAME, rubyw_install_name): GUI mode excutable name. * Makefile.in (CFLAGS): append XCFLAGS. * Makefile.in (PREP): miscellaneous system dependent files. * Makefile.in (ruby.imp, ext/extinit.o): moved from ext/extmk.rb. * Makefile.in (fake.rb): CROSS_COMPILING keeps building platform. * Makefile.in (MAKEFILES): depend on *.in and config.status. * Makefile.in (parse.c): replace "y.tab.c" with actual name for byacc. * ext/extmk.rb, lib/mkmf.rb: integrated. * ext/extmk.rb: propagate MFLAGS. * ext/extmk.rb (extmake): make dummy Makefile to clean even if no Makefile is made. * lib/mkmf.rb (older): accept multiple file names and Time objects. * lib/mkmf.rb (xsystem): split and qoute. * lib/mkmf.rb (cpp_include): make include directives. * lib/mkmf.rb (try_func): try wheather specified function is available. * lib/mkmf.rb (install_files): default to site-install. * lib/mkmf.rb (checking_for): added. * lib/mkmf.rb (find_executable0): just find executable file with no message. * lib/mkmf.rb (create_header): output header file is variable. * lib/mkmf.rb (create_makefile): separate sections. * lib/mkmf.rb (init_mkmf): initialize global variables. * win32/Makefile.sub, bcc32/Makefile.sub (CPP, AR): added. * bcc32/Makefile.sub (ARCH): fixed to i386. * win32/Makefile.sub, bcc32/Makefile.sub (miniruby): should not link EXTOBJS. * ext/dl/extconf.rb: use try_cpp to cross compile. * ext/dl/extconf.rb: not modify files in source directory. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2974 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/dl/extconf.rb | 39 ++-- ext/extmk.rb | 545 +++++++++++------------------------------------------- 2 files changed, 123 insertions(+), 461 deletions(-) (limited to 'ext') diff --git a/ext/dl/extconf.rb b/ext/dl/extconf.rb index 46b3c6c87d..dd9c3844e4 100644 --- a/ext/dl/extconf.rb +++ b/ext/dl/extconf.rb @@ -33,19 +33,25 @@ else end $with_dlstack = ! $with_asm -$with_type_int = try_run(< /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 +$hdrdir = $top_srcdir def extmake(target) + print "#{$message} #{target}\n" + $stdout.flush if $force_static or $static_ext[target] $static = target else $static = false end - unless $install or $clean + unless $ignore 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] - $INCFLAGS = "-I#{$topdir}" - - dir_config("opt") + init_mkmf begin dir = Dir.pwd @@ -388,164 +47,176 @@ def extmake(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") + $srcdir = File.join($top_srcdir, "ext", $mdir) + unless $ignore + if $static || + older("./Makefile", *MTIMES + %w"#{$srcdir}/makefile.rb #{$srcdir}/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" + Config::CONFIG["srcdir"] = $srcdir + if File.exist?("#{$srcdir}/makefile.rb") + load "#{$srcdir}/makefile.rb" + elsif File.exist?("#{$srcdir}/extconf.rb") + load "#{$srcdir}/extconf.rb" else create_makefile(target) end + Config::CONFIG["srcdir"] = $top_srcdir end end if File.exist?("./Makefile") if $static - $extlist.push [$static, $target, File.basename($target)] + $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 + unless system *ARGV + $ignore or $continue or exit(1) end + else + open("./Makefile", "w") {|f| + f.print configuration($srcdir), makerules(nil) + } end if $static + $extflags ||= "" $extlibs ||= "" - $extlibs += " " + $DLDFLAGS if $DLDFLAGS - $extlibs += " " + $LDFLAGS unless $LDFLAGS == "" + $extflags += " " + $DLDFLAGS if $DLDFLAGS + $extflags += " " + $LDFLAGS unless $LDFLAGS == "" $extlibs += " " + $libs unless $libs == "" $extlibs += " " + $LOCAL_LIBS unless $LOCAL_LIBS == "" end + rescue SystemExit + # ignore ensure rm_f "conftest*" Dir.chdir dir end end -$make = ENV["MAKE"] -$make ||= with_config("make-prog", "make") +if ARGV[0] == "static" + ARGV.shift + $force_static = true +end + +$make = ARGV[0] if ARGV[0] +ARGV << $make if ARGV.empty? and $make +if mflags = ENV["MAKEFLAGS"] + mflags, = mflags.split(nil, 2) +else + mflags = ENV["MFLAGS"] || "" +end +$continue = mflags.include?(?k) +$dryrun = mflags.include?(?n) + +unless $message + if ARGV.size > 1 and /^[a-z]+$/ =~ ($message = ARGV[-1]) + $message = $message.sub(/^(?:dist|real)(?=(?:clean)?$)/, '\1') + case $message + when "clean" + $ignore ||= true + when "install" + $ignore ||= true + ARGV[1, 0] = ["INSTALL_PROG=install -m 0755", "INSTALL_DATA=install -m 0644"] if $dryrun + end + $message.sub!(/e?$/, "ing") + else + $message = "compiling" + end +end + +EXEEXT = CONFIG['EXEEXT'] +if defined? CROSS_COMPILING + $ruby = CONFIG['MINIRUBY'] +elsif $nmake + $ruby = '$(topdir:/=\\)\\miniruby' + EXEEXT +else + $ruby = '$(topdir)/miniruby' + EXEEXT +end +$ruby << " -I$(topdir) -I$(hdrdir)/lib" +$config_h = '$(topdir)/config.h' -File::makedirs('ext') -Dir::chdir('ext') +MTIMES = [File.mtime(__FILE__)] # get static-link modules $static_ext = {} -for setup in [CONFIG['setup'], File::join($top_srcdir, "ext", CONFIG['setup'])] +for dir in ["ext", File::join($top_srcdir, "ext")] + setup = File::join(dir, 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 + target, opt = line.split(nil, 3) + if target == 'option' + case opt + when 'nodynamic' + $nodynamic = true + end next end - target = line.split[0] target = target.downcase if /mswin32|bccwin32/ =~ RUBY_PLATFORM $static_ext[target] = true end + MTIMES << f.mtime $setup = setup f.close break end end +File::makedirs('ext') +Dir::chdir('ext') + ext_prefix = "#{$top_srcdir}/ext" -for d in Dir["#{ext_prefix}/**/*"] - File.directory?(d) || next - File.file?(d + "/MANIFEST") || next - +Dir.glob("#{ext_prefix}/**/MANIFEST") do |d| + d = File.dirname(d) 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 +if $ignore 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 + $extinit ||= "" + $extobjs ||= "" 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 + $extinit += "\tInit_#{i}();\n\trb_provide(\"#{t}.so\");\n" + $extobjs += "ext/#{f} " 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 + src = "void Init_ext() {\n#$extinit}\n" + if older("extinit.c", *MTIMES) || IO.read("extinit.c") != src + open("extinit.c", "w") {|f| f.print src} 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 + conf = ['SETUP='+$setup, 'EXTOBJS='+$extobjs.strip] + conf << 'EXTLIBS='+$extlibs.strip if $extlibs + conf << 'EXTLDFLAGS='+$extflags.strip if $extflags + puts conf + ARGV.concat(conf) end +rubies = [] +%w[RUBY RUBYW].each {|r| + r = CONFIG[r+"_INSTALL_NAME"] and !r.empty? and rubies << r+EXEEXT +} + +Dir.chdir ".." +puts "making #{rubies.join(', ')}" +ARGV.concat(rubies) +host = (defined?(CROSS_COMPILING) ? CROSS_COMPILING : RUBY_PLATFORM) +/mswin|bccwin|mingw|djgpp|human|os2|macos/ =~ host or exec(*ARGV) +system(*ARGV.quote) or exit($?.exitstatus) #Local variables: # mode: ruby -- cgit v1.2.3