From 849b1000b082186b17b851df8fb3b1654fd58cd3 Mon Sep 17 00:00:00 2001 From: eban Date: Mon, 23 Sep 2002 11:01:49 +0000 Subject: * configure.in (RUBY_MINGW32): new macro. check for the MinGW compiler envionment. * lib/mkmf.rb: refactoring. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2883 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 ++ configure.in | 40 ++++++++++-- lib/mkmf.rb | 210 +++++++++++++++++++++++++++++------------------------------ 3 files changed, 144 insertions(+), 113 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2e522516c3..8e7830bf89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Sep 23 19:57:52 2002 WATANABE Hirofumi + + * configure.in (RUBY_MINGW32): new macro. check for the MinGW + compiler envionment. + + * lib/mkmf.rb: refactoring. + Sun Sep 22 21:49:42 2002 Nobuyoshi Nakada * eval.c (call_trace_func): should not call trace function while diff --git a/configure.in b/configure.in index 4ed1081720..0f8272bb67 100644 --- a/configure.in +++ b/configure.in @@ -3,6 +3,35 @@ AC_INIT() AC_PREREQ(2.50) +AC_DEFUN(RUBY_MINGW32, +[case "$host_os" in +cygwin*) +AC_CACHE_CHECK(for mingw32 environment, rb_cv_mingw32, +[AC_TRY_CPP([ +#ifndef __MINGW32__ +# error +#endif +], rb_cv_mingw32=yes,rb_cv_mingw32=no) +rm -f conftest*]) +test "$rb_cv_mingw32" = yes && target_os="mingw32" + ;; +esac]) + +AC_DEFUN(RUBY_CPPOUTFILE, +[AC_CACHE_CHECK(whether ${CPP} accepts -o, rb_cv_cppoutfile, +[cppflags=$CPPFLAGS +CPPFLAGS='-o conftest.i' +AC_TRY_CPP([], rb_cv_cppoutfile=yes, rb_cv_cppoutfile=no) +if test "$rb_cv_cppoutfile" = yes; then + CPPOUTFILE=$CPPFLAGS +else + CPPOUTFILE='> conftest.i' +fi +CPPFLAGS=$cppflags +AC_SUBST(CPPOUTFILE) +rm -f conftest*]) +]) + rb_version=`grep RUBY_VERSION $srcdir/version.h` MAJOR=`expr "$rb_version" : '#define RUBY_VERSION "\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*"'` MINOR=`expr "$rb_version" : '#define RUBY_VERSION "[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*"'` @@ -98,16 +127,13 @@ fi AC_PROG_CC AC_PROG_GCC_TRADITIONAL -echo 'foo(){}' > conftest.c -if ${CPP} -o conftest.i conftest.c >/dev/null 2>&1; then - CPPOUTFILE='-o conftest.i' -else - CPPOUTFILE='> conftest.i' -fi -AC_SUBST(CPPOUTFILE) +RUBY_CPPOUTFILE + OUTFLAG='-o ' AC_SUBST(OUTFLAG) +RUBY_MINGW32 + AC_PROG_YACC AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(AR, ar) diff --git a/lib/mkmf.rb b/lib/mkmf.rb index a47b0d4e6e..04e6acdb6c 100644 --- a/lib/mkmf.rb +++ b/lib/mkmf.rb @@ -44,6 +44,12 @@ $sitelibdir = CONFIG["sitelibdir"] $sitearchdir = CONFIG["sitearchdir"] $extmk = /extmk\.rb/ =~ $0 +$mswin = /mswin/ =~ RUBY_PLATFORM +$bccwin = /bccwin/ =~ RUBY_PLATFORM +$mingw = /mingw/ =~ RUBY_PLATFORM +$cygwin = /cygwin/ =~ RUBY_PLATFORM +$human = /human/ =~ RUBY_PLATFORM +$netbsd = /netbsd/ =~ RUBY_PLATFORM def dir_re(dir) Regexp.new('\$(?:\('+dir+'\)|\{'+dir+'\})(?:\$\(target_prefix\)|\{target_prefix\})?') @@ -73,7 +79,7 @@ end $topdir = $hdrdir CFLAGS = CONFIG["CFLAGS"] -if RUBY_PLATFORM == "m68k-human" +if $human CFLAGS.gsub!(/-c..-stack=[0-9]+ */, '') elsif RUBY_PLATFORM =~ /-nextstep|-rhapsody|-darwin/ CFLAGS.gsub!( /-arch\s\w*/, '' ) @@ -82,12 +88,10 @@ end OUTFLAG = CONFIG['OUTFLAG'] CPPOUTFILE = CONFIG['CPPOUTFILE'] -$LINK = "#{CONFIG['CC']} #{OUTFLAG}conftest %s -I#{$hdrdir} %s #{CFLAGS} %s #{CONFIG['LDFLAGS']} %s conftest.c %s %s #{CONFIG['LIBS']}" -$CC = "#{CONFIG['CC']} -c #{CONFIG['CPPFLAGS']} %s -I#{$hdrdir} %s #{CFLAGS} %s %s conftest.c" -$CPP = "#{CONFIG['CPP']} #{CONFIG['CPPFLAGS']} %s -I#{$hdrdir} %s #{CFLAGS} %s %s %s conftest.c" +LIBPATHFLAG = $mswin ? ' -libpath:' : ' -L' +CONFTEST_C = "conftest.c" - -$INSTALLFILES = nil unless defined? $INSTALLFILES +$INSTALLFILES ||= nil def rm_f(*files) targets = [] @@ -164,109 +168,109 @@ def xpopen command, *mode, &block end end -def try_link0(src, opt="") - src = "/* begin */\n#{src}/* end */\n" - cfile = open("conftest.c", "w") - cfile.print src - cfile.close - ldflags = $LDFLAGS - if /mswin32|bccwin32/ =~ RUBY_PLATFORM and !$LIBPATH.empty? - ENV['LIB'] = ($LIBPATH + [ORIG_LIBPATH]).compact.join(';') - else - $LDFLAGS = ldflags.dup - $LIBPATH.each {|d| $LDFLAGS << " -L" + d} - end - begin - xsystem(format($LINK, $INCFLAGS, $CPPFLAGS, $CFLAGS, $LDFLAGS, opt, $LOCAL_LIBS)) - ensure - $LDFLAGS = ldflags - ENV['LIB'] = ORIG_LIBPATH if /mswin32|bccwin32/ =~ RUBY_PLATFORM - Logging::message <<"EOM" +def log_src(src) + Logging::message <<"EOM" checked program was: -#{src} +/* begin */ +#{src}/* end */ + EOM +end + +def create_tmpsrc(src) + open(CONFTEST_C, "w") do |cfile| + cfile.print src end end -def try_link(src, opt="") - begin - try_link0(src, opt) - ensure - rm_f "conftest*" - if /bccwin32/ =~ RUBY_PLATFORM - rm_f "c0x32*" - end +def try_do(src, command) + src += "\n" unless /\n\z/ =~ src + create_tmpsrc(src) + xsystem(command) +ensure + log_src(src) +end + +def link_command(ldflags, opt="") +# ldflags = "-link " + ldflags if $mswin + "$(CC) #{OUTFLAG}conftest #$INCFLAGS -I#{$hdrdir} " \ + "#$CPPFLAGS $(CFLAGS) #$CFLAGS #{CONFTEST_C} #{opt} " \ + "#$LOCAL_LIBS $(LIBS) #{ldflags} $(LDFLAGS) #$LDFLAGS" +end + +def cc_command(opt="") + "$(CC) -c $(CPPFLAGS) #$INCFLAGS -I#{$hdrdir} " \ + "#$CPPFLAGS $(CFLAGS) #$CFLAGS #{opt} #{CONFTEST_C}" +end + +def cpp_command(outfile, opt="") + "$(CPP) $(CPPFLAGS) #$INCFLAGS -I#{$hdrdir} " \ + "#$CPPFLAGS $(CFLAGS) #$CFLAGS #{outfile} #{opt} #{CONFTEST_C}" +end + +def libpathflag + if $mswin + ENV['LIB'] = ($LIBPATH + [ORIG_LIBPATH]).join(';') + yield "" + ENV['LIB'] = ORIG_LIBPATH + else + yield $LIBPATH.map{|x| %Q[#{LIBPATHFLAG}"#{x}"]}.join end end -def try_compile(src, opt="") - src = "/* begin */\n#{src}/* end */\n" - cfile = open("conftest.c", "w") - cfile.print src - cfile.close - begin - xsystem(format($CC, $INCFLAGS, $CPPFLAGS, $CFLAGS, opt)) - ensure - rm_f "conftest*" - Logging::message <<"EOM" -checked program was: -#{src} -EOM +def try_link0(src, opt="") + libpathflag do |flag| + try_do(src, link_command(flag, opt)) end end +def try_link(src, opt="") + try_link0(src, opt) +ensure + rm_f "conftest*", "c0x32*" +end + +def try_compile(src, opt="") + try_do(src, cc_command(opt)) +ensure + rm_f "conftest*" +end + def try_cpp(src, opt="") - src = "/* begin */\n#{src}/* end */\n" - cfile = open("conftest.c", "w") - cfile.print src - cfile.close - begin - xsystem(format($CPP, $INCFLAGS, $CPPFLAGS, $CFLAGS, CPPOUTFILE, opt)) - ensure - rm_f "conftest*" - Logging::message <<"EOM" -checked program was: -#{src} -EOM - end + try_do(src, cpp_command(CPPOUTFILE, opt)) +ensure + rm_f "conftest*" end def egrep_cpp(pat, src, opt="") - src = "/* begin */\n#{src}/* end */\n" - cfile = open("conftest.c", "w") - cfile.print src - cfile.close - begin - xpopen(format($CPP, $INCFLAGS, $CPPFLAGS, $CFLAGS, '', opt)) do |f| - if Regexp === pat - puts(" ruby -ne 'print if /#{pat.source}/'") - f.grep(pat) {|l| - puts "#{f.lineno}: #{l}" - return true - } - false - else - puts(" egrep '#{pat}'") - begin - stdin = $stdin.dup - $stdin.reopen(f) - system("egrep", pat) - ensure - $stdin.reopen(stdin) - end + src += "\n" unless /\n\z/ =~ src + create_tmpsrc(src) + xpopen(cpp_command('', opt)) do |f| + if Regexp === pat + puts(" ruby -ne 'print if /#{pat.source}/'") + f.grep(pat) {|l| + puts "#{f.lineno}: #{l}" + return true + } + false + else + puts(" egrep '#{pat}'") + begin + stdin = $stdin.dup + $stdin.reopen(f) + system("egrep", pat) + ensure + $stdin.reopen(stdin) end end - ensure - rm_f "conftest*" - Logging::message <<"EOM" -checked program was: -#{src} -EOM end +ensure + rm_f "conftest*" + log_src(src) end def macro_defined?(macro, src, opt="") - try_cpp(src + < @@ -469,7 +467,7 @@ end def have_struct_member(type, member, header=nil) message "checking for #{type}.#{member}... " - Logging::message "checking for #{type}.#{member}\n" + Logging::message "have_struct_member: checking for #{type}.#{member}\n" src = if /mswin32|bccwin32|mingw/ =~ RUBY_PLATFORM @@ -505,7 +503,7 @@ end def find_executable(bin, path = nil) message "checking for #{bin}... " - Logging::message "checking for #{bin}\n" + Logging::message "find_executable: checking for #{bin}\n" if path.nil? path = ENV['PATH'].split(Config::CONFIG['PATH_SEPARATOR']) -- cgit v1.2.3