| 1 | #!perl
|
|---|
| 2 |
|
|---|
| 3 | BEGIN {
|
|---|
| 4 | chdir 't' if -d 't';
|
|---|
| 5 | # We need '../../lib' as well as '../lib' because parts of Config are
|
|---|
| 6 | # delay-loaded, after we've chdir()'ed into $testdir.
|
|---|
| 7 | @INC = ('../lib', '../../lib');
|
|---|
| 8 | # XXX this could be further munged to enable some parts on other
|
|---|
| 9 | # platforms
|
|---|
| 10 | unless ($^O =~ /^MSWin/) {
|
|---|
| 11 | print "1..0 # skipped: windows specific test\n";
|
|---|
| 12 | exit 0;
|
|---|
| 13 | }
|
|---|
| 14 | }
|
|---|
| 15 |
|
|---|
| 16 | use File::Path;
|
|---|
| 17 | use File::Copy;
|
|---|
| 18 | use Config;
|
|---|
| 19 | use Cwd;
|
|---|
| 20 | use strict;
|
|---|
| 21 |
|
|---|
| 22 | $| = 1;
|
|---|
| 23 |
|
|---|
| 24 | my $cwd = cwd();
|
|---|
| 25 |
|
|---|
| 26 | my $testdir = "t e s t";
|
|---|
| 27 | my $exename = "showav";
|
|---|
| 28 | my $plxname = "showargv";
|
|---|
| 29 | rmtree($testdir);
|
|---|
| 30 | mkdir($testdir);
|
|---|
| 31 | die "Could not create '$testdir':$!" unless -d $testdir;
|
|---|
| 32 |
|
|---|
| 33 | open(my $F, ">$testdir/$exename.c")
|
|---|
| 34 | or die "Can't create $testdir/$exename.c: $!";
|
|---|
| 35 | print $F <<'EOT';
|
|---|
| 36 | #include <stdio.h>
|
|---|
| 37 | #ifdef __BORLANDC__
|
|---|
| 38 | #include <windows.h>
|
|---|
| 39 | #endif
|
|---|
| 40 | int
|
|---|
| 41 | main(int ac, char **av)
|
|---|
| 42 | {
|
|---|
| 43 | int i;
|
|---|
| 44 | #ifdef __BORLANDC__
|
|---|
| 45 | char *s = GetCommandLine();
|
|---|
| 46 | int j=0;
|
|---|
| 47 | av[0] = s;
|
|---|
| 48 | if (s[0]=='"') {
|
|---|
| 49 | for(;s[++j]!='"';)
|
|---|
| 50 | ;
|
|---|
| 51 | av[0]++;
|
|---|
| 52 | }
|
|---|
| 53 | else {
|
|---|
| 54 | for(;s[++j]!=' ';)
|
|---|
| 55 | ;
|
|---|
| 56 | }
|
|---|
| 57 | s[j]=0;
|
|---|
| 58 | #endif
|
|---|
| 59 | for (i = 0; i < ac; i++)
|
|---|
| 60 | printf("[%s]", av[i]);
|
|---|
| 61 | printf("\n");
|
|---|
| 62 | return 0;
|
|---|
| 63 | }
|
|---|
| 64 | EOT
|
|---|
| 65 |
|
|---|
| 66 | open($F, ">$testdir/$plxname.bat")
|
|---|
| 67 | or die "Can't create $testdir/$plxname.bat: $!";
|
|---|
| 68 | print $F <<'EOT';
|
|---|
| 69 | @rem = '--*-Perl-*--
|
|---|
| 70 | @echo off
|
|---|
| 71 | if "%OS%" == "Windows_NT" goto WinNT
|
|---|
| 72 | EOT
|
|---|
| 73 |
|
|---|
| 74 | print $F <<EOT;
|
|---|
| 75 | "$^X" -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
|
|---|
| 76 | goto endofperl
|
|---|
| 77 | :WinNT
|
|---|
| 78 | "$^X" -x -S %0 %*
|
|---|
| 79 | EOT
|
|---|
| 80 | print $F <<'EOT';
|
|---|
| 81 | if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
|
|---|
| 82 | if %errorlevel% == 9009 echo You do not have Perl in your PATH.
|
|---|
| 83 | if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
|
|---|
| 84 | goto endofperl
|
|---|
| 85 | @rem ';
|
|---|
| 86 | #!perl
|
|---|
| 87 | #line 15
|
|---|
| 88 | print "[$_]" for ($0, @ARGV);
|
|---|
| 89 | print "\n";
|
|---|
| 90 | __END__
|
|---|
| 91 | :endofperl
|
|---|
| 92 | EOT
|
|---|
| 93 |
|
|---|
| 94 | close $F;
|
|---|
| 95 |
|
|---|
| 96 | # build the executable
|
|---|
| 97 | chdir($testdir);
|
|---|
| 98 | END {
|
|---|
| 99 | chdir($cwd) && rmtree("$cwd/$testdir") if -d "$cwd/$testdir";
|
|---|
| 100 | }
|
|---|
| 101 | if (open(my $EIN, "$cwd/win32/${exename}_exe.uu")) {
|
|---|
| 102 | print "# Unpacking $exename.exe\n";
|
|---|
| 103 | my $e;
|
|---|
| 104 | {
|
|---|
| 105 | local $/;
|
|---|
| 106 | $e = unpack "u", <$EIN>;
|
|---|
| 107 | close $EIN;
|
|---|
| 108 | }
|
|---|
| 109 | open my $EOUT, ">$exename.exe" or die "Can't write $exename.exe: $!";
|
|---|
| 110 | binmode $EOUT;
|
|---|
| 111 | print $EOUT $e;
|
|---|
| 112 | close $EOUT;
|
|---|
| 113 | }
|
|---|
| 114 | else {
|
|---|
| 115 | my $minus_o = '';
|
|---|
| 116 | if ($Config{cc} eq 'gcc')
|
|---|
| 117 | {
|
|---|
| 118 | $minus_o = "-o $exename.exe";
|
|---|
| 119 | }
|
|---|
| 120 | print "# Compiling $exename.c\n# $Config{cc} $Config{ccflags} $exename.c\n";
|
|---|
| 121 | if (system("$Config{cc} $Config{ccflags} $minus_o $exename.c >log 2>&1") != 0) {
|
|---|
| 122 | print "# Could not compile $exename.c, status $?\n"
|
|---|
| 123 | ."# Where is your C compiler?\n"
|
|---|
| 124 | ."1..0 # skipped: can't build test executable\n";
|
|---|
| 125 | exit(0);
|
|---|
| 126 | }
|
|---|
| 127 | unless (-f "$exename.exe") {
|
|---|
| 128 | if (open(LOG,'<log'))
|
|---|
| 129 | {
|
|---|
| 130 | while(<LOG>) {
|
|---|
| 131 | print "# ",$_;
|
|---|
| 132 | }
|
|---|
| 133 | }
|
|---|
| 134 | else {
|
|---|
| 135 | warn "Cannot open log (in $testdir):$!";
|
|---|
| 136 | }
|
|---|
| 137 | }
|
|---|
| 138 | }
|
|---|
| 139 | copy("$plxname.bat","$plxname.cmd");
|
|---|
| 140 | chdir($cwd);
|
|---|
| 141 | unless (-x "$testdir/$exename.exe") {
|
|---|
| 142 | print "# Could not build $exename.exe\n"
|
|---|
| 143 | ."1..0 # skipped: can't build test executable\n";
|
|---|
| 144 | exit(0);
|
|---|
| 145 | }
|
|---|
| 146 |
|
|---|
| 147 | open my $T, "$^X -I../lib -w win32/system_tests |"
|
|---|
| 148 | or die "Can't spawn win32/system_tests: $!";
|
|---|
| 149 | my $expect;
|
|---|
| 150 | my $comment = "";
|
|---|
| 151 | my $test = 0;
|
|---|
| 152 | while (<$T>) {
|
|---|
| 153 | chomp;
|
|---|
| 154 | if (/^1\.\./) {
|
|---|
| 155 | print "$_\n";
|
|---|
| 156 | }
|
|---|
| 157 | elsif (/^#+\s(.*)$/) {
|
|---|
| 158 | $comment = $1;
|
|---|
| 159 | }
|
|---|
| 160 | elsif (/^</) {
|
|---|
| 161 | $expect = $_;
|
|---|
| 162 | $expect =~ tr/<>/[]/;
|
|---|
| 163 | $expect =~ s/\Q$plxname\E]/$plxname.bat]/;
|
|---|
| 164 | }
|
|---|
| 165 | else {
|
|---|
| 166 | if ($expect ne $_) {
|
|---|
| 167 | print "# $comment\n" if $comment;
|
|---|
| 168 | print "# want: $expect\n";
|
|---|
| 169 | print "# got : $_\n";
|
|---|
| 170 | print "not ";
|
|---|
| 171 | }
|
|---|
| 172 | ++$test;
|
|---|
| 173 | print "ok $test\n";
|
|---|
| 174 | }
|
|---|
| 175 | }
|
|---|
| 176 | close $T;
|
|---|