# Copyright (C) 2001-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. # Please email any bugs, comments, and/or additions to this file to: # bug-dejagnu@prep.ai.mit.edu # Written by DJ Delorie if {![istarget "i*86-*-*"] && ![istarget "x86_64-*-mingw*"] && ![istarget "x86_64-*-cygwin"] } { verbose "Not a Cygwin/Mingw target" 1 return } if {![info exists WINDRES]} then { verbose "WINDRES not defined" 1 return } if {[which $WINDRES] == 0} then { verbose "$WINDRES not found" 1 return } set wr "$WINDRES --include-dir $srcdir/$subdir" if [file exists "$srcdir/../../winsup/w32api/include"] { set wr "$wr --include-dir $srcdir/../../winsup/w32api/include" } else { send_log "\nWarning: Assuming windres can find the win32 headers\n\n" } set res_list [lsort [glob -nocomplain $srcdir/$subdir/*.rc]] proc oneline { file } { while { 1 } { if { [gets $file line] == -1 } { return "" } if [regexp "^ \[0-9a-z\]\[0-9a-z\]* " $line] { return $line } } } foreach res $res_list { set sroot [file rootname $res] set broot [file tail $sroot] set done 0 set cpp_opts "" set rc [open $res] while { [gets $rc line] != -1 } { if ![regexp "^(//|/\*|#)" $line] { break } if [regexp "\[xp\]fail *(\[^ \]*)" $line junk sys] { setup_xfail $sys continue } if [regexp "cpparg *(\[^ \]*)" $line junk cppopt] { set cpp_opts "--preprocessor-arg \"$cppopt\"" continue } } verbose "$wr -J rc -O res $res tmpdir/$broot.res" 1 catch "exec $wr $cpp_opts -J rc -O res $res tmpdir/$broot.res" err if ![string match "" $err] then { send_log "$err\n" verbose "$err" 1 if [string match "*windows.h: No such file*" $err] then { unsupported "windres/$broot (parse)" } else { fail "windres/$broot (parse)" } continue } pass "windres/$broot (parse)" set rc [open $res] while { [gets $rc line] != -1 } { if ![regexp "^(//|/\*|#)" $line] { break } if [regexp "parse-only" $line] { file delete "tmpdir/$broot.res" set done 1 break } if [regexp "\[xc\]fail *(\[^ \]*)" $line junk sys] { setup_xfail $sys continue } } if { $done != 0 } { continue } verbose "$OBJDUMP -b binary -s tmpdir/$broot.res > tmpdir/$broot.dump" 1 catch "exec $OBJDUMP -b binary -s tmpdir/$broot.res > tmpdir/$broot.dump" err if ![string match "" $err] then { send_log "$err\n" verbose "$err" 1 fail "windres/$broot (compare)" continue } set pat [open "$sroot.rsd"] set out [open "tmpdir/$broot.dump"] set patline "foo" while { ![string match $patline ""] } { set patline [oneline $pat] set outline [oneline $out] if ![string match $patline $outline] { send_log "< $patline\n" send_log "> $outline\n" fail "windres/$broot (compare)" set done 1 break } } if { $done == 0 } { pass "windres/$broot (compare)" file delete "tmpdir/$broot.res" file delete "tmpdir/$broot.dump" } } # Test objdump -p if {[which $OBJDUMP] == 0} then { unsupported "objdump -p" return } verbose "$wr $cpp_opts -J rc $srcdir/$subdir/version.rc tmpdir/version.o" 1 catch "exec $wr $cpp_opts -J rc $srcdir/$subdir/version.rc tmpdir/version.o" err if ![string match "" $err] then { send_log "$err\n" verbose "$err" 1 if [string match "*windows.h: No such file*" $err] then { unsupported "objdump -p (no header files found)" } else { fail "objdump -p (build)" } continue } set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS -p tmpdir/version.o"] # FIXME: We should extend this regexp to check for more information. set want ".*The .rsrc Resource Directory section.*Type Table:.*Entry: ID:.*Name Table:.*Entry: ID:.*Language Table:.*Entry: ID:.*" if ![regexp $want $got] then { fail "objdump -p" } else { pass "objdump -p" } # file delete "tmpdir/version.o"