Added perl script which will build a Makefile for running C tests on
Windows through Cygwin/gcc.

diff --git a/programs/winetest/make_cygwin_makefiles b/programs/winetest/make_cygwin_makefiles
new file mode 100755
index 0000000..5bababe
--- /dev/null
+++ b/programs/winetest/make_cygwin_makefiles
@@ -0,0 +1,223 @@
+#!/usr/bin/perl -w
+#
+# Script to generate a Cygwin makefile for running unit tests.
+#
+# Copyright 2002 Geoffrey Hausheer
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+use strict;
+
+sub usage;
+sub fix_dir;
+sub get_testname;
+sub create_archive($$\@);
+
+# set this variable to point to your windows headers
+my ($windows_includes) ="/usr/include/w32api";
+# set this variable to your compiler options
+my($cc_opts)= "-g -O2 -Wall -mpreferred-stack-boundary=2 -D_REENTRANT";
+
+my($topobjdir);
+my(@testdirs);
+my(@gooddirs);
+my(@ok_list)=();
+my($dir);
+my($file);
+my($afile)="";
+my($archive)="";
+# parse command-line options
+while ($#ARGV >= 0)
+{
+    my $arg = shift @ARGV;
+    if ($arg eq "-h") { usage; }
+    if ($arg eq "-T")
+    {
+        $topobjdir = shift @ARGV;
+        usage unless (-d $topobjdir);
+        next;
+    }
+    if ($arg eq "-z") {
+      $afile = shift @ARGV;
+      $archive = "z";
+    }
+    if ($arg eq "-g") {
+      $afile = shift @ARGV;
+      $archive = "g";
+    }
+}
+
+# check/detect topobjdir
+# NOTE: Checking for configure is not ideal, but it seems to work
+if (defined($topobjdir))
+{
+    unless (-f $topobjdir . "/configure")
+    {
+        printf STDERR "Wrong -T argument, %s/configure does not exist\n", $topobjdir;
+        usage;
+    }
+}
+else  # try to detect it automatically
+{
+    if (-f "./configure") { $topobjdir = "."; }
+    elsif (-f "../configure") { $topobjdir = ".."; }
+    elsif (-f "../../configure") { $topobjdir = "../.."; }
+    elsif (-f "../../../configure") { $topobjdir = "../../.."; }
+    else {
+      printf STDERR "Couldn't locate 'configure', and so no top-level directory\n";
+      usage;
+    }
+}
+
+chdir $topobjdir;
+# Locate all tests
+open FIND_FH, "find . -type d -name tests -print |";
+while(<FIND_FH>) {
+  chomp;
+  push @testdirs,$_;
+}
+close FIND_FH;
+
+#start writing the makefile in the root directory
+open MAKE_FH,">Makefile.cyg";
+print MAKE_FH "CC = gcc\n";
+print MAKE_FH "WINDOWS_HEADERS = $windows_includes\n";
+print MAKE_FH "INCLUDE_DIRS = -I\$(WINDOWS_HEADERS) -I./include\n";
+print MAKE_FH "CC_OPTS = \$(INCLUDE_DIRS) $cc_opts -include \$(WINDOWS_HEADERS)/windows.h\n";
+
+# iterate over each 'tests' directory
+foreach $dir (@testdirs) {
+  my($rootdir);
+  my($testname)=get_testname($dir);
+  $rootdir=fix_dir($dir);
+  unlink("$dir/testlist.c");
+  # Locate all '.c' files that arent 'spec'
+  my(@filelist)=grep(!/\.spec/,glob "$dir/*.c");
+  if(scalar(@filelist)) {
+    # Create a global list of all tests
+    foreach $file (@filelist) {
+      my($newfile);
+      ($newfile = $file) =~ s/c$/ok/;
+      push(@ok_list,$newfile);
+    }
+    # create the testslist.c file for each directory
+    system("./programs/winetest/make_ctests $dir/*.c > $dir/testlist.c");
+    push @filelist,"$dir/testlist.c";
+    push(@gooddirs,$dir);
+    print MAKE_FH "# $dir\n";
+    # List all object files needed for this test
+    print MAKE_FH "TEST_O_FILES_$rootdir = \\\n";
+    foreach $file (@filelist) {
+      $file =~ s/c$/o/;
+      if($file ne $filelist[$#filelist]) {
+        print MAKE_FH "	$file\\\n";
+      } else {
+        print MAKE_FH "	$file\n";
+      }
+    }
+    print MAKE_FH "TEST_EXE_$rootdir = $dir/$testname.exe\n";
+  }
+}
+die "No C files found\n" if (!scalar(@gooddirs));
+# The prerequisites for the tests are that the .ok fiels get created
+print MAKE_FH "TEST_OK_FILES = \\\n";
+foreach $file (@ok_list) {
+  if($file ne $ok_list[$#ok_list]) {
+    print MAKE_FH "	$file\\\n";
+  } else {
+    print MAKE_FH "	$file\n";
+  }
+}
+print MAKE_FH "\n";
+print MAKE_FH "all: \$(TEST_OK_FILES)\n";
+print MAKE_FH "\n";
+
+#define how to make the executables
+foreach $dir (@gooddirs) {
+  my($rootdir)=fix_dir($dir);
+  print MAKE_FH "\$(TEST_EXE_${rootdir}): \$(TEST_O_FILES_${rootdir}) ./programs/winetest/wtmain.o\n";
+  print MAKE_FH "	\$(CC) \$(CC_OPTS) \$(TEST_O_FILES_${rootdir}) ./programs/winetest/wtmain.o -o \$@\n";
+}
+
+# define how to make to .ok files
+foreach $file (@ok_list) {
+  my($dir,$test) = ($file =~ /^(.*[\\\/]+tests)[\\\/]+(.*)\.ok$/);
+  
+  print MAKE_FH "$file: \$(TEST_EXE_". fix_dir($file) . ")\n";
+  print MAKE_FH "	\$< $test && touch \$@\n";
+}
+# define how to make the .o files
+
+print MAKE_FH "%.o: %.c\n";
+print MAKE_FH "	\$(CC) \$(CC_OPTS) -c -o \$@ \$<\n";
+close MAKE_FH;
+if($archive ne "") {
+  create_archive($afile,$archive,@testdirs);
+}
+exit 0;
+
+
+sub usage
+{
+    print STDERR <<EOF;
+
+Usage: $0 [options]
+
+Options:
+    -v       verbose mode (can be specified multiple times)
+    -T dir   set Wine tree top directory (autodetected if not specified)
+    -z file  archive (zip) all needed files for test
+    -g file  archive (tar.gz) all needed files for test
+    -h       Show this message
+    NOTE: You can specify either -g or -z but not both
+EOF
+    exit 1;
+}
+sub fix_dir {
+  my($dir)=shift @_;
+  my($rootdir)=($dir =~ /^[^\\\/]*[\\\/]+(.+)[\\\/]+tests/);
+  $rootdir =~ s/[\\\/]+/_/g;
+  return($rootdir);
+}
+
+sub get_testname {
+  my($dir)=shift @_;
+  my($testname)=($dir =~ /[\\\/]+([^\\\/]+)[\\\/]+tests/i);
+  return $testname;
+}
+
+sub create_archive($$\@) {
+  my($file,$arch,$dirlist)=@_;
+  my($dir);
+  my($cmd);
+  if($arch eq "z") {
+    print "Creating zip archive : $file\n";
+    $cmd = "zip -r $file ";
+  } else {
+    print "Creating tar.gz archive : $file\n";
+   $cmd = "tar -cvzf $file ";
+  }
+  foreach $dir (@$dirlist) {
+    my($cfile);
+    foreach $cfile (grep(!/\.spec/,glob "$dir/*.c")) {
+      $cmd .= "$cfile ";
+    }
+  }
+  $cmd .= " ./programs/winetest/wtmain.c";
+  $cmd .= " ./include/wine";
+  $cmd .= " ./Makefile.cyg";
+  system "$cmd";
+}