xref: /trunk/main/sal/qa/buildall.pl (revision c667dd47)
1eval 'exec perl -wS $0 ${1+"$@"}'
2    if 0;
3#**************************************************************
4#
5#  Licensed to the Apache Software Foundation (ASF) under one
6#  or more contributor license agreements.  See the NOTICE file
7#  distributed with this work for additional information
8#  regarding copyright ownership.  The ASF licenses this file
9#  to you under the Apache License, Version 2.0 (the
10#  "License"); you may not use this file except in compliance
11#  with the License.  You may obtain a copy of the License at
12#
13#    http://www.apache.org/licenses/LICENSE-2.0
14#
15#  Unless required by applicable law or agreed to in writing,
16#  software distributed under the License is distributed on an
17#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18#  KIND, either express or implied.  See the License for the
19#  specific language governing permissions and limitations
20#  under the License.
21#
22#**************************************************************
23
24# #!/usr/bin/env perl -w
25
26use strict;
27use POSIX;
28use Cwd;
29use File::Path;
30use English;
31use Cwd 'chdir';
32
33my $cwd = getcwd();
34
35# Prototypes
36sub initEnvironment();
37sub main($);
38sub checkForKillobj();
39sub checkARGVFor($);
40
41my $g_sTempDir = "";
42my $FS = "";
43
44my $nGlobalFailures = 0;
45
46my %libraryRunThrough;
47my $bBuildAll = 0;
48
49# LLA: this does not exist, ... use a little bit simpler method.
50# use File::Temp qw/ :POSIX /;
51
52my $params;
53my $param;
54
55if ($#ARGV < 0)
56{
57    $params = "test "; # debug=t TESTOPTADD=\"-boom\"   TESTOPTADD=\"-noerroronexit\"
58
59    # my $nNumber = 55;
60    # my $sLocalParams = $params;
61    # $sLocalParams =~ s/test\s/test$nNumber /;
62    # print "Testparams: $sLocalParams\n";
63    # exit 1;
64    print "Default ";
65}
66else
67{
68    # special hack!
69    if (checkForKillobj() == 1)
70    {
71        $params = "killobj";
72    }
73    elsif (checkARGVFor("buildall") == 1)
74    {
75        $bBuildAll = 1;
76        $params = "test";
77    }
78    else
79    {
80        # always run test, but envelope the other in 'TESTOPT="..."'
81        $params = "test TESTOPT=\"";
82
83        foreach $param (@ARGV)
84        {
85            $params = $params . " " . $param;
86        }
87        $params = $params . "\"";
88    }
89    print "User defined ";
90}
91
92print "parameters for dmake: $params\n";
93
94initEnvironment();
95main($params);
96
97# ------------------------------------------------------------------------------
98sub checkARGVFor($)
99{
100    my $sCheckValue = shift;
101    my $sLocalParam;
102    my $nBackValue = 0;
103    foreach $sLocalParam (@ARGV)
104    {
105        if ($sLocalParam =~ /^${sCheckValue}$/)
106        {
107            $nBackValue = 1;
108            last;
109        }
110    }
111    return $nBackValue;
112}
113# ------------------------------------------------------------------------------
114sub checkForKillobj()
115{
116    my $sLocalParam;
117    my $nBackValue = 0;
118    foreach $sLocalParam (@ARGV)
119    {
120        if ($sLocalParam =~ /^killobj$/)
121        {
122            $nBackValue = 1;
123            last;
124        }
125    }
126    return $nBackValue;
127}
128
129# ------------------------------------------------------------------------------
130sub initEnvironment()
131{
132    my $gui = $ENV{GUI};
133    # no error output in forms of message boxes
134    $ENV{'DISABLE_SAL_DBGBOX'}="t";
135
136  SWITCH: {
137      if ( $gui eq "WNT" ) {
138          $FS             = "\\";
139          $g_sTempDir         = $ENV{TMP}  ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
140          last SWITCH;
141      }
142      if ( $gui eq "WIN" ) {
143          $FS             = "\\";
144          $g_sTempDir         = $ENV{TMP}  ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
145          last SWITCH;
146      }
147      if ( $gui eq "OS2" ) {
148          $FS             = "\\";
149          $g_sTempDir         = $ENV{TMP}  ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
150          last SWITCH;
151      }
152      if ( $gui eq "UNX" ) {
153          $FS             = "/";
154          $g_sTempDir         = $ENV{TMP}  ? "$ENV{TMP}${FS}" : "${FS}tmp${FS}";
155          last SWITCH;
156      }
157      print STDERR "buildall.pl: unknown platform\n";
158      exit(1);
159  }
160}
161# ------------------------------------------------------------------------------
162
163sub trim($)
164{
165    my $oldstr = shift;
166    $oldstr =~ s/^\s*(.*?)\s*$/$1/;
167    return $oldstr;
168}
169
170# ------------------------------------------------------------------------------
171sub getLibName($)
172{
173    my $sFile = shift;
174    if ($OSNAME eq "linux" || $OSNAME eq "solaris")
175    {
176        return "lib" . $sFile . ".so";
177    }
178    if ($OSNAME eq "MSWin32" || $OSNAME eq "OS2")
179    {
180        return $sFile . ".dll";
181    }
182    return $sFile;
183}
184# ------------------------------------------------------------------------------
185sub giveOutAll($)
186{
187    my $sFailureFile = shift;
188    local *IN;
189    if (! open(IN, $sFailureFile))
190    {
191        print "ERROR: Can't open output file $sFailureFile\n";
192        return;
193    }
194    my $line;
195    while ($line = <IN>)
196    {
197        chomp($line);
198        print "$line\n";
199    }
200    close(IN);
201}
202# ------------------------------------------------------------------------------
203sub giveOutFailures($$)
204{
205    my $sTest = shift;
206    my $sFailureFile = shift;
207
208    my $bBegin = 0;
209    my $nFailures = 0;
210
211    my $line;
212    local *IN;
213    if (! open(IN, $sFailureFile))
214    {
215        print "ERROR: Can't open output file $sFailureFile\n";
216        return;
217    }
218
219    my $bStartUnitTest = 0;
220    while ($line = <IN>)
221    {
222        chomp($line);
223        if ( $line =~ /^- start unit test/)
224        {
225            $bStartUnitTest = 1;
226        }
227    }
228    close(IN);
229
230    if ($bStartUnitTest == 0)
231    {
232        print "\nFailure: Unit test not started. Maybe compiler error.\n";
233        giveOutAll($sFailureFile);
234        $nFailures++;
235        # exit(1);
236    }
237    else
238    {
239        open(IN, $sFailureFile);
240        # check if testshl2 was started
241        while ($line = <IN>)
242        {
243            chomp($line);
244
245            # handling of the states
246            if ( $line =~ /^\# -- BEGIN:/)
247            {
248                $bBegin = 1;
249            }
250            elsif ( $line =~ /^\# -- END:/)
251            {
252                $bBegin = 0;
253            }
254            else
255            {
256                if ($bBegin == 1)
257                {
258                    print "$line\n";
259                    $nFailures++;
260                }
261            }
262        }
263        close(IN);
264    }
265
266    if ($nFailures > 0)
267    {
268        # extra return for a better output
269        print "\nFailures occurred: $nFailures\n";
270        print "The whole output can be found in $sFailureFile\n";
271        print "\n";
272
273        # Statistics
274        $nGlobalFailures += $nFailures;
275    }
276}
277# ------------------------------------------------------------------------------
278sub printOnLibrary($)
279{
280    my $sTarget = shift;
281    print "       on library: " . getLibName($sTarget);
282}
283# ------------------------------------------------------------------------------
284sub runASingleTest($$)
285{
286    my $sTarget = shift;
287    my $params = shift;
288    my $dmake = "dmake $params";
289
290    my $sLogPath = $g_sTempDir . "dmake_out_$$";
291    mkdir($sLogPath);
292    my $sLogFile = $sLogPath . "/" . $sTarget . ".out";
293
294    # due to the fact, a library name in one project is distinct, we should remember all already run through libraries and
295    # suppress same libraries, if they occur one more.
296
297    if (exists $libraryRunThrough{getLibName($sTarget)})
298    {
299        # already done
300        return;
301    }
302    printOnLibrary($sTarget);
303    print "\n";
304
305# redirect tcsh ">&" (stdout, stderr)
306# redirect 4nt   ">" (stdout), "2>" (stderr)
307# print "OSNAME: $OSNAME\n";
308# LLA: redirect check canceled, seems to be not work as I want.
309#     my $redirect = "";
310#     if ($OSNAME eq "linux" || $OSNAME eq "solaris")
311#     {
312#         # print "UNIX, linux or solaris\n";
313#         $redirect = '>>&!' . $sLogFile;
314#     }
315#     else
316#     {
317#         if ($OSNAME eq "MSWin32" || $OSNAME eq "OS2")
318#         {
319#             # test
320#             $redirect = ">>$sLogFile 2>>$sLogFile";
321#         }
322#     }
323#     print "$dmake $redirect\n";
324
325# LLA: so system does also not work as I imagine
326#    system("$dmake $redirect");
327
328# LLA: next check, use open with pipe
329
330    local *LOGFILE;
331    if (! open( LOGFILE, '>' . "$sLogFile"))
332    {
333        print "ERROR: can't open logfile: $sLogFile\n";
334        return;
335    }
336
337    my $line;
338    local *DMAKEOUTPUT;
339    if (! open( DMAKEOUTPUT, "$dmake 2>&1 |"))
340    {
341        print "ERROR: can't open dmake\n";
342        return;
343    }
344    while ($line = <DMAKEOUTPUT>)
345    {
346        chomp($line);
347        print LOGFILE "$line\n";
348    }
349    close(DMAKEOUTPUT);
350    close(LOGFILE);
351
352    giveOutFailures($sTarget, $sLogFile);
353
354    $libraryRunThrough{getLibName($sTarget)} = "done";
355}
356
357# ------------------------------------------------------------------------------
358sub interpretLine($)
359{
360    my $line = shift;
361
362    my $path;
363    my $file;
364
365    if ($line =~ /^\#/ || $line =~ /^$/)
366    {
367        # remark or empty line
368    }
369    else
370    {
371        # special format, $file == $path
372        ($path, $file) = split(/;/, $line);
373        if (! $file)
374        {
375            $file = $path;
376        }
377        $file = trim($file);
378        $path = trim($path);
379    }
380    return $path, $file;
381}
382# ------------------------------------------------------------------------------
383sub runTestsOnPath($$$)
384{
385    my $path = shift;
386    my $file = shift;
387    my $params = shift;
388
389    # empty values
390    if (!$path || $path eq "")
391    {
392        # DBG: print "empty path '$path'\n";
393        return;
394    }
395    if (!$file || $file eq "")
396    {
397        # DBG: print "empty file '$file'\n";
398        return;
399    }
400
401#   print "File: '$file', Path: '$path'\n";
402    print "Work in directory: $path\n";
403    my $newpath = $cwd . $FS . $path;
404#   print "chdir to $newpath\n";
405
406    my $error = chdir($newpath);
407    cwd();
408
409    # run through the hole makefile.mk and check if SHL<D>TARGET = ... exist, for every target call "dmake test<D>"
410
411    local *MAKEFILE_MK;
412    if (! open(MAKEFILE_MK, "makefile.mk"))
413    {
414        print "ERROR: can't open makefile.mk in path: $newpath\n";
415        print "please check your libs2test.txt file in qa directory.\n";
416    }
417    my $line;
418    my $nNumber;
419    my $sTarget;
420    my $sLocalParams;
421
422    while($line = <MAKEFILE_MK>)
423    {
424        chomp($line);
425
426        if ($line =~ /SHL(\d)TARGET=(.*)/)
427        {
428            $nNumber = $1;
429            $sTarget = trim($2);
430
431            # DBG: print "test$number is lib: $target\n";
432            $sLocalParams = $params . " ";                  # append a whitespace, so we can check if 'test' exist without additional digits
433            $sLocalParams =~ s/test\s/test$nNumber/;
434            # DBG: print "$sLocalParams\n";
435            if ($bBuildAll == 1 ||
436                $file eq $sTarget)
437            {
438                # print "runASingleTest on Target: $sTarget 'dmake $sLocalParams'\n";
439                runASingleTest($sTarget, $sLocalParams);
440            }
441            else
442            {
443                # printOnLibrary($sTarget);
444                # print " suppressed, not in libs2test.txt\n";
445            }
446        }
447    }
448    close(MAKEFILE_MK);
449}
450
451# ------------------------------------------------------------------------------
452
453sub main($)
454{
455    my $params = shift;
456#    my $sLogFile = shift;     # "buildall_$$.out";
457    local *LIBS2TEST;
458    my $filename = "libs2test.txt";
459    my $line;
460
461    open(LIBS2TEST, $filename) || die "can't open $filename\n";
462
463    while($line = <LIBS2TEST>)
464    {
465        chomp($line);
466        # DOS Hack grrrr...
467        while ($line =~ /
468$/)
469        {
470            $line = substr($line, 0, -1);
471        }
472
473        # print "$line\n";
474        my $path;
475        my $file;
476        ($path, $file) = interpretLine($line);
477        runTestsOnPath($path, $file, $params);
478    }
479    close(LIBS2TEST);
480
481    print "\nComplete logging information will be found in dir: ".$g_sTempDir."dmake_out_$$/\n";
482
483    if ($nGlobalFailures > 0)
484    {
485        print "\nFailures over all occurred: $nGlobalFailures\n";
486        print "\nPASSED FAILED.\n";
487    }
488    else
489    {
490        print "\nPASSED OK.\n";
491    }
492}
493
494# ------------------------------------------------------------------------------
495
496# TODO:
497# -verbose
498# -fan   - \ | /
499
500# END!
501
502