From 7ec41ed98194c08bf6b8aa1883f708eb1fe4f181 Mon Sep 17 00:00:00 2001 From: Geoffrey Hausheer Date: Tue, 2 Apr 2002 19:21:43 +0000 Subject: [PATCH] Added perl script which will build a Makefile for running C tests on Windows through Cygwin/gcc. --- programs/winetest/make_cygwin_makefiles | 223 ++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100755 programs/winetest/make_cygwin_makefiles diff --git a/programs/winetest/make_cygwin_makefiles b/programs/winetest/make_cygwin_makefiles new file mode 100755 index 00000000000..5bababe08a5 --- /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() { + 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 <