source: trunk/gcc/libjava/testsuite/libjava.jni/jni.exp

Last change on this file was 1392, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1391,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.3 KB
Line 
1# Tests for JNI code.
2
3# Compile a single C file and produce a .so file. OPTIONS is a list
4# of options to pass to the compiler. Returns 0 on failure, 1 on
5# success.
6proc gcj_jni_compile_c_to_so {file {options {}}} {
7 global srcdir
8
9 set name [file rootname [file tail $file]]
10 set soname lib${name}.so
11
12 lappend options "additional_flags=-shared -fPIC"
13 # Find the generated header.
14 lappend options "additional_flags=-I. -I.."
15 # Find jni.h.
16 lappend options "additional_flags=-I$srcdir/../include"
17
18 set x [libjava_prune_warnings \
19 [target_compile $file $soname executable $options]]
20 if {$x != ""} {
21 verbose "target_compile failed: $x" 2
22 fail "$name.c compilation"
23 return 0
24 }
25
26 pass "$name.c compilation"
27 return 1
28}
29
30# Build a header file from a .class file. Return 0 on failure.
31proc gcj_jni_build_header {file} {
32 set gcjh [find_gcjh]
33 set file [file rootname $file]
34 set x [string trim [libjava_prune_warnings \
35 [lindex [local_exec "$gcjh -jni $file" "" "" 300] 1]]]
36 if {$x != ""} {
37 verbose "local_exec failed: $x" 2
38 fail "$file header generation"
39 return 0
40 }
41
42 pass "$file header generation"
43 return 1
44}
45
46# Invoke the program and see what happens. Return 0 on failure.
47proc gcj_invoke {program expectFile ld_library_additions} {
48 global env
49 set lib_path $env(LD_LIBRARY_PATH)
50
51 set newval .
52 if {[llength $ld_library_additions] > 0} {
53 append newval :[join $ld_library_additions :]
54 }
55 append newval :$lib_path
56
57 setenv LD_LIBRARY_PATH $newval
58 setenv SHLIB_PATH $newval
59
60 verbose "LD_LIBRARY_PATH=$env(LD_LIBRARY_PATH)"
61
62 set result [libjava_load ./$program]
63 set status [lindex $result 0]
64 set output [lindex $result 1]
65
66 # Restore setting
67 setenv LD_LIBRARY_PATH $lib_path
68 setenv SHLIB_PATH $lib_path
69
70 if {$status != "pass"} {
71 verbose "got $output"
72 fail "$program run"
73 untested "$program output"
74 return 0
75 }
76
77 set id [open $expectFile r]
78 set expected [read $id]
79 close $id
80
81 if {! [string compare $output $expected]} {
82 pass "$program output"
83 return 1
84 } else {
85 fail "$program output"
86 return 0
87 }
88}
89
90# Do all the work for a single JNI test. Return 0 on failure.
91proc gcj_jni_test_one {file} {
92 global runtests
93
94 # The base name. We use it for several purposes.
95 set main [file rootname [file tail $file]]
96 if {! [runtest_file_p $runtests $main]} {
97 # Simply skip it.
98 return 1
99 }
100
101 if {! [bytecompile_file $file [pwd]]} {
102 fail "bytecompile $file"
103 # FIXME - should use `untested' on all remaining tests.
104 # But that is hard.
105 return 0
106 }
107 pass "bytecompile $file"
108
109 set bytefile [file rootname [file tail $file]].class
110 if {! [gcj_jni_build_header $bytefile]} {
111 # FIXME
112 return 0
113 }
114
115 set cfile [file rootname $file].c
116 set cxxflags ""
117 set cxxldlibflags {}
118 # If there is no `.c' file, assume there is a `.cc' file.
119 if {! [file exists $cfile]} {
120 set cfile [file rootname $file].cc
121
122 set cxxflaglist {}
123 foreach arg [split [libjava_find_lib libstdc++-v3/src stdc++] " "] {
124 switch -glob -- $arg {
125 "-L*" {
126 set arg [string range $arg 2 end]
127 lappend cxxldlibflags $arg
128 # Strip the `.libs' directory; we link with libtool which
129 # doesn't need it.
130 set arg "-L[file dirname $arg]"
131 }
132 }
133 lappend cxxflaglist $arg
134 }
135
136 lappend cxxflaglist "-lstdc++"
137 set cxxflags [join $cxxflaglist]
138 }
139
140 if {! [gcj_jni_compile_c_to_so $cfile]} {
141 # FIXME
142 return 0
143 }
144
145 # We use -l$main because the .so is named the same as the main
146 # program.
147 set args [list "additional_flags=-fjni -L. -l$main $cxxflags"]
148 if {! [gcj_link $main $main $file $args]} {
149 # FIXME
150 return 0
151 }
152
153 if {! [gcj_invoke $main [file rootname $file].out $cxxldlibflags]} {
154 # FIXME
155 return 0
156 }
157
158 # When we succeed we remove all our clutter.
159 eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main lib${main}.so]
160
161 return 1
162}
163
164# Run the JNI tests.
165proc gcj_jni_run {} {
166 global srcdir subdir
167 global build_triplet host_triplet
168
169 # For now we only test JNI on native builds.
170 if {$build_triplet == $host_triplet} {
171 catch { lsort [glob -nocomplain ${srcdir}/${subdir}/*.java] } srcfiles
172
173 foreach x $srcfiles {
174 gcj_jni_test_one $x
175 }
176 } else {
177 verbose "JNI tests not run in cross-compilation environment"
178 }
179}
180
181gcj_jni_run
Note: See TracBrowser for help on using the repository browser.