| #!/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 - 2008 Rogue Wave Software, Inc. |
| # |
| ######################################################################## |
| # |
| # 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. |
| # |
| # -h Print help. |
| # |
| # -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 <text> |
| # Specify the title for the page. |
| # |
| # -t <list-of-tests> |
| # Generate a report for the specified list of tests with |
| # tests listed in columns and builds in rows. |
| # |
| # -V <version> |
| # Stdcxx version (branch) to generate results for. |
| # When omitted, trunk is assumed. |
| # |
| ######################################################################## |
| |
| if [ "$BASH" = "" ]; then |
| # this is not Bash; try to invoke it |
| if [ -x /usr/local/bin/bash ]; then |
| /usr/local/bin/bash $0 "$@" |
| exit $? |
| fi |
| fi |
| |
| ###################################################################### |
| # global constants |
| |
| # the directory where the script is located to get a hold of other |
| # files at locations relative to this one (assumes the script resides |
| # within the stdcxx source tree) |
| readonly mydir=`dirname $0` |
| readonly rootdir=$mydir/.. |
| |
| readonly today=`LC_ALL="C" date` |
| |
| # URL to the ViewVC directory |
| readonly viewvc="http://svn.apache.org/viewvc" |
| |
| # URL to the revision number (use: "$revurl=$revno") |
| readonly revurl="$viewvc?view=rev&rev" |
| |
| # URL to the trunk of the source repository |
| readonly svnpath="$viewvc/stdcxx/trunk" |
| |
| # expected failures |
| readonly xfailfile=$rootdir/etc/config/xfail.txt |
| |
| # xcross-component awk script |
| readonly xcomp=$mydir/xcomp.awk |
| |
| ###################################################################### |
| # global variables |
| |
| # by default, display one component (example, locale, or test) per row |
| components_in_rows=1 |
| |
| # no verbosity by default |
| verbose=0 |
| |
| # default page title (unless overridden on the command line) |
| title="Multi-platform Test Result View" |
| |
| # extract the script's revision number |
| myrev='$Revision$' |
| myrev=${myrev#'$Revision: '} # strip leading text |
| myrev=${myrev%' $'} # strip trailing text |
| |
| # form the URL to this version of the script in the repository |
| myurl='$HeadURL$' |
| myurl=${myurl#'$HeadURL: '} # strip leading text |
| myurl=${myurl##*asf/} # strip svn prefix |
| myurl=${myurl%' $'} # strip trailing text |
| |
| # prepend ViewVC prefix |
| myurl="http://svn.apache.org/viewvc/$myurl" |
| |
| # extract program name from the url (used in diagnostic messages) |
| readonly myname=${myurl##*/} |
| |
| myurl="$myurl?view=markup&rev=$myrev" |
| |
| ###################################################################### |
| |
| print_help () |
| { |
| echo "NAME" |
| echo " $myname - generate a cross-build result page" |
| echo |
| echo "SYNOPSIS" |
| echo " $myname [option(s)...] [log-file(s)...]" |
| echo |
| echo "DESCRIPTION" |
| echo " The $myname utility generates a build result in HTML format" |
| echo " across multiple platforms or tests with builds in columns and" |
| echo " components such as examples, locales, and tests in rows by" |
| echo " default." |
| echo |
| echo "OPTIONS" |
| echo " -n No clean. Avoid removing temporary files." |
| echo |
| echo " -s Stylesheet. Create a style sheet named resultstyle.css in" |
| echo " the same directory as the output file when the -o option" |
| echo " is specified, or in the current working directory otherwise." |
| echo |
| echo " -v Verbose. Produce verbose output on stdout." |
| echo |
| echo " -e <list-of-examples>" |
| echo " Generate a report for the specified list of example programs" |
| echo " with examples listed in columns and builds in rows." |
| echo |
| echo " -h Print help." |
| echo |
| echo " -l <list-of-locales>" |
| echo " Generate a report for the specified list of locales with" |
| echo " locales listed in columns and builds in rows." |
| echo |
| echo " -o <output-file>" |
| echo " Specify the pathname of the output file. The utility will" |
| echo " use stdout when no output file is specified." |
| echo |
| echo " -T <text>" |
| echo " Specify the title for the page." |
| echo |
| echo " -t <list-of-tests>" |
| echo " Generate a report for the specified list of tests with" |
| echo " tests listed in columns and builds in rows." |
| echo |
| echo " -V <version>" |
| echo " Stdcxx version (branch) to generate results for." |
| echo " When omitted, trunk is assumed." |
| } |
| |
| ###################################################################### |
| |
| # extracts the real, user and system times for a specified stage |
| # of the build process from the file given by the second argument |
| # and writes them out to stdout |
| get_times () |
| { |
| stage=$1 |
| file=$2 |
| |
| pattern="^### real, user, system time ($stage):" |
| |
| # extract the real, user and system times for the children |
| # of the shell that executed the commands from the log |
| # the format of the output is: |
| # <real-time> |
| # <times-output> |
| # with <real-time> looking like: |
| # [1-9][0-9]*m[1-9][0-9]s |
| # and with <times-output> being the output of the POSIX standard |
| # times built-in utility, i.e., the first line giving the system |
| # and user times for the shell and the second line giving the |
| # system and user times for its children in the format: |
| # "%dm%fs %dm%fs" |
| # we don't care about the shell times, just the times for its |
| # children, so we skip that line |
| |
| |
| stage_times=` sed -n "/$pattern/{n;p;n;n;p;}" $file` |
| |
| # strip newlines and fractional parts of seconds and replace |
| # 'm' with ':' |
| |
| stage_times=` echo $stage_times \ |
| | sed -e "s/\.[0-9][0-9]*s//g" \ |
| -e "s/s//" \ |
| -e "s/m/:/g"` |
| |
| # extract the real time (first) |
| real_time=${stage_times%% *} |
| |
| # append a leading '0' to single-digit seconds |
| sec=${real_time##*:} |
| if [ ${#sec} -eq 1 ]; then |
| real_time=${real_time%:*}":0$sec" |
| fi |
| |
| # extract the user time (middle) |
| user_time=${stage_times#* } |
| user_time=${user_time%% *} |
| |
| # append a leading '0' to single-digit seconds |
| sec=${user_time##*:} |
| if [ ${#sec} -eq 1 ]; then |
| user_time=${user_time%:*}":0$sec" |
| fi |
| |
| # extract the system time (last) |
| sys_time=${stage_times##* } |
| |
| # append a leading '0' to single-digit seconds |
| sec=${sys_time##*:} |
| if [ ${#sec} -eq 1 ]; then |
| sys_time=${sys_time%:*}":0$sec" |
| fi |
| |
| # output the three times |
| cat <<EOF |
| <td>$real_time</td> |
| <td>$user_time</td> |
| <td>$sys_time</td> |
| EOF |
| } |
| |
| ###################################################################### |
| # extracts the date and time the build started from the file |
| # given by the second argument |
| get_build_date () |
| { |
| file=$1 |
| |
| # extract the date and time the build started |
| # the date is expected to be introduced by a line like this: |
| # ### date: |
| date=`sed -n "/^##* *date *: *$/{n;p;q;}" $file` |
| if [ "$date" = "" ]; then |
| echo "$myname: warning: unable to extract date from $l" >&2 |
| unset date |
| fi |
| |
| # strip the year from the date |
| echo ${date% [1-9][0-9][0-9][0-9]} |
| } |
| |
| |
| ###################################################################### |
| # formats a size value in an easy-to-read way |
| format_size () |
| { |
| size=$1 |
| |
| if [ "$size" = "" ]; then |
| : |
| elif [ $size -ge 1000000000 ]; then |
| # over billion bytes, get size in gigabytes up to 2 decimal places |
| gbsize="$((size / 1073741824)).$(((size % 1073741) / 100000))" |
| size="<div title=\"$size bytes\">$gbsize GB</div>" |
| elif [ $size -ge 1000000 ]; then |
| # over million bytes, get size in megabytes up to 2 decimal places |
| mbsize="$((size / 1048576)).$(((size % 1048576) / 100000))" |
| size="<div title=\"$size bytes\">$mbsize MB</div>" |
| elif [ $size -ge 10000 ]; then |
| # over ten thoudand bytes, get even size in kilobytes |
| kbsize="$((size / 1024))" |
| size="<div title=\"$size bytes\">$kbsize kB</div>" |
| elif [ $size -ge 1000 ]; then |
| # over thoudand bytes, get size in kilobytes up to 2 decimal places |
| kbsize="$((size / 1024)).$(((size % 1024) / 100))" |
| size="<div title=\"$size bytes\">$kbsize kB</div>" |
| fi |
| |
| echo $size |
| } |
| |
| |
| ###################################################################### |
| # extracts the size of the library binary from the build log |
| # being careful to avoid the symlink (in the case of a .so) |
| get_lib_size () |
| { |
| file=$1 |
| |
| libsize=`awk '/build\/lib\/libstd[^ ]*\$/{ print $5 }' $file` |
| if [ "$libsize" = "" ]; then |
| # avoid warning for missing library size to reduce the noise |
| # in cases when it fails to build |
| # echo "$myname: warning: unable to extract library size from $l" >&2 |
| unset libsize |
| fi |
| |
| echo $libsize |
| } |
| |
| |
| ###################################################################### |
| # extracts the build type from the string specified by the argument |
| # (the name of the log) |
| get_buildtype () |
| { |
| str=$1 |
| |
| # extract the build type from the name of the log, removing |
| # the name of thread library |
| buildtype=` echo $str \ |
| | sed "s/\(.*-[18][125]*[aAdDsS]\)-dce-\(.*\)/\1-\2/" \ |
| | sed "s/\(.*-[18][125]*[aAdDsS]\)-solaris-\(.*\)/\1-\2/" \ |
| | sed "s/\(.*-[18][125]*[aAdDsS]\)-win32-\(.*\)/\1-\2/" \ |
| | sed "s/.*-\([18][125]*[aAdDsS]\)-[1-9][0-9]*-log.*/\1/"` |
| if [ "$buildtype" = "" ]; then |
| echo "$myname: warning: unable to extract build type from $str" >&2 |
| unset buildtype |
| fi |
| |
| echo $buildtype |
| } |
| |
| ###################################################################### |
| # extracts the operating system name and version from the log file |
| get_os () |
| { |
| file=$1 |
| |
| uname=`sed -n "/^##* uname *-a.*:$/{n;p;q;}" $file` |
| |
| case "$uname" in |
| "AIX "*) |
| osname="AIX" |
| # extract the version number from AIX uname -a output: |
| # "AIX <hostname> <minor> <major> ... |
| osver=${uname#* } # remove AIX |
| osver=${osver#* } # remove hostname |
| minor=${osver%% *} # extract minor version |
| osver=${osver% *} # remove gibberish at the end |
| osver=${osver#* }"."$minor |
| ;; |
| |
| CYGWIN*) |
| osname="Cygwin" |
| osver=${uname#* } # remove CYGWIN |
| osver=${osver#* } # remove hostname |
| osver=${osver%%(*} # extract version |
| ;; |
| |
| *"FreeBSD "*) |
| osname="FreeBSD" |
| ;; |
| |
| "HP-UX "*) |
| # for example |
| # HP-UX hostname B.11.23 U ia64 0025699549 unlimited-user license |
| osname="HP-UX" |
| osver=${uname#* } # remove HP-UX |
| osver=${osver#* } # remove hostname |
| osver=${osver%% *} # extract full version |
| osver=${osver#[A-Z].} # remove letter prefix |
| ;; |
| |
| "IRIX64 "*) |
| ;; |
| |
| "Linux "*) |
| # extract the Linux distron name from the contents |
| # of the /etc/*-release files |
| osname=` sed -n "/^##* * cat *\/etc\/.*-release /{n;p;n;p;}" \ |
| $file \ |
| | sed -e "/^ *LSB_VERSION *=/d" -e "/^ *VERSION *= */d"` |
| |
| rhel="Red Hat Enterprise Linux" |
| |
| # SuSE Linux 10 |
| suse_Linux="SUSE Linux Enterprise Server" |
| |
| # SuSE Linux 9 (sigh...) |
| suse_LINUX="SUSE LINUX Enterprise Server" |
| |
| pfx="<div title=\"$osname\">" |
| sfx="</div>" |
| |
| case "$osname" in |
| "$rhel "*) |
| # remove the Red Hat code name including the release |
| # and keep the distribution code name and update info: |
| # RHEL 5: Tikanga (Update 1 through 2) |
| # RHEL 4: Nahant (Update 1 through 6) |
| # RHEL 3: Taroon (Update 1 through 9) |
| # RHEL 2.1 AS: Pensacola |
| # RHEL 2.1 ES: Panama |
| oscode=${osname##* (} |
| # append space (important below) |
| oscode="${oscode%)} " |
| |
| update=${oscode#* } # strip code name |
| update=${update#* } # strip the word "Update" |
| |
| osver=${osname#$rhel } # strip the distro name |
| ostype=${osver%% *} # extract OS type (AS or Server) |
| osver=${osver#* release } # strip OS type |
| osver=${osver%% (*} |
| |
| # osver="[osver=$osver][oscode=$oscode][update=$update]" |
| |
| osname="RHEL" |
| if [ "$update" != "" ]; then |
| osver="$osver.$update" |
| fi |
| ;; |
| |
| "$suse_Linux "*) |
| osver=${osname#$suse_Linux } |
| osver=${osver%% *} |
| |
| osname="SLES" |
| ;; |
| |
| "$suse_LINUX "*) |
| osver=${osname#$suse_LINUX } |
| osver=${osver%% *} |
| |
| osname="SLES" |
| ;; |
| *) |
| ;; |
| esac |
| ;; |
| |
| "SunOS "*) |
| osname="SunOS" |
| osver=${uname#* } # remove SunOS |
| osver=${osver#* } # remove hostname |
| osver=${osver%% *} # strip averything past version |
| ;; |
| |
| *) |
| osname=$uname |
| ;; |
| esac |
| |
| echo "$pfx$osname $osver$sfx" |
| } |
| |
| ###################################################################### |
| # extracts the hardware architecture from the log file |
| get_arch () |
| { |
| file=$1 |
| |
| uname=`sed -n "/^##* uname *-a.*:$/{n;p;}" $file` |
| |
| if [ "$uname" = "" -o "${uname%%_*}" = "CYGWIN" ]; then |
| # Windows or CygWin |
| id=`sed -n "s/^ *PROCESSOR_IDENTIFIER *= *\(.*\)/\1/p" $file` |
| arch=${id%% *} |
| arch="<div title=\"$id\">$arch</div>" |
| else |
| |
| case "$uname" in |
| # recent HP-UX machines always return 9000/800 |
| "HP-UX "*" 9000/8"??" "*) arch="PA-RISC";; |
| |
| *" i686 "*) arch="i686";; |
| *" i586 "*) arch="i586";; |
| *" i486 "*) arch="i486";; |
| *" i386 "*) arch="i386";; |
| *" i286 "*) arch="i286";; |
| |
| *" ia64 "*) arch="IA64";; |
| |
| *" sparc "*) arch="SPARC";; |
| |
| *" x86_64 "*) |
| arch="x86_64" |
| model=` sed -n "s/^model name.*: *\(.*\)/\1/p" $file \ |
| | sed 's/ */ /g' | head -n 1` |
| if [ ${model%% *} = "Intel(R)" ]; then |
| arch="<div title=\"$model\">EM64T</div>" |
| else |
| arch="<div title=\"$model\">AMD64</div>" |
| fi |
| ;; |
| esac |
| fi |
| |
| echo $arch |
| } |
| |
| ###################################################################### |
| # extracts the compiler and version from the log file |
| get_compiler () |
| { |
| file=$1 |
| |
| compiler=` sed -n "/^configuring stdcxx /{p;q;}" $file \ |
| | sed "s/.* for \([^ ][^ ]*\) .*/\1/"` |
| |
| if [ "${compiler%%[-_]*}" = "xlCcore" ]; then |
| # replace xlCcore with XLC++ for IBM XLC/C++ |
| compiler="XLC++ "${compiler#*-} |
| elif [ "${compiler%%-*}" = "aCC" ]; then |
| # remove the "A.0" version prefix from HP aCC version |
| compiler="aCC ${compiler#aCC-[A-Z].0}" |
| elif [ "$compiler" = "" ]; then |
| # this must be a Windoze compiler... |
| compiler=` sed -n "/^ *CXX *=.*/{p;q;}" $file \ |
| | sed "s/^.*= *\(.*\)/\1/"` |
| |
| if [ "$compiler" = "cl" ]; then |
| vs="Microsoft Visual Studio" |
| |
| compiler=` sed -n "/^ *Variables *: *$/{n;p;}" $file\ |
| | sed "s/ *VERSION= *\(.*\)/\1/"` |
| compiler="MSVC $compiler" |
| elif [ "$compiler" = "icl" ]; then |
| true |
| fi |
| fi |
| |
| echo $compiler | sed "s/-/ /g" |
| } |
| |
| ###################################################################### |
| |
| # process command line options |
| while getopts ":hnsv:e:l:o:T:t:V:" opt_name; do |
| case $opt_name in |
| # options with no arguments |
| |
| h) # print help and exit |
| print_help |
| exit |
| ;; |
| |
| 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 the title of the page |
| title=$OPTARG |
| ;; |
| |
| t) # argument is a list of tests to process |
| test_list=$OPTARG |
| components_in_rows=0 |
| ;; |
| |
| V) # specify stdcxx branch/version to generate cross-build |
| # result views for (trunk by default) |
| version=$OPTARG |
| ;; |
| |
| *) echo "$myname: unknown option : -$opt_name" >&2; |
| echo |
| print_help |
| 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 TMPDIR variable to /tmp if not set |
| [ -z $TMPDIR ] && TMPDIR=/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 { |
| background:lightslategray; |
| font-family:courier; |
| font-size: 80%; |
| } |
| caption { |
| background:lightslategray; |
| color:lightgray; |
| font-weight:bold; |
| font-family:lucida mono; |
| font-size: 120%; |
| } |
| th { |
| background:lightgray; |
| text-align:center; |
| font-family:lucida mono; |
| } |
| td { |
| padding: 2px; |
| text-align: center; |
| } |
| tr { |
| background:powderblue; |
| } |
| td.rowno { |
| text-align: right; |
| background:lightgray; |
| } |
| td.name { |
| text-align: left; |
| background:lightblue; |
| } |
| td.number { |
| text-align: center; |
| background:lightblue; |
| } |
| td.na { |
| background:white; |
| text-align:left; |
| } |
| .header { |
| background:#cccccc; |
| text-align:center; |
| font-weight:bold; |
| font-family:lucida mono; |
| } |
| td.total { |
| text-align:center; |
| font-weight:bold; |
| } |
| td.OK { |
| background:forestgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.XPASS { |
| color:yellow; |
| background:forestgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.BASE { |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.NOUT { |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.OUTPUT { |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.MISS { |
| color:white; |
| background:lightgray; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.WARN { |
| color:red; |
| background:#ffff99; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.XWARN { |
| color:tomato; |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.EXIT { |
| color:red; |
| background:gold; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.XEXIT { |
| color:tomato; |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.FORMAT { |
| background:#ffffcc; |
| text-align:center; |
| } |
| td.RUNWARN { |
| color:black; |
| background:#ffff99; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.XRUNWARN { |
| color:dimgray; |
| background:lightgreen; |
| text-align:center; |
| font-weight:bold; |
| } |
| td.DIFF { |
| color:red; |
| background:#ffff99; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.XDIFF { |
| color:tomato; |
| background:lightgreen; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.ASSERT { |
| color:red; |
| background:#ffff99; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.XASSERT { |
| color:tomato; |
| background:lightgreen; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.SIGNAL { |
| color:yellow; |
| background:red; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.XSIGNAL { |
| color:tomato; |
| background:lightgreen; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.COMP { |
| background:violet; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.XCOMP { |
| color:violet; |
| background:lightgreen; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.LINK { |
| color:yellow; |
| background:mediumpurple; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.XLINK { |
| color:mediumpurple; |
| background:lightgreen; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.EXEC { |
| color:white; |
| background:mediumslateblue; |
| font-weight:bold; |
| text-align:center; |
| } |
| td.xdep { |
| color:yellow; |
| background:gray; |
| font-weight:bold; |
| text-align:center; |
| } |
| tr.LIB { |
| background:pink; |
| color:black; |
| } |
| EOF |
| |
| fi |
| |
| ###################################################################### |
| |
| readonly scripturl="<a href=\"$myurl\"><code>$myname</code></a>" |
| |
| # output the initial portion of the HTML file |
| cat <<EOF | output |
| <html> |
| <head> |
| <title>$title</title> |
| <link rel="stylesheet" href="resultstyle.css" type="text/css" |
| title="Cross-Build View Style Sheet"> |
| </head> |
| <body> |
| |
| <h1>$title</h1> |
| Generated $today by $scripturl on `hostname` running `uname -sr` |
| <hr> |
| |
| <h2>Index</h2> |
| |
| <ul> |
| <li><a href="#logs">Logs and Columns</a></li> |
| <li><a href="#timings">Timings</a></li> |
| <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 name of a temporary file containing the build timings |
| timings_file=$TMPDIR/.stdcxx-timings.$$ |
| |
| # remove the temporary file |
| rm -f timings_file |
| |
| if [ $? -ne 0 ]; then |
| exit 2 |
| fi |
| |
| ###################################################################### |
| # expand gzipped logs and extract the relevant portion from each into |
| # a smaller text file for fast and easy processing; the names of all |
| # the text files are stored in the textlogs variable |
| |
| # number of logs processed in loop below |
| logcount=0 |
| |
| # space-separated list of names of text logs processed in loop below |
| textlogs="" |
| logdir="" |
| |
| for l in $gzlogs; do |
| logcount=$((logcount + 1)) |
| fname=`basename $l` |
| |
| if [ $verbose -eq 1 ]; then |
| echo "$myname: processing $l" |
| fi |
| |
| # set temporary variables (valid only within the loop) |
| txtlog=$TMPDIR/`basename $l .gz.txt`.txt.$$ |
| |
| if [ "$logdir" = "" ]; then |
| logdir=`dirname $l` |
| elif [ $logdir != `dirname $l` ]; then |
| echo "$myname: not implemented: logs in multiple directories" >&2 |
| fi |
| |
| # append the name of the log to the list |
| textlogs="$textlogs $txtlog" |
| |
| # unzip the log into a temporary text file |
| gunzip -c $l > $txtlog |
| if [ $? -ne 0 ]; then |
| echo "$myname: error unzipping $l" >&2 |
| |
| # continue processing the empty log below |
| fi |
| done |
| |
| ###################################################################### |
| |
| # check to see |
| if [ -r $xfailfile ]; then |
| xfails=$xfailfile |
| else |
| xfails="" |
| fi |
| |
| $xcomp bodyonly=1 logdir=$logdir version=$version $xfails $textlogs | output |
| |
| ###################################################################### |
| # output the rest of the HTML file |
| cat <<EOF | output |
| <h2><a name="codes"></a>Codes and Colors</h2> |
| <table> |
| <thead> |
| |
| <tr> |
| <th colspan=4 class="header">Status</th> |
| <th rowspan=2 class="header">Meaning</th> |
| </tr> |
| <tr> |
| <th class="header" title="Unexpected success or ordinary failure"> |
| Unexpected |
| </th> |
| <th class="header">Severity</th> |
| <th class="header" title="Ordinary success or expected failure"> |
| Expected |
| </th> |
| <th class="header">Severity</th> |
| </tr> |
| </thead> |
| |
| <tbody> |
| <tr> |
| <td class="XPASS">XPASS</td> |
| <td class="na">Success</td> |
| <td class="OK">OK</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component completed successfully and produced the expected |
| output. |
| </td> |
| </tr> |
| <tr> |
| <td colspan=2 class="na"><center>Not Applicable</center></td> |
| <td class="NOUT">NOUT</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component completed successfully and produced no output. |
| </td> |
| </tr> |
| <tr> |
| <td colspan=2 class="na"><center>Not Applicable</center></td> |
| <td class="BASE">BASE</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component completed successfully and matched the baseline. |
| </td> |
| </tr> |
| <tr> |
| <td colspan=2 class="na"><center>Not Applicable</center></td> |
| <td class="FORMAT">FORMAT</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component completed successfully but produced unexpected |
| output. |
| </td> |
| </tr> |
| <tr> |
| <td class="MISS">N/A</td> |
| <td class="na">Success</td> |
| <td colspan=2 class="na"><center>Not Applicable</center></td> |
| <td class="na">Component was not tested.</td> |
| </tr> |
| <tr> |
| <td class="XDEP">XDEP</td> |
| <td class="na">Failure</td> |
| <td colspan=2 class="na"><center>Not Applicable</center></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">Failure</td> |
| <td class="XCOMP">XCOMP</td> |
| <td class="na">Success</td> |
| <td class="na">Component failed to compile.</td> |
| </tr> |
| <tr> |
| <td class="LINK">LINK</td> |
| <td class="na">Failure</td> |
| <td class="XLINK">XLINK</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component compiled successfully but failed to link. |
| </td> |
| </tr> |
| <tr> |
| <td class="EXEC">EXEC</td> |
| <td class="na">Failure</td> |
| <td colspan=2 class="na"><center>Not Applicable</center></td> |
| <td class="na"> |
| Component compiled and linked successfully but failed |
| to execute (possibly due to a linker error). |
| </td> |
| </tr> |
| <tr> |
| <td class="WARN">WARN</td> |
| <td class="na">Success</td> |
| <td class="XWARN">XWARN</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component compiled and linked successfully but with warnings. |
| </td> |
| </tr> |
| <tr> |
| <td class="RUNWARN">(N)</td> |
| <td class="na">Success</td> |
| <td class="XRUNWARN">(N)</td> |
| <td class="na">Success</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">Failure</td> |
| <td class="XEXIT">N</td> |
| <td class="na">Success</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">Failure</td> |
| <td class="XDIFF">XDIFF</td> |
| <td class="na">Success</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">Failure</td> |
| <td class="XSIGNAL">X[SIG]<name></td> |
| <td class="na">Success</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">Failure</td> |
| <td class="XASSERT">(N)</td> |
| <td class="na">Success</td> |
| <td class="na"> |
| Component compiled and linked successfully, exited with |
| a status of 0, but failed N assertions 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 |
| |
| if [ $verbose -eq 1 ]; then |
| echo "$myname: rm $textlogs $timings_file" |
| fi |
| |
| rm -f $textlogs $timings_file |
| fi |