| # Tests for CNI code. |
| |
| # Compile a single C++ file and produce a .o file. OPTIONS is a list |
| # of options to pass to the compiler. Returns 0 on failure, 1 on |
| # success. |
| proc gcj_cni_compile_cxx_to_o {file {options {}}} { |
| global srcdir subdir |
| |
| set name [file rootname [file tail $file]] |
| set oname ${name}.o |
| |
| # Find the generated header. |
| lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir -fdollars-in-identifiers" |
| # Find libgcj headers. |
| lappend options "additional_flags=-I$srcdir/.." |
| |
| set x [libjava_prune_warnings \ |
| [target_compile $file $oname object $options]] |
| if {$x != ""} { |
| verbose "target_compile failed: $x" 2 |
| fail "[file tail $file] compilation" |
| return 0 |
| } |
| |
| pass "[file tail $file] compilation" |
| return 1 |
| } |
| |
| # Build header files given name of .java file. Return 0 on failure. |
| proc gcj_cni_build_headers {file} { |
| global libgcj_jar |
| |
| set gcjh [find_gcjh] |
| |
| # Currently we only build a header file for the main class from the |
| # .java file, and then others on an ad hoc basis. |
| set list {} |
| set main [file rootname [file tail $file]] |
| lappend list $main |
| # ... for instance, an obvious hack. |
| if {$main == "shortfield"} { |
| lappend list shortfieldbase |
| } |
| |
| foreach file $list { |
| set cmd "$gcjh -cni -force -classpath .:$libgcj_jar $file" |
| verbose $cmd |
| set x [string trim [libjava_prune_warnings \ |
| [lindex [local_exec $cmd "" "" 300] 1]]] |
| if {$x != ""} { |
| verbose "local_exec failed: $x" 2 |
| fail "$main header generation" |
| return 0 |
| } |
| } |
| |
| pass "$main header generation" |
| return 1 |
| } |
| |
| # Do all the work for a single CNI test. Return 0 on failure. |
| proc gcj_cni_test_one {file} { |
| global runtests |
| |
| # The base name. We use it for several purposes. |
| set main [file rootname [file tail $file]] |
| if {! [runtest_file_p $runtests $main]} { |
| # Simply skip it. |
| return 1 |
| } |
| |
| # if {! [bytecompile_file $file [pwd]]} { |
| # fail "bytecompile $file" |
| # # FIXME - should use `untested' on all remaining tests. |
| # # But that is hard. |
| # return 0 |
| # } |
| # pass "bytecompile $file" |
| |
| # if {! [gcj_cni_build_headers $file]} { |
| # # FIXME |
| # return 0 |
| # } |
| |
| set cfile [file join [file dirname $file] nat$main.cc] |
| if {! [gcj_cni_compile_cxx_to_o $cfile]} { |
| # FIXME |
| return 0 |
| } |
| |
| if {! [gcj_link $main $main [list $file nat$main.o]]} { |
| # FIXME |
| return 0 |
| } |
| |
| if {! [gcj_invoke $main [file rootname $file].out {}]} { |
| # FIXME |
| return 0 |
| } |
| |
| # When we succeed we remove all our clutter. |
| eval gcj_cleanup [glob -nocomplain -- ${main}.*] [list $main nat$main.o] |
| |
| return 1 |
| } |
| |
| # Run the CNI tests. |
| proc gcj_cni_run {} { |
| global srcdir subdir |
| global build_triplet host_triplet |
| |
| # For now we only test CNI on native builds. |
| if {$build_triplet == $host_triplet} { |
| catch { lsort [glob -nocomplain ${srcdir}/${subdir}/*.jar] } srcfiles |
| |
| foreach x $srcfiles { |
| gcj_cni_test_one $x |
| } |
| } else { |
| verbose "CNI tests not run in cross-compilation environment" |
| } |
| } |
| |
| gcj_cni_run |