mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			447 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			447 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation.
 | |
| # Written by Tom Tromey <tromey@cygnus.com>.
 | |
| # Incorporate Mauve into libjava's DejaGNU test suite framework.
 | |
| 
 | |
| # FIXME: should be able to compile from source as well as from .class.
 | |
| 
 | |
| 
 | |
| # Compute list of files to compile.  Returns list of all files
 | |
| # representing classes that must be tested.  Result parameter `uses'
 | |
| # maps source file names onto list of objects required for link.
 | |
| proc mauve_compute_uses {aName} {
 | |
|   upvar $aName uses
 | |
|   global env runtests
 | |
| 
 | |
|   set fd [open classes r]
 | |
|   set line [read $fd]
 | |
|   close $fd
 | |
| 
 | |
|   foreach item [split $line] {
 | |
|     if {$item == ""} then {
 | |
|       continue
 | |
|     }
 | |
|     set item [join [split $item .] /].java
 | |
| 
 | |
|     # User might have specified "mauve.exp=something.java".
 | |
|     if {! [runtest_file_p $runtests $item]} {
 | |
|       continue
 | |
|     }
 | |
| 
 | |
|     # Look for Uses line in source file.
 | |
|     set fd [open $env(MAUVEDIR)/$item r]
 | |
|     set ufiles [list $item]
 | |
|     set dir [file dirname $item]
 | |
|     while {[gets $fd sline] != -1} {
 | |
|       if {[regsub -- {^// Uses:} $sline {} sline]} then {
 | |
| 	foreach uf [split $sline] {
 | |
| 	  if {$uf != ""} then {
 | |
| 	    lappend ufiles $dir/$uf
 | |
| 	  }
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
|     close $fd
 | |
| 
 | |
|     set uses($item) {}
 | |
|     foreach file $ufiles {
 | |
|       set file [file rootname $file].o
 | |
|       lappend uses($item) $file
 | |
|       # Now add all inner classes
 | |
|       foreach inner [glob -nocomplain [file rootname $file]$*.class] {
 | |
| 	# Prevent excessive escaping by replacing $ with a ^ in the .o name
 | |
| 	set inner [file rootname $inner].o
 | |
| 	regsub -all "\\$" $inner "\^" inner
 | |
| 	lappend uses($item) $inner
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return [lsort [array names uses]]
 | |
| }
 | |
| 
 | |
| # Find Mauve sources.  At end, env(MAUVEDIR) points to sources.
 | |
| # Returns 0 if sources not found, 1 otherwise.
 | |
| proc find_mauve_sources {} {
 | |
|   global env srcdir
 | |
| 
 | |
|   if {[info exists env(MAUVEDIR)]} {
 | |
|     return 1
 | |
|   } elseif {[file isdirectory $srcdir/libjava.mauve/mauve]} {
 | |
|     set env(MAUVEDIR) $srcdir/libjava.mauve/mauve
 | |
|     return 1
 | |
|   }
 | |
| 
 | |
|   return 0
 | |
| }
 | |
| 
 | |
| # Find all the harness files and return a list of them, with no
 | |
| # suffix.
 | |
| proc mauve_find_harness_files {} {
 | |
|   set result {}
 | |
|   foreach file [glob -nocomplain -- *.class gnu/testlet/*.class] {
 | |
|     lappend result [file root $file]
 | |
|   }
 | |
|   return $result
 | |
| }
 | |
| 
 | |
| # Run all the Mauve tests.  Return 1 on success, 0 on any failure.  If
 | |
| # the tests are skipped, that is treated like success.
 | |
| proc test_mauve {} {
 | |
|   global srcdir objdir subdir env
 | |
| 
 | |
|   if {! [find_mauve_sources]} then {
 | |
|     verbose "MAUVEDIR not set; not running Mauve tests"
 | |
|     return 1
 | |
|   }
 | |
| 
 | |
|   # Run in subdir so we don't overwrite our own Makefile.
 | |
|   catch {system "rm -rf mauve-build"}
 | |
|   file mkdir mauve-build
 | |
|   # Some weirdness to set srcdir correctly.
 | |
|   set here [pwd]
 | |
|   cd $srcdir
 | |
|   set full_srcdir [pwd]
 | |
|   cd $here/mauve-build
 | |
| 
 | |
|   global env libgcj_jar
 | |
|   global GCJ_UNDER_TEST
 | |
|   global TOOL_EXECUTABLE
 | |
| 
 | |
|   if ![info exists GCJ_UNDER_TEST] {
 | |
|     if [info exists TOOL_EXECUTABLE] {
 | |
|       set GCJ_UNDER_TEST $TOOL_EXECUTABLE;
 | |
|     } else {
 | |
|       if [info exists env(GCJ)] {
 | |
| 	set GCJ_UNDER_TEST env(GCJ)
 | |
|       } else {
 | |
| 	set GCJ_UNDER_TEST "[find_gcj]"
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   # Append -B and -I so that libgcj.spec and libgcj.jar are found
 | |
|   # before they're installed.
 | |
|   # Append -Wno-deprecated since Mauve tests lots of deprecated stuff.
 | |
|   set env(GCJ) "$GCJ_UNDER_TEST -Wno-deprecated -B$objdir/../ -I$libgcj_jar"
 | |
| 
 | |
|   if {[catch {
 | |
|     system "$env(MAUVEDIR)/configure --with-gcj 2>&1"
 | |
|   } msg]} then {
 | |
|     fail "Mauve configure"
 | |
|     verbose "configure failed with $msg"
 | |
|     return 0
 | |
|   }
 | |
|   pass "Mauve configure"
 | |
| 
 | |
|   # Copy appropriate tags file locally.
 | |
|   set fd [open $full_srcdir/../mauve-libgcj r]
 | |
|   set c [read $fd]
 | |
|   close $fd
 | |
|   set fd [open mauve-libgcj w]
 | |
|   puts -nonewline $fd $c
 | |
|   close $fd
 | |
| 
 | |
|   catch {system "ln -s $full_srcdir/libjava.mauve/xfails xfails"}
 | |
| 
 | |
|   if {[catch {
 | |
|     system "make KEYS=libgcj classes.stamp 2>&1"
 | |
|   } msg]} then {
 | |
|     fail "Mauve build"
 | |
|     verbose "build failed with $msg"
 | |
|     return 0
 | |
|   }
 | |
|   pass "Mauve build"
 | |
| 
 | |
|   set srcfile $full_srcdir/$subdir/DejaGNUTestHarness.java
 | |
|   if {! [bytecompile_file $srcfile [pwd] $env(MAUVEDIR):[pwd]]} then {
 | |
|     fail "Compile DejaGNUTestHarness.java"
 | |
|     return 0
 | |
|   }
 | |
|   pass "Compile DejaGNUTestHarness.java"
 | |
| 
 | |
|   # Compute list of files to test, and also all files to build.
 | |
|   set choices [mauve_compute_uses uses]
 | |
| 
 | |
|   # Compute flags to use to do the build.
 | |
|   set compile_args [libjava_arguments]
 | |
|   set link_args [concat [libjava_arguments link] \
 | |
| 		   [list "additional_flags=--main=DejaGNUTestHarness"]]
 | |
| 
 | |
|   if {[string match "*libtool*" $compile_args]} {
 | |
|     set objext lo
 | |
|   } else {
 | |
|     set objext o
 | |
|   }
 | |
| 
 | |
|   set ok 1
 | |
|   set objlist {}
 | |
|   foreach base [mauve_find_harness_files] {
 | |
|     set file $base.class
 | |
|     set obj $base.$objext
 | |
|     set x [libjava_prune_warnings \
 | |
| 	     [target_compile [pwd]/$file $obj object $compile_args]]
 | |
|     if {$x != ""} then {
 | |
|       fail "Compile $obj"
 | |
|       set ok 0
 | |
|     } else {
 | |
|       pass "Compile $obj"
 | |
|     }
 | |
|     lappend objlist $obj
 | |
|   }
 | |
|   if {! $ok} then {
 | |
|     return 0
 | |
|   }
 | |
| 
 | |
|   set proc_ok 1
 | |
|   set Executable DejaGNUTestHarness
 | |
|   foreach file $choices {
 | |
|     # Turn `java/lang/Foo.java' into `java.lang.Foo'.
 | |
|     set class [file rootname $file]
 | |
|     regsub -all -- / $class . class
 | |
| 
 | |
|     set ok 1
 | |
|     set this_olist {}
 | |
|     foreach obj $uses($file) {
 | |
|       set obj [file rootname $obj].$objext
 | |
|       lappend this_olist $obj
 | |
|       if {! [file exists $obj]} then {
 | |
| 	verbose "compiling $obj for test of $class"
 | |
| 	# The .class file does contain a $, but we can quote it between "'"s.
 | |
| 	set srcfile [file rootname $obj].class
 | |
| 	regsub -all "\\^" $srcfile "\$" srcfile
 | |
| 	set x [libjava_prune_warnings \
 | |
| 		 [libjava_tcompile '[pwd]/$srcfile' $obj object $compile_args]]
 | |
| 	if {$x != ""} then {
 | |
| 	  fail "Compile $obj for $class"
 | |
| 	  set ok 0
 | |
| 	  break
 | |
| 	}
 | |
| 	pass "Compile $obj for $class"
 | |
|       }
 | |
|     }
 | |
|     if {! $ok} then {
 | |
|       set proc_ok 0
 | |
|       continue
 | |
|     }
 | |
| 
 | |
|     set x [libjava_prune_warnings \
 | |
| 	     [libjava_tcompile [concat $this_olist $objlist] \
 | |
| 		$Executable executable $link_args]]
 | |
|     if {$x != ""} then {
 | |
|       set proc_ok 0
 | |
|       fail "Link for $class"
 | |
|       continue
 | |
|     }
 | |
|     pass "Link for $class"
 | |
| 
 | |
|     set result [libjava_load [pwd]/DejaGNUTestHarness \
 | |
| 		  "$env(MAUVEDIR) $class" ""]
 | |
| 
 | |
|     # Extract pass/failure info from output.
 | |
|     foreach line [split [lindex $result 1] \n] {
 | |
|       if {[regexp -- {^(PASS|FAIL|XFAIL|XPASS): (.*)$} $line ignore what msg]} then {
 | |
| 	if {$what == "XFAIL" || $what == "XPASS"} then {
 | |
| 	  setup_xfail *-*-*
 | |
| 	}
 | |
| 	if {$what == "PASS" || $what == "XPASS"} then {
 | |
| 	  pass $msg
 | |
| 	} else {
 | |
| 	  set proc_ok 0
 | |
| 	  fail $msg
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return $proc_ok
 | |
| }
 | |
| 
 | |
| # Run all the Mauve tests in a sim environment.  In this case, the
 | |
| # program cannot use argv[] because there's no way to pass in the
 | |
| # command line, so tha name of the class to test is substituted by
 | |
| # patching the source of the DejaGNUTestHarness.  Return 1 on success,
 | |
| # 0 on any failure.  If the tests are skipped, that is treated like
 | |
| # success.
 | |
| proc test_mauve_sim {} {
 | |
|   global srcdir subdir env
 | |
| 
 | |
|   if {! [find_mauve_sources]} then {
 | |
|     verbose "MAUVEDIR not set; not running Mauve tests"
 | |
|     return 1
 | |
|   }
 | |
| 
 | |
|   # Run in subdir so we don't overwrite our own Makefile.
 | |
|   catch {system "rm -rf mauve-build"}
 | |
|   file mkdir mauve-build
 | |
|   # Some weirdness to set srcdir correctly.
 | |
|   set here [pwd]
 | |
|   cd $srcdir
 | |
|   set full_srcdir [pwd]
 | |
|   cd $here/mauve-build
 | |
| 
 | |
|   if {[catch {
 | |
|     system "$env(MAUVEDIR)/configure --with-gcj 2>&1"
 | |
|   } msg]} then {
 | |
|     fail "Mauve configure"
 | |
|     verbose "configure failed with $msg"
 | |
|     return 0
 | |
|   }
 | |
|   pass "Mauve configure"
 | |
| 
 | |
|   # Copy appropriate tags file locally.
 | |
|   set fd [open $full_srcdir/../mauve-libgcj r]
 | |
|   set c [read $fd]
 | |
|   close $fd
 | |
|   set fd [open mauve-libgcj w]
 | |
|   puts -nonewline $fd $c
 | |
|   close $fd
 | |
| 
 | |
|   catch {system "ln -s $full_srcdir/libjava.mauve/xfails xfails"}
 | |
| 
 | |
|   if {[catch {
 | |
|     system "make KEYS=libgcj classes.stamp 2>&1"
 | |
|   } msg]} then {
 | |
|     fail "Mauve build"
 | |
|     verbose "build failed with $msg"
 | |
|     return 0
 | |
|   }
 | |
|   pass "Mauve build"
 | |
| 
 | |
|   # Compute list of files to test, and also all files to build.
 | |
|   set choices [mauve_compute_uses uses]
 | |
| 
 | |
|   # Compute flags to use to do the build.
 | |
|   set compile_args [libjava_arguments]
 | |
|   set link_args [concat [libjava_arguments link] \
 | |
| 		   [list "additional_flags=--main=DejaGNUTestHarness"]]
 | |
| 
 | |
|   set ok 1
 | |
|   set objlist {}
 | |
|   foreach base [mauve_find_harness_files] {
 | |
|     set file $base.class
 | |
|     set obj $base.o
 | |
|     set x [libjava_prune_warnings \
 | |
| 	     [target_compile [pwd]/$file $obj object $compile_args]]
 | |
|     if {$x != ""} then {
 | |
|       fail "Compile $obj"
 | |
|       set ok 0
 | |
|     } else {
 | |
|       pass "Compile $obj"
 | |
|     }
 | |
|     lappend objlist $obj
 | |
|   }
 | |
|   if {! $ok} then {
 | |
|     return 0
 | |
|   }
 | |
| 
 | |
|   set proc_ok 1
 | |
|   set Executable DejaGNUTestHarness
 | |
|   foreach file $choices {
 | |
|     # Turn `java/lang/Foo.java' into `java.lang.Foo'.
 | |
|     
 | |
|     set class [file rootname $file]
 | |
|     regsub -all -- / $class . class
 | |
| 
 | |
|     set ok 1
 | |
|     foreach obj $uses($file) {
 | |
|       if {! [file exists $obj]} then {
 | |
| 	verbose "compiling $obj for test of $class"
 | |
| 	set srcfile [file rootname $obj].class
 | |
| 	set x [libjava_prune_warnings \
 | |
| 		 [target_compile [pwd]/$srcfile $obj object $compile_args]]
 | |
| 	if {$x != ""} then {
 | |
| 	  fail "Compile $obj for $class"
 | |
| 	  set ok 0
 | |
| 	  break
 | |
| 	}
 | |
| 	pass "Compile $obj for $class"
 | |
|       }
 | |
|     }
 | |
|     if {! $ok} then {
 | |
|       set proc_ok 0
 | |
|       continue
 | |
|     }
 | |
| 
 | |
|     set infile $full_srcdir/$subdir/DejaGNUTestHarness.java
 | |
|     set srcfile DejaGNUTestHarness.java
 | |
|     set f [open $infile r]
 | |
|     set d [open gnu/testlet/$srcfile w]
 | |
|     while {[gets $f line] >= 0} {
 | |
| 	if [regexp {harness\.runtest \(args\[1\]\)} $line] then {
 | |
| 	    regsub {args\[1\]} $line "\"$class\"" out
 | |
| 	} else {
 | |
| 	    set out $line
 | |
| 	}
 | |
| 	puts $d $out
 | |
|     }
 | |
|     close $f
 | |
|     close $d
 | |
| 
 | |
|     if {! [bytecompile_file [pwd]/gnu/testlet/$srcfile [pwd]/gnu/testlet \
 | |
| 	       $env(MAUVEDIR):[pwd]]} then {
 | |
| 	fail "Compile DejaGNUTestHarness.java"
 | |
| 	return 0
 | |
|     }
 | |
| 
 | |
|     set x [libjava_prune_warnings \
 | |
| 	     [target_compile DejaGNUTestHarness.class \
 | |
| 		DejaGNUTestHarness.o object $compile_args]]
 | |
|     if {$x != ""} then {
 | |
| 	fail "Compile DejaGNUTestHarness.java"
 | |
|         set proc_ok 0
 | |
| 	continue
 | |
|     }
 | |
| 
 | |
|     set x [libjava_prune_warnings \
 | |
| 	     [target_compile [concat $uses($file) $objlist] \
 | |
| 		$Executable executable $link_args]]
 | |
|     if {$x != ""} then {
 | |
|       set proc_ok 0
 | |
|       fail "Link for $class"
 | |
|       continue
 | |
|     }
 | |
|     pass "Link for $class"
 | |
| 
 | |
|     set result [libjava_load [pwd]/DejaGNUTestHarness \
 | |
| 		  "$env(MAUVEDIR) $class" ""]
 | |
| 
 | |
|     # Extract pass/failure info from output.
 | |
|     foreach line [split [lindex $result 1] \n] {
 | |
|       if {[regexp -- {^(PASS|FAIL|XFAIL|XPASS): (.*)$} $line ignore what msg]} then {
 | |
| 	if {$what == "XFAIL" || $what == "XPASS"} then {
 | |
| 	  setup_xfail *-*-*
 | |
| 	}
 | |
| 	if {$what == "PASS" || $what == "XPASS"} then {
 | |
| 	  pass $msg
 | |
| 	} else {
 | |
| 	  set proc_ok 0
 | |
| 	  fail $msg
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return $proc_ok
 | |
| }
 | |
| 
 | |
| proc gcj_run_mauve_tests {} {
 | |
|   # The test_mauve* procs will change the current directory.  It's
 | |
|   # simpler to fix this up here than to keep track of this in the
 | |
|   # procs.
 | |
|   set here [pwd]
 | |
|   if { [board_info target exists is_simulator] } {
 | |
|     set r [test_mauve_sim]
 | |
|   } else {
 | |
|     set r [test_mauve]
 | |
|   }
 | |
|   cd $here
 | |
| 
 | |
|   if {$r} {
 | |
|     # No need to keep the build around.  FIXME: this knows how the
 | |
|     # tests work.  This whole file could use a rewrite.
 | |
|     system "rm -rf mauve-build"
 | |
|   }
 | |
| }
 | |
| 
 | |
| gcj_run_mauve_tests
 |