| #!/bin/sh |
| # |
| # $Id$ |
| # |
| ######################################################################## |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed |
| # with this work for additional information regarding copyright |
| # ownership. The ASF licenses this file to you under the Apache |
| # License, Version 2.0 (the "License"); you may not use this file |
| # except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| # implied. See the License for the specific language governing |
| # permissions and limitations under the License. |
| # |
| # Copyright 2007 Rogue Wave Software. |
| # |
| ######################################################################## |
| # |
| # NAME |
| # xbuildgen - Generate build results across multiple platforms. |
| # |
| # SYNOPSIS |
| # xbuildgen [option(s)...] [log-file(s)...] |
| # |
| # DESCRIPTION |
| # The xbuildgen utility generates a build result in HTML format |
| # across multiple platforms or tests with builds in columns and |
| # components such as examples, locales, and tests in rows by |
| # default. |
| # |
| # OPTIONS |
| # -n No clean. Avoid removing temporary files. |
| # |
| # -s Stylesheet. Create a style sheet named resultstyle.css in |
| # the same directory as the output file when the -o option |
| # is specified, or in the current working directory otherwise. |
| # |
| # -v Verbose. Produce verbose output on stdout. |
| # |
| # -e <list-of-examples> |
| # Generate a report for the specified list of example programs |
| # with examples listed in columns and builds in rows. |
| # |
| # -l <list-of-locales> |
| # Generate a report for the specified list of locales with |
| # locales listed in columns and builds in rows. |
| # |
| # -o <output-file> |
| # Specify the pathname of the output file. The utility will |
| # use stdout when no output file is specified. |
| # |
| # -t <list-of-tests> |
| # Generate a report for the specified list of tests with |
| # tests listed in columns and builds in rows. |
| # |
| ######################################################################## |
| |
| |
| # by default, display one component (example, locale, or test) per row |
| components_in_rows=1 |
| |
| # no verbosity by default |
| verbose=0 |
| |
| ## process command line options |
| while getopts ":nsv:e:l:o:t:" opt_name; do |
| case $opt_name in |
| # options with no arguments |
| |
| n) # avoid cleaning up temporary files |
| no_clean=1 |
| ;; |
| |
| s) # create a style sheet |
| create_stylesheet=1 |
| ;; |
| |
| v) # output all components (including passing ones) |
| verbose=1 |
| ;; |
| |
| # options with arguments |
| |
| e) # argument is a list of examples to process |
| example_list=$OPTARG |
| components_in_rows=0 |
| ;; |
| |
| l) # argument is a list of locales to process |
| locale_list=$OPTARG |
| components_in_rows=0 |
| ;; |
| |
| o) # argument is the name of output file (stdout by default) |
| outfile=$OPTARG |
| ;; |
| |
| t) # argument is a list of tests to process |
| test_list=$OPTARG |
| components_in_rows=0 |
| ;; |
| |
| *) echo "unknown option : -$opt_name" >&2; |
| exit 1;; |
| esac; |
| done |
| |
| # remove command line options and their arguments from the command line |
| shift $(($OPTIND - 1)) |
| |
| # take the remaining command line arguments as the names of logs |
| # to process |
| gzlogs=$* |
| |
| |
| # set the TMP variable to /tmp if not set |
| [ -z $TMP ] && TMP=/tmp |
| |
| ###################################################################### |
| |
| # output to output file when specified or to stdout |
| output () |
| { |
| if [ $# -eq 0 ]; then |
| # no arguments provided, copy its own stdin to outfile |
| if [ -z $outfile ]; then |
| cat |
| else |
| cat >>$outfile |
| fi |
| elif [ -z $outfile ]; then |
| echo "$*" |
| else |
| echo "$*" >>$outfile |
| fi |
| } |
| |
| |
| ###################################################################### |
| |
| # remove output file if specified |
| if [ ! -z $outfile ]; then |
| rm -f $outfile |
| fi |
| |
| |
| # overwrite style sheet |
| if [ "$create_stylesheet" = "1" ]; then |
| |
| if [ -z $outfile ]; then |
| dir=. |
| else |
| dir=`dirname $outfile` |
| fi |
| |
| cat <<EOF >$dir/resultstyle.css |
| |
| table { |
| border-width:0px; |
| background:#000000; |
| font-size:smaller; |
| } |
| th { |
| font-family:fixed |
| font-size:smaller; |
| background:#cccccc; |
| text-align:center; |
| } |
| td { |
| font-family:fixed; |
| font-size:smaller; |
| padding: 3px; |
| text-align: center; |
| background-color: lightblue; |
| } |
| td.rowno { |
| font-family:fixed; |
| font-size:smaller; |
| padding: 3px; |
| text-align: right; |
| background-color:#cccccc; |
| } |
| td.name { |
| font-family:fixed; |
| font-size:smaller; |
| padding: 3px; |
| text-align: left; |
| background-color:lightblue; |
| } |
| td.number { |
| font-family:fixed; |
| font-size:smaller; |
| padding: 3px; |
| text-align: center; |
| background-color:lightblue; |
| } |
| td.na { |
| background:white; |
| text-align:left; |
| font-family:fixed |
| font-size:smaller; |
| } |
| td.header { |
| background:#cccccc; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| font-weight:bold; |
| } |
| td.OK { |
| background:forestgreen; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| font-weight:bold; |
| } |
| td.BASE { |
| background:lightgreen; |
| text-align:center; |
| font-size:smaller; |
| font-weight:bold; |
| font-family:fixed; |
| } |
| td.NOUT { |
| background:lightgreen; |
| text-align:center; |
| font-size:smaller; |
| font-weight:bold; |
| font-family:fixed; |
| } |
| td.OUTPUT { |
| background:lightgreen; |
| text-align:center; |
| font-size:smaller; |
| font-weight:bold; |
| font-family:fixed; |
| } |
| td.missing { |
| color:white; |
| background:lightgray; |
| text-align:center; |
| font-size:smaller; |
| font-family:fixed; |
| font-weight:bold; |
| } |
| td.WARN { |
| color:red; |
| background:#ffff99; |
| text-align:center; |
| font-family:fixed |
| } |
| td.EXIT { |
| color:red; |
| background:gold; |
| text-align:center; |
| font-weight:bold; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.FORMAT { |
| background:#ffffcc; |
| text-align:center; |
| font-family:fixed |
| font-size:smaller; |
| } |
| td.RUNWARN { |
| color:black; |
| background:#ffff99; |
| text-align:center; |
| font-weight:bold; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.DIFF { |
| color:red; |
| background:#ffff99; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.ASSERT { |
| color:red; |
| background:#ffff99; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.SIGNAL { |
| color:yellow; |
| background:red; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.COMP { |
| background:violet; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.LINK { |
| color:yellow; |
| background:mediumpurple; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| td.xdep { |
| color:yellow; |
| background:gray; |
| font-weight:bold; |
| text-align:center; |
| font-family:fixed; |
| font-size:smaller; |
| } |
| EOF |
| |
| fi |
| |
| ###################################################################### |
| |
| # output the initial portion of the HTML file |
| cat <<EOF | output |
| <html> |
| <head> |
| <link rel="stylesheet" href="resultstyle.css" type="text/css" |
| title="Cross-Build View Style Sheet"> |
| </head> |
| <body> |
| |
| <h1>Multi-platform Test Result View</h1> |
| Generated `date` |
| <hr> |
| |
| <h2>Index</h2> |
| |
| <ul> |
| <li><a href="#examples">Examples</a></li> |
| <li><a href="#tests">Tests</a></li> |
| <li><a href="#locales">Locales</a></li> |
| <li><a href="#codes">Codes and Colors</a></li> |
| <li><a href="#buildtypes">Build Types</a></li> |
| </ul> |
| <hr> |
| EOF |
| |
| ###################################################################### |
| |
| # the location of the logs |
| logdir="http://people.apache.org/~sebor/stdcxx/results" |
| |
| # the names of temporary files containing the list of components |
| # (examples, locales, and tests) to process and include in the |
| # generated report |
| tests_file=$TMP/.stdcxx-tests.$$ |
| examples_file=$TMP/.stdcxx-examples.$$ |
| locales_file=$TMP/.stdcxx-locales.$$ |
| |
| # remove temporary files in case they exist |
| rm -f $tests_file $examples_file $locales_file |
| |
| if [ $? -ne 0 ]; then |
| exit 2 |
| fi |
| |
| |
| cat <<EOF | output |
| <h2>Logs and Columns</h2> |
| <ol> |
| EOF |
| |
| ###################################################################### |
| # expand gzipped logs and extract the relevant portion from each into |
| # a smaller text file for fast and easy processing |
| |
| n=0 |
| for l in $gzlogs; do |
| n=`expr $n + 1` |
| fname=`basename $l` |
| |
| if [ $verbose -eq 1 ]; then |
| echo "processing $l" |
| fi |
| |
| if [ $components_in_rows -ne 0 ]; then |
| # output one component per row with their results in columns |
| table_header="$table_header <th><div title=\"$fname\">$n</div></th>" |
| |
| output " <li><a href=\"$logdir/$fname\">$fname</a></li>" |
| fi |
| |
| # runlog=$TMP/.stdcxx-tmplog.$$.$n |
| runlog=$TMP/`basename $l`.$$ |
| textlogs="$textlogs $runlog" |
| |
| # unzip the log and cut the firt part up to the first table |
| gunzip -c $l | sed -e "1,/^NAME *STATUS/d" > $runlog |
| |
| status=$? |
| |
| if [ $status -eq 0 ]; then |
| |
| # extract the list of locales from the log |
| |
| sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog \ |
| | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" >>$locales_file \ |
| && sed -e "1,/^NAME *STATUS/d" $runlog > $runlog.next |
| |
| status=$? |
| |
| if [ $verbose -eq 1 ]; then |
| echo " extracted locale results into $locales_file" |
| fi |
| else |
| exit 3 |
| fi |
| |
| if [ $status -eq 0 ]; then |
| |
| # extract the list of tests from the log |
| |
| sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog.next \ |
| | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" >>$tests_file \ |
| && sed -e "1,/^NAME *STATUS/d" $runlog.next > $runlog.next.2 \ |
| && mv $runlog.next.2 $runlog.next |
| |
| status=$? |
| |
| if [ $verbose -eq 1 ]; then |
| echo " extracted test results into $tests_file" |
| fi |
| else |
| exit 3 |
| fi |
| |
| if [ $status -eq 0 ]; then |
| |
| # extract the list of examples from the log |
| |
| sed -e "/^PROGRAM SUMMARY:/,999999d" $runlog.next \ |
| | sed -e "s/^\([^ ][^ ]*\) *.*/\1/" >>$examples_file \ |
| && sed -e "1,/^NAME *STATUS/d" $runlog > $runlog.next.2 \ |
| && mv $runlog.next.2 $runlog.next |
| |
| if [ $verbose -eq 1 ]; then |
| echo " extracted example results into $examples_file" |
| fi |
| else |
| exit 3 |
| fi |
| |
| rm $runlog.next |
| done |
| |
| |
| n=0 |
| if [ $components_in_rows -eq 0 ]; then |
| |
| for c in $example_list $test_list $locale_list; do |
| n=`expr $n + 1` |
| |
| # output one build per row, with components in columns |
| table_header="$table_header <th><div title=\"$c\">$n</div></th>" |
| output " <li>$c</li>" |
| done |
| fi |
| |
| output " </ol>" |
| output " <hr>" |
| |
| if [ -s $locales_file ]; then |
| # if the list of locales non-empty sort it and weed out duplicates |
| sort $locales_file | uniq > $locales_file.2 \ |
| && mv $locales_file.2 $locales_file |
| fi |
| |
| if [ -s $examples_file ]; then |
| # if the list of examples is non-empty sort it and weed out duplicates |
| sort $examples_file | uniq > $examples_file.2 \ |
| && mv $examples_file.2 $examples_file |
| fi |
| |
| if [ -s $tests_file ]; then |
| # if list of tests file is non-empty sort it and weed out duplicates |
| sort $tests_file | uniq > $tests_file.2 \ |
| && mv $tests_file.2 $tests_file |
| fi |
| |
| ###################################################################### |
| |
| awkscript=$TMP/stdcxx-cross.$$.awk |
| |
| cat > $awkscript <<EOF |
| BEGIN { |
| columns = "" |
| compinx = 0 |
| count = 0 |
| max_asserts = 0 |
| min_asserts = -1 |
| } |
| \$0 ~ "^" name " *[^-]" { |
| |
| status = \$2 |
| |
| if (status == 0) { |
| if (comp == "example" || \$5 == 0) { |
| if (\$3 == 0) { |
| class = "OK" |
| value = "0" |
| } |
| else { |
| ++count; |
| ++nfailures [compinx] |
| class = "RUNWARN" |
| value = "(" \$3 ")" |
| } |
| } |
| else { |
| ++count |
| ++nfailures [compinx] |
| |
| class = "ASSERT" |
| # value = \$5 " / " \$4 |
| value = "(" \$5 ")" |
| } |
| |
| if (comp == "test") { |
| asserts [n] = \$5 |
| |
| if (max_asserts < \$4) { |
| max_asserts = \$4 |
| } |
| |
| if (\$4 < min_asserts || min_asserts < 0) { |
| min_asserts = \$4 |
| } |
| } |
| } |
| else if (0 < status && status < 256) { |
| ++count |
| ++nfailures [compinx] |
| |
| class = "EXIT" |
| value = status |
| } |
| else if (status == "FORMAT" || status == "NOUT" || status == "OUTPUT") { |
| ++count |
| |
| class = status |
| value = status |
| } |
| else if (status == "DIFF" || status == "COMP" || status == "LINK") { |
| ++count |
| ++nfailures [compinx] |
| |
| class = status |
| value = status |
| } |
| else { |
| ++count |
| ++nfailures [compinx] |
| |
| class = "SIGNAL" |
| value = status |
| } |
| |
| columns = columns "\n <td class=\"" class "\">" value "</td>" |
| |
| ++compinx |
| } |
| |
| function build_summary () { |
| if (verbose || count) { |
| print " <tr>" |
| print " <td class=\"rowno\">" n "</td>" |
| print " <td class=\"name\"><a name=\"" name "\">" \ |
| name "</a></td>" |
| |
| if (comp == "test") { |
| print " <td class=\"number\">" max_asserts "</td>" |
| } |
| |
| print columns; |
| print " </tr>" |
| } |
| |
| tmpfile = "$TMP/.stdcxx-failtotals.$$.txt" |
| |
| if (count) { |
| getline < tmpfile |
| close(tmpfile) |
| |
| ORS=" " |
| for (i = 0; i < compinx; ++i) { |
| print nfailures [i] + \$(i + 1) > tmpfile |
| } |
| |
| ORS="\n" |
| print "" >> tmpfile |
| close(tmpfile) |
| } |
| |
| if (FILENAME == "-") { |
| |
| if (comp == "test") { |
| print "<td class=\"header\"></td>" |
| } |
| |
| getline < tmpfile |
| |
| for (i = 1; i < NF + 1; ++i) { |
| print " <td class=\"header\">" \$(i) "</td>" |
| } |
| |
| system("rm -f " tmpfile) |
| } |
| } |
| |
| function component_summary () { |
| print columns; |
| } |
| |
| END { |
| if (comp != "") { |
| build_summary() |
| } |
| else { |
| component_summary() |
| } |
| } |
| EOF |
| |
| ###################################################################### |
| |
| # process a list of components, one component per row |
| process_components() |
| { |
| component_name=$1 |
| component_list=$2 |
| |
| if [ $component_name = "test" ]; then |
| column3=" <th><div title=\"maximum total assertions\">asserts</div></th>" |
| else |
| unset column3 |
| fi |
| |
| cat <<EOF | output |
| <h2>Results of ${component_name}s</h2> |
| <table> |
| <tr> |
| <th><div title="${component_name} number">###</div></th> |
| <th> |
| <a name="${component_name}s"></a>$component_name name |
| </th> |
| $column3 |
| $table_header |
| </tr> |
| EOF |
| |
| n=0; |
| for c in $component_list; do |
| |
| n=`expr $n + 1` |
| |
| awk -f $awkscript \ |
| n=$n name=$c verbose=$verbose comp=$component_name \ |
| $textlogs \ |
| | output |
| |
| done |
| cat <<EOF | output |
| <tr> |
| <td class="rowno">$n</th> |
| <td class="header"> |
| <div title="total number of ${component_name}s/failed number of ${component_name}s">total/failed</div> |
| </td> |
| EOF |
| |
| echo "" | awk -f $awkscript comp=$component_name | output |
| |
| cat <<EOF | output |
| </tr> |
| </table> |
| EOF |
| } |
| |
| ###################################################################### |
| |
| # process a list of builds, one build per row |
| process_builds() |
| { |
| component_name=$1 |
| component_list=$2 |
| |
| cat <<EOF | output |
| <h2>Results of ${component_name}s</h2> |
| <table> |
| <tr> |
| <th><a name="${component_name}s"></a>log</th> |
| $table_header |
| </tr> |
| EOF |
| |
| for l in $textlogs; do |
| |
| fname=`basename $l .$$` |
| cat <<EOF | output |
| <tr> |
| <td class="name"> |
| <a href="$logdir/$fname">$fname</a> |
| </td> |
| EOF |
| |
| for c in $component_list; do |
| |
| line=`grep "^$c *[^-]" $l` |
| if [ $? -eq 0 -a "$line" != "" ]; then |
| echo $line \ |
| | awk -f $awkscript component=$component_name \ |
| name=$c verbose=$verbose \ |
| | output |
| else |
| output " <td class=\"missing\">N/A</td>" |
| fi |
| done |
| |
| output " </tr>" |
| done |
| output " </table>" |
| } |
| |
| |
| if [ $components_in_rows -ne 0 ]; then |
| process_components "example" "`cat $examples_file`" |
| process_components "test" "`cat $tests_file`" |
| process_components "locale" "`cat $locales_file`" |
| else |
| if [ "$examples_list" != "" ]; then |
| process_builds "example" "$examples_list" |
| fi |
| |
| if [ "$test_list" != "" ]; then |
| process_builds "test" "$test_list" |
| fi |
| |
| if [ "$locale_list" != "" ]; then |
| process_builds "locale" "$locale_list" |
| fi |
| fi |
| |
| |
| ###################################################################### |
| # output the rest of the HTML file |
| cat <<EOF | output |
| <h2><a name="codes"></a>Codes and Colors</h2> |
| <table> |
| <thead> |
| <tr> |
| <td class="header">Symbol</td> |
| <td class="header">Meaning</td> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="OK">OK</td> |
| <td class="na"> |
| Component completed successfully and produced the expected |
| output. |
| </td> |
| </tr> |
| <tr> |
| <td class="NOUT">NOUT</td> |
| <td class="na"> |
| Component completed successfully and produced no output. |
| </td> |
| </tr> |
| <tr> |
| <td class="BASE">BASE</td> |
| <td class="na"> |
| Component completed successfully and matched the baseline. |
| </td> |
| </tr> |
| <tr> |
| <td class="missing">N/A</td> |
| <td class="na">Component was not tested.</td> |
| </tr> |
| <tr> |
| <td class="XDEP">XDEP</td> |
| <td class="na"> |
| Component was not attempted due to a missing (or failed) |
| dependency. |
| </td> |
| </tr> |
| <tr> |
| <td class="COMP">COMP</td> |
| <td class="na">Component failed to compile.</td> |
| </tr> |
| <tr> |
| <td class="LINK">LINK</td> |
| <td class="na"> |
| Component compiled successfully but failed to link. |
| </td> |
| </tr> |
| <tr> |
| <td class="WARN">WARN</td> |
| <td class="na"> |
| Component compiled and linked successfully but with warnings. |
| </td> |
| </tr> |
| <tr> |
| <td class="runwarn">(N)</td> |
| <td class="na"> |
| Component compiled and linked successfully, exited with |
| a status of 0, but produced N warnings at runtime. |
| </td> |
| </tr> |
| <tr> |
| <td class="EXIT">N</td> |
| <td class="na"> |
| Component compiled and linked successfully but exited with |
| a non-zero status of N. |
| </td> |
| </tr> |
| <tr> |
| <td class="DIFF">DIFF</td> |
| <td class="na"> |
| Component compiled and linked successfully, exited with |
| a status of 0, but produced unexpected output. |
| </td> |
| </tr> |
| <tr> |
| <td class="SIGNAL">[SIG]<name></td> |
| <td class="na"> |
| Component compiled and linked successfully, but exited |
| with the named signal (for example, SIGABRT). |
| </td> |
| </tr> |
| <tr> |
| <td class="assert">(N)</td> |
| <td class="na"> |
| Component compiled and linked successfully, exited with |
| a status of 0, but failed Nassertions at runtime. |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <h2><a name="buildtypes"></a>Build Types</h2> |
| |
| <table> |
| <thead> |
| <tr> |
| <td class="header">Library:</td> |
| <th colspan="2">Archive Library</th> |
| <th colspan="2">Shared Library</th> |
| <th colspan="2">Shared Archive (AIX)</th> |
| </tr> |
| <tr> |
| <td class="header">Number/Symbol</td> |
| <td class="header">s<br>(32-bit)</td> |
| <td class="header">S<br>(64-bit)</td> |
| <td class="header">d<br>(32-bit)</td> |
| <td class="header">D<br>(64-bit)</td> |
| <td class="header">a<br>(32-bit)</td> |
| <td class="header">A<br>(64-bit)</td> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="header"><b>8</b><br>(optimized)</td> |
| <td class="na"> |
| <b>8s</b>: Debugging off, optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>8S</b>: Debugging off, optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>8d</b>: Debugging off, optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>8D</b>: Debugging off, optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>8a</b>: Debugging off, optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>8A</b>: Debugging off, optimized, not reentrant. |
| </td> |
| </tr> |
| <tr> |
| <td class="header"><b>11</b><br>(debug)</td> |
| <td class="na"> |
| <b>11s</b>: Debug, not optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>11S</b>: Debug, not optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>11d</b>: Debug, not optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>11D</b>: Debug, not optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>11a</b>: Debug, not optimized, not reentrant. |
| </td> |
| <td class="na"> |
| <b>11A</b>: Debug, not optimized, not reentrant. |
| </td> |
| </tr> |
| <tr> |
| <td class="header"><b>12</b><br>(optimized)</td> |
| <td class="na"> |
| <b>12s</b>: Debugging off, optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>12S</b>: Debugging off, optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>12d</b>: Debugging off, optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>12D</b>: Debugging off, optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>12a</b>: Debugging off, optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>12A</b>: Debugging off, optimized, reentrant. |
| </td> |
| </tr> |
| <tr> |
| <td class="header"><b>15</b><br>(debug)</td> |
| <td class="na"> |
| <b>15s</b>: Debug, not optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>15S</b>: Debug, not optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>15d</b>: Debug, not optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>15D</b>: Debug, not optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>15a</b>: Debug, not optimized, reentrant. |
| </td> |
| <td class="na"> |
| <b>15A</b>: Debug, not optimized, reentrant. |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </body> |
| </html> |
| EOF |
| |
| ###################################################################### |
| |
| if [ -z $no_clean ]; then |
| # clean up |
| rm $awkscript $examples_file $tests_file $locales_file |
| |
| for l in $textlogs; do |
| rm $l |
| done |
| fi |