first commit
This commit is contained in:
712
extern/stdcxx/4.2.1/bin/buildntest
vendored
Normal file
712
extern/stdcxx/4.2.1/bin/buildntest
vendored
Normal file
@@ -0,0 +1,712 @@
|
||||
#!/bin/bash
|
||||
########################################################################
|
||||
#
|
||||
# $Id: buildntest 642294 2008-03-28 17:02:14Z sebor $
|
||||
#
|
||||
# script to build and test the Apache C++ Standard Library
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# 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, Inc.
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# USAGE:
|
||||
#
|
||||
# buildntest [ -e <examples-to-build> ]
|
||||
# [ -l <locales-to-build> ]
|
||||
# [ -o <output-file> ]
|
||||
# [ -t <tests-to-build> ]
|
||||
# [ -u <utilities-to-build> ]
|
||||
# [ -C <config> ]
|
||||
# [ -B <buildtype> ]
|
||||
# [ -E <examples-to-run> ]
|
||||
# [ -L <locales-to-run> ]
|
||||
# [ -M <buildmode> ]
|
||||
# [ -P <prefix> ]
|
||||
# [ -T <tests-to-run> ]
|
||||
#
|
||||
# OPTIONS:
|
||||
#
|
||||
# -e <examples-to-build>
|
||||
# Specifies the list of example programs to build. When omitted,
|
||||
# defaults to all.
|
||||
#
|
||||
# -l <locales-to-build>
|
||||
# Specifies the list of locales to build. When omitted, defaults
|
||||
# to all.
|
||||
#
|
||||
# -o <output-file>
|
||||
# Specifies the name of the ouptut file to create. When omitted,
|
||||
# defaults to STDOUT and STDERR.
|
||||
#
|
||||
# -t <tests-to-build>
|
||||
# Specifies the list of tests to build. When omitted, defaults
|
||||
# to all.
|
||||
#
|
||||
# -B <buildtype>
|
||||
# Specifies the value of the BUILDTYPE variable to pass to
|
||||
# make.
|
||||
#
|
||||
# -C <config>
|
||||
# Specifies the value of the CONFIG variable to pass to make.
|
||||
#
|
||||
# -M <buildmode>
|
||||
# Specifies the value of the BUILDMODE variable to pass to
|
||||
# make.
|
||||
#
|
||||
# -E <examples-to-run>
|
||||
# Specifies the list of example programs to run. When omitted,
|
||||
# defaults to <examples-to-build>.
|
||||
#
|
||||
# -L <locales-to-run>
|
||||
# Specifies the list of locales to exhaustively test. When
|
||||
# omittedm, defaults to <locales-to-build>.
|
||||
#
|
||||
# -P <prefix>
|
||||
# Specifies the value for the PREFIX variable to pass to make.
|
||||
# When omitted, the test makefile target is not exercised.
|
||||
#
|
||||
# -T <tests-to-run>
|
||||
# Specifies the list of tests to run. When omitted, defaults
|
||||
# to <tests-to-build>.
|
||||
#
|
||||
# EXAMPLES:
|
||||
#
|
||||
# Example 1:
|
||||
#
|
||||
# buildntest -Cgcc.config -B15s \
|
||||
# -e"accumulate money_put time_get" \
|
||||
# -l"en_US.ISO-8859-1 de_DE.ISO-8859-15" \
|
||||
# -t"21.string.append 21.string.replace" \
|
||||
# -E"time_get" -L"de_DE.ISO-8859-15" \
|
||||
# -Pinstall
|
||||
#
|
||||
# The command above will build the stdcxx library with gcc in the
|
||||
# 15s build type, then build the accumulate, money_put, and time_get
|
||||
# example programs, the en_US.ISO-8859-1 and de_DE.ISO-8859-15
|
||||
# locales, and the tests 21.string.append and 21.string.replace.
|
||||
# Then it will run the time_get example, followed by running tests
|
||||
# for the de_DE.ISO-8859-15 locale, then run the two tests it built
|
||||
# and, finally, execute the install target with 'install' as the
|
||||
# installation directory.
|
||||
#
|
||||
# RESULT FILE FORMAT:
|
||||
#
|
||||
# When buildntest is run, it produces an output file named results.xml.
|
||||
# This name is an historical artifact, as the contents are actually a
|
||||
# Java-style (key=value pairs) property list. This file is used by the
|
||||
# nightly automated testing system, so extreme caution should be taken
|
||||
# when changing either the name of the file or the format of the
|
||||
# contents, as changes to the nightly testing system will likely be
|
||||
# required. The majority of this file is currently generated by the
|
||||
# parse_runlog.awk script (not in subversion), but generation should be
|
||||
# moved into the exec utility.
|
||||
#
|
||||
# The first property contained in this file must have the name
|
||||
# 'result.file.type' and a value of either 'stdcxx-short' or
|
||||
# 'stdcxx-extended'. The contents of a file taged as 'stdcxx-extended'
|
||||
# are a supserset of the contents of a file taged as 'stdcxx-short',
|
||||
# though all properties beyond the header property are optional.
|
||||
#
|
||||
# stdcxx-short files contain the following defined properties:
|
||||
# state
|
||||
# Denotes the state of the run. Valid values are 'C' (denoting a
|
||||
# catastrophic failure, such as a configuration filure), 'F'
|
||||
# (denoting a failure building the libstd library), 'E' (denoting
|
||||
# a failure building the rwtest library), 'L' (denoting a failure
|
||||
# building the exec utility), and 'T' (denoting no major
|
||||
# failures).
|
||||
# warnings
|
||||
# An integer, indicating the number of warnings produced during
|
||||
# the build and run process.
|
||||
# examples.run
|
||||
# An integer, indicating the total number of examples which the
|
||||
# infastructure attemted to build.
|
||||
# examples.good
|
||||
# An integer, indicating the total number of examples which ran
|
||||
# to completion and had output matching the expected output (if
|
||||
# available).
|
||||
# tests.run
|
||||
# An integer, indicating the total number of tests which the
|
||||
# infastructure attemted to build.
|
||||
# tests.good
|
||||
# An integer, indicating the number of tests which ran to
|
||||
# completion and reported no failing assertions.
|
||||
# locales.run
|
||||
# An integer, indicating the total number of locale tests which
|
||||
# the infastructure attemted to run.
|
||||
# locales.good
|
||||
# An integer, indicating the number of locale tests which ran to
|
||||
# completion and reported no failing assertions.
|
||||
# utils.run
|
||||
# An integer, indicating the total number of utilities which the
|
||||
# infastructure attemted to build.
|
||||
# utils.good
|
||||
# An integer, indicating the number of utilities which linked
|
||||
# successfully.
|
||||
#
|
||||
# stdcxx-extended files contain additional properties, with names in the
|
||||
# form '{test,example,locale}.<name>.{ret,warn,assert}'. The prefix
|
||||
# {test,example,locale} denotes the type of executable (test, example,
|
||||
# or locale test) that the executable is. The suffix {ret,warn,assert}
|
||||
# denotes the type of data (return code, warning count, assertion count)
|
||||
# the property contains. The values are mapped directly from the output
|
||||
# of the exec utility, with ret coresponding to the STATUS column, warn
|
||||
# coresponding to the WARN column, and assert coresponding to the
|
||||
# FAILED and ASSERTS columns, seperated by the '/' character.
|
||||
#
|
||||
########################################################################
|
||||
|
||||
##########
|
||||
# global constants
|
||||
|
||||
# date format used to compute real time elapsed between stages
|
||||
# assumes 366 days/year for simplicity
|
||||
DATEFMT="((((%Y*366+1%j-100)*24+1%H-100)*60+1%M-100)*60+1%S-100)"
|
||||
OUTFILE=results.xml
|
||||
|
||||
if [ -z "$MAKE" ]; then
|
||||
# let callers override the default gmake
|
||||
MAKE=gmake
|
||||
fi
|
||||
|
||||
# the name of the top-level source directory (TOPDIR)
|
||||
TOPDIR=`pwd | sed -e "s/\//\\\\\\\\\\\//g"` #Mangle path for sed usage
|
||||
|
||||
# script to replace the name of the top-level source and builr directories
|
||||
# with the respective symbols for brevity
|
||||
TRANS="s/${TOPDIR}\/build/\\\$(BUILDDIR)/g;s/${TOPDIR}/\\\$(TOPDIR)/g"
|
||||
|
||||
|
||||
# set the TMPDIR variable if not set
|
||||
[ -z $TMPDIR ] && TMPDIR=$TMP
|
||||
[ -z $TMPDIR ] && TMPDIR=/tmp
|
||||
|
||||
##########
|
||||
# global variables
|
||||
|
||||
# by default (unless otherwise specified on the command line) build
|
||||
# and run all examples, locales, tests, and utilities
|
||||
build_examples="*"
|
||||
build_locales="*"
|
||||
build_rwtest="*"
|
||||
build_tests="*"
|
||||
build_utils="*"
|
||||
|
||||
run_examples="*"
|
||||
run_locales="*"
|
||||
run_rwtest="*"
|
||||
run_tests="*"
|
||||
|
||||
# script's own temporary directory
|
||||
tmpdir=$TMPDIR/stdcxx-tmp.$$
|
||||
|
||||
|
||||
##########
|
||||
# write_times(): writes the amount of real, user, and system time since
|
||||
# the last call, or the date and time if this is the first call
|
||||
write_times()
|
||||
{
|
||||
label=$1
|
||||
|
||||
if [ -z $startsec ]; then
|
||||
echo; echo "### date:"
|
||||
date
|
||||
else
|
||||
elapsed="`date +$DATEFMT`-$startsec"
|
||||
|
||||
# compute the minutes and seconds elapsed of real time since
|
||||
# the last call to the function
|
||||
real_min=$((elapsed))
|
||||
real_min=$((real_min / 60))
|
||||
|
||||
real_sec=$((elapsed))
|
||||
real_sec=$((real_sec % 60))
|
||||
|
||||
# display the real, user, and system times since the last call
|
||||
echo; echo "### real, user, system time ($label):"
|
||||
echo "${real_min}m${real_sec}s"
|
||||
times
|
||||
fi
|
||||
|
||||
# set the new start timestamp
|
||||
startsec=`date +$DATEFMT`
|
||||
}
|
||||
|
||||
|
||||
##########
|
||||
# make_stage(): executes a stage of the build process, reports real,
|
||||
# user, and system times, and processes errors
|
||||
make_stage()
|
||||
{
|
||||
stagedir=$1
|
||||
failstate=$2
|
||||
stageargs=$3
|
||||
|
||||
# remove the longest prefix matching the pattern "*/"
|
||||
stagename="${stagedir##*/}"
|
||||
|
||||
if [ "$failstate" = "" ]; then
|
||||
keep_going="-k"
|
||||
else
|
||||
keep_going=""
|
||||
fi
|
||||
|
||||
if [ "$stagename" = "runall" ]; then
|
||||
runlog="$TMPDIR/run.$$.log"
|
||||
log=$runlog
|
||||
else
|
||||
buildlog="$TMPDIR/build.$$.log"
|
||||
log=$buildlog
|
||||
fi
|
||||
|
||||
echo "### $MAKE $keep_going $stagedir $stageargs $MAKEVARS 2>&1 | sed -e \"${TRANS}\" | tee $log:"
|
||||
|
||||
( # start a subshell to measure user and system times
|
||||
# of the subshell commands only
|
||||
export TMPDIR=$tmpdir
|
||||
|
||||
$MAKE $keep_going $stagedir $stageargs $MAKEVARS 2>&1 \
|
||||
| sed -e "${TRANS}" | tee $log
|
||||
|
||||
# save the status of the first command in the pipeline
|
||||
# and pass it to the parent shell after writing the real,
|
||||
# user, and system times for the subshell and its children
|
||||
status=${PIPESTATUS[0]}
|
||||
|
||||
write_times $stagename
|
||||
|
||||
exit $status
|
||||
)
|
||||
|
||||
status=$?
|
||||
|
||||
if [ -r "$runlog" ]; then
|
||||
# Parse runall results
|
||||
$AWK -f parse_runlog.awk $runlog >>${OUTFILE}
|
||||
|
||||
rm $runlog
|
||||
elif [ -r "$buildlog" ]; then
|
||||
# count warnings and errors in the stage
|
||||
warnings=`grep -i "warning" $buildlog | wc -l`
|
||||
errors=`grep -i "error" $buildlog | wc -l`
|
||||
|
||||
diags=": $warnings warnings and $errors errors,"
|
||||
|
||||
rm $buildlog
|
||||
fi
|
||||
|
||||
if [ $status -ne 0 ]; then
|
||||
if [ "$failstate" = "F" ]; then
|
||||
echo "### stage $stagename${diags} exiting with status $status"
|
||||
|
||||
cat <<EOF >> ${OUTFILE}
|
||||
state=F
|
||||
warnings=0
|
||||
examples.run=0
|
||||
examples.good=0
|
||||
tests.run=0
|
||||
tests.good=0
|
||||
locales.run=0
|
||||
locales.good=0
|
||||
utils.run=0
|
||||
utils.good=0
|
||||
EOF
|
||||
exit $status
|
||||
elif [ "$failstate" != "" ]; then
|
||||
# if failstate is specified and the exit status is non-zero
|
||||
# write out the failstate and exit immediately with an error
|
||||
echo "state=$failstate" >> ${OUTFILE}
|
||||
|
||||
echo "### stage $stagename${diags} exiting with status 1"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "### stage $stagename${diags} continuing with status $status"
|
||||
echo
|
||||
|
||||
return $status
|
||||
}
|
||||
|
||||
##########
|
||||
# main body of script
|
||||
|
||||
# write the name of the script and all arguments
|
||||
echo "### running $0 $* [$#]"
|
||||
|
||||
# script's revision number
|
||||
myrev='$Revision: 634307 $'
|
||||
myrev=${myrev#'$Revision: '} # strip leading text
|
||||
myrev=${myrev%' $'} # strip trailing text
|
||||
|
||||
# URL to this version of the script in the repository
|
||||
myurl='$HeadURL: https://svn.apache.org/repos/asf/stdcxx/trunk/bin/buildntest $'
|
||||
myurl=${myurl#'$HeadURL: '} # strip leading text
|
||||
myurl=${myurl%' $'} # strip trailing text
|
||||
myurl="$myurl?view=markup&rev=$myrev"
|
||||
|
||||
# write the URL to the version of the script that's running
|
||||
echo; echo "### script source: $myurl"
|
||||
|
||||
|
||||
# process command line options
|
||||
while getopts ":nv:e:l:o:t:B:C:E:L:M:P:T:" opt_name; do
|
||||
|
||||
echo "$opt_name:$OPTARG"
|
||||
|
||||
case $opt_name in
|
||||
# options with no arguments
|
||||
|
||||
n) # avoid cleaning up temporary files
|
||||
no_clean=1
|
||||
;;
|
||||
|
||||
v) # output all components (including passing ones)
|
||||
verbose=1
|
||||
;;
|
||||
|
||||
# options with arguments
|
||||
|
||||
e) # argument is a list of examples to build
|
||||
build_examples="$OPTARG"
|
||||
;;
|
||||
|
||||
l) # argument is a list of locales to build
|
||||
build_locales="$OPTARG"
|
||||
;;
|
||||
|
||||
o) # argument is the name of output file (stdout by default)
|
||||
outfile=$OPTARG
|
||||
;;
|
||||
|
||||
t) # argument is a list of tests to build
|
||||
build_tests="$OPTARG"
|
||||
;;
|
||||
|
||||
u) # argument is a list of utilities to process
|
||||
build_utils="$OPTARG"
|
||||
;;
|
||||
|
||||
B) # argument is the value of the BUILDTYPE variable
|
||||
MAKEVARS="$MAKEVARS BUILDTYPE=$OPTARG"
|
||||
;;
|
||||
|
||||
C) # argument is the value of the CONFIG file name
|
||||
MAKEVARS="$MAKEVARS CONFIG=$OPTARG"
|
||||
;;
|
||||
|
||||
E) # argument is a list of examples to run
|
||||
run_examples="$OPTARG"
|
||||
;;
|
||||
|
||||
L) # argument is a space-separated list of locales
|
||||
MAKEVARS="$MAKEVARS LOCALES=\"$OPTARG\""
|
||||
run_locales="$OPTARG"
|
||||
;;
|
||||
|
||||
M) # argument is the value of the BUILDMODE variable
|
||||
MAKEVARS="$MAKEVARS BUILDMODE=$OPTARG"
|
||||
;;
|
||||
|
||||
P) # argument is the value of the PREFIX variable
|
||||
MAKEVARS="$MAKEVARS PREFIX=$OPTARG"
|
||||
prefix=$OPTARG
|
||||
;;
|
||||
|
||||
T) # argument is a list of tests to build
|
||||
run_tests="$OPTARG"
|
||||
;;
|
||||
|
||||
*) echo "$myname: unknown option : -$opt_name" >&2;
|
||||
exit 1;;
|
||||
esac;
|
||||
done
|
||||
|
||||
# default to running the same set of components (examples, locales,
|
||||
# and tests) as those specified to be built
|
||||
if [ "$run_examples" = "*" ]; then
|
||||
run_examples="$build_examples"
|
||||
fi
|
||||
|
||||
if [ "$run_locales" = "*" ]; then
|
||||
run_locales="$build_locales"
|
||||
fi
|
||||
|
||||
if [ "$run_tests" = "*" ]; then
|
||||
run_tests="$build_tests"
|
||||
fi
|
||||
|
||||
|
||||
# remove command line options and their arguments from the command line
|
||||
shift $(($OPTIND - 1))
|
||||
|
||||
|
||||
# Try to make certain we clean up the temp directory
|
||||
# This is an ugly workaround for an HPUX 11.23 glitch we haven't managed
|
||||
# to reproduce in manual testing.
|
||||
trap 'rm -rf $tmpdir' EXIT INT QUIT TERM
|
||||
|
||||
mkdir $tmpdir
|
||||
|
||||
|
||||
# start by writing out information about the host to stdout
|
||||
echo; echo "### uname -a:"
|
||||
uname -a
|
||||
|
||||
osname=`uname -s`
|
||||
|
||||
AWK=awk
|
||||
case "$osname" in
|
||||
(AIX)
|
||||
# output the amount of real memory installed on the host
|
||||
echo; echo "### /usr/sbin/lsattr -El sys0 -a realmem:"
|
||||
/usr/sbin/lsattr -El sys0 -a realmem
|
||||
;;
|
||||
|
||||
(HP-UX)
|
||||
# grep the system log for the amount of physical memory
|
||||
echo; echo "### grep Physical /var/adm/syslog/syslog.log:"
|
||||
grep Physical /var/adm/syslog/syslog.log
|
||||
;;
|
||||
|
||||
(Linux)
|
||||
# output the contents of the /etc/<distro>-release file
|
||||
# to identify the Linux distribution
|
||||
echo; echo "### cat " /etc/*-release ":"
|
||||
cat /etc/*-release
|
||||
|
||||
# output the amount of installed physical memory and swap space
|
||||
echo; echo "### free -o:"
|
||||
free -o
|
||||
|
||||
# output information about installed processors
|
||||
echo; echo "### cat /proc/cpuinfo:"
|
||||
cat /proc/cpuinfo
|
||||
;;
|
||||
|
||||
(SunOS)
|
||||
# use POSIX awk (nawk) rather than Solaris awk
|
||||
# using nawk rather than /usr/xpg4/bin/awk as the later has a bad bug
|
||||
AWK=nawk
|
||||
|
||||
# output the amount of installed physical memory
|
||||
echo; echo "### prtconf | grep Memory:"
|
||||
/usr/sbin/prtconf | grep Memory
|
||||
|
||||
# output information about installed processors
|
||||
echo; echo "### /usr/sbin/psrinfo -v:"
|
||||
/usr/sbin/psrinfo -v
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# output the amount of installed, available, and used disk space
|
||||
# in all mounted filesystems
|
||||
echo; echo "### df -k:"
|
||||
df -k
|
||||
|
||||
# echo today's date
|
||||
write_times
|
||||
|
||||
|
||||
# echo environment to stdout for refernce
|
||||
echo; echo "### env:"
|
||||
env
|
||||
|
||||
echo
|
||||
|
||||
# Start our output file
|
||||
echo "result.file.type=stdcxx-extended" > ${OUTFILE}
|
||||
|
||||
##########
|
||||
# Create build directory, set state to 'C' on failure
|
||||
make_stage "builddir" "C"
|
||||
|
||||
# Configure build directory, set state to 'C' on failure
|
||||
make_stage "config" "C"
|
||||
|
||||
# Build library, set state to 'F' on failure
|
||||
make_stage "-Cbuild/lib" "F"
|
||||
|
||||
# show the library and its size
|
||||
echo; echo "### ls -l build/lib/lib*"
|
||||
ls -l build/lib/lib*
|
||||
|
||||
echo
|
||||
|
||||
|
||||
# State is now 'L' or better
|
||||
|
||||
|
||||
# Build examples, ignore errors
|
||||
if [ "$build_examples" != "" ]; then
|
||||
if [ "$build_examples" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$build_examples"
|
||||
fi
|
||||
make_stage "-Cbuild/examples" "" "$list"
|
||||
fi
|
||||
|
||||
|
||||
# Build utilities, save return code for later
|
||||
if [ "$build_utils" != "" ]; then
|
||||
if [ "$build_utils" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$build_utils"
|
||||
fi
|
||||
|
||||
make_stage "-Cbuild/bin" "" "$list"
|
||||
utils_status=$?
|
||||
else
|
||||
utils_status=1
|
||||
fi
|
||||
|
||||
|
||||
# Build rwtest library, save return code for later
|
||||
if [ "$build_rwtest" != "" ]; then
|
||||
if [ "$build_rwtest" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$build_rwtest"
|
||||
fi
|
||||
make_stage "-Cbuild/rwtest" "" "$list"
|
||||
rwtest_status=$?
|
||||
else
|
||||
rwtest_status=1
|
||||
fi
|
||||
|
||||
|
||||
##########
|
||||
# Create a counter so we can keep track of the number of 'good' utilities.
|
||||
# While not the most accurate, we're calling a utility good if it exists and
|
||||
# is executable. The utilities we check are the exec, locale and localedef,
|
||||
# all of which reside in the build/bin subdirectory and were built above.
|
||||
# The reason this definition isn't accurate is because it doesn't tell us if
|
||||
# the utility is behaving correctly. However, to make such checks would be
|
||||
# more difficult.
|
||||
UTILS=0
|
||||
|
||||
# We want to check that the exec utility is good prior to using it via
|
||||
# the $MAKE runall target
|
||||
if [ -x "build/bin/exec" ]; then
|
||||
if [ 0 == ${rwtest_status} ]; then
|
||||
echo "state=T" >> ${OUTFILE}
|
||||
|
||||
# Build tests only if rwtest built, ignore errors
|
||||
|
||||
if [ "$build_tests" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$build_tests"
|
||||
fi
|
||||
|
||||
make_stage "-Cbuild/tests" "" "$list"
|
||||
else
|
||||
echo "state=E" >> ${OUTFILE}
|
||||
|
||||
if [ 0 == ${utils_status} ]; then
|
||||
utils_status=${rwtest_status}
|
||||
fi
|
||||
fi
|
||||
#Record it as good
|
||||
UTILS=`expr ${UTILS} + 1`
|
||||
|
||||
# Run successfully built executables, ignore errors
|
||||
if [ "$run_examples" = "*" \
|
||||
-a "$run_locales" = "*" \
|
||||
-a "$run_tests" = "*" ]; then
|
||||
make_stage "runall"
|
||||
else
|
||||
if [ "$run_examples" != "" ]; then
|
||||
if [ "$run_examples" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$run_examples"
|
||||
fi
|
||||
|
||||
make_stage "-Cbuild/examples" "" "runall $list"
|
||||
fi
|
||||
|
||||
if [ "$run_locales" != "" ]; then
|
||||
if [ "$run_locales" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$run_locales"
|
||||
fi
|
||||
|
||||
make_stage "-Cbuild/bin" "" "runall $list"
|
||||
fi
|
||||
|
||||
if [ "$run_tests" != "" ]; then
|
||||
if [ "$run_tests" = "*" ]; then
|
||||
unset list
|
||||
else
|
||||
list="$run_tests"
|
||||
fi
|
||||
|
||||
make_stage "-Cbuild/tests" "" "runall $list"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "state=L" >> ${OUTFILE}
|
||||
fi
|
||||
|
||||
if [ -x "build/bin/locale" ]; then
|
||||
UTILS=`expr ${UTILS} + 1`
|
||||
fi
|
||||
|
||||
if [ -x "build/bin/localedef" ]; then
|
||||
UTILS=`expr ${UTILS} + 1`
|
||||
fi
|
||||
|
||||
echo "utils.run=3" >> ${OUTFILE}
|
||||
echo "utils.good="${UTILS} >> ${OUTFILE}
|
||||
|
||||
|
||||
if [ "$prefix" != "" ]; then
|
||||
make_stage "-Cbuild" "" "install"
|
||||
fi
|
||||
|
||||
|
||||
# write out the size of the buildspace and (when specified)
|
||||
# the installation directory BEFORE cleaning it up for reference
|
||||
echo; echo "### du -sk build build/* $prefix"
|
||||
du -sk build build/* $prefix
|
||||
|
||||
|
||||
# Clean up most of what we built. We don't want to clean/realclean include,
|
||||
# as clean deletes the config.log, and realclean deletes the config.h.
|
||||
# The top level realclean target affects the lib, rwtest, bin, test,
|
||||
# plumbhall, and example directories (via the .DEFAULT rule).
|
||||
echo; echo "### $MAKE realclean"
|
||||
$MAKE realclean
|
||||
|
||||
# write out the size of the buildspace AFTER cleaning it up for reference
|
||||
echo; echo "### du -sk ./build/ ./build/*"
|
||||
du -sk ./build/ ./build/*
|
||||
|
||||
# write the amount of real, user, and system time
|
||||
write_times "total"
|
||||
|
||||
# Pass the captured return code from make util/make rwtest back out
|
||||
exit ${utils_status}
|
||||
253
extern/stdcxx/4.2.1/bin/genxviews
vendored
Normal file
253
extern/stdcxx/4.2.1/bin/genxviews
vendored
Normal file
@@ -0,0 +1,253 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Id: genxviews 589896 2007-10-29 22:44:55Z sebor $
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
########################################################################
|
||||
|
||||
CROSS=$HOME/bin/xbuildgen
|
||||
|
||||
OUTDIR=$HOME/public_html/stdcxx/results
|
||||
|
||||
cd $OUTDIR
|
||||
|
||||
cat<<EOF
|
||||
<html>
|
||||
<body>
|
||||
<style type="text/css">
|
||||
|
||||
table {
|
||||
border-width:0px;
|
||||
background:#000000;
|
||||
font-size:smaller;
|
||||
}
|
||||
th {
|
||||
font-size:smaller;
|
||||
background:#cccccc;
|
||||
text-align:center;
|
||||
}
|
||||
td {
|
||||
font-size:smaller;
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
background-color: lightblue;
|
||||
}
|
||||
</style>
|
||||
<h1>Available Multi-platform Build Result Views</h1>
|
||||
Generated `date`
|
||||
<hr>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>OS</td>
|
||||
<th>Architecture</td>
|
||||
<th>Compiler</td>
|
||||
<th>Build Results</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
EOF
|
||||
|
||||
process_results ()
|
||||
{
|
||||
osname="$1"
|
||||
arch="$2"
|
||||
compiler="$3"
|
||||
alllogs="$4"
|
||||
outfile="$5"
|
||||
|
||||
cat<<EOF
|
||||
<tr>
|
||||
<td>$osname</td>
|
||||
<td>$arch</td>
|
||||
<td>$compiler</td>
|
||||
<td><a href="$outfile">$outfile</a></td>
|
||||
</tr>
|
||||
|
||||
EOF
|
||||
|
||||
# build types:
|
||||
# 8: not reentrant, optimized, no debugging info
|
||||
# 11: not reentrant, not optimized with debugging info
|
||||
# 12: reentrant, optimized, no debugging info
|
||||
# 15: reentrant, not optimized, with debugging info
|
||||
btypes="8 11 12 15"
|
||||
|
||||
# a, A: AIX shared archive (32-bit and 64-bit, respectively)
|
||||
# d, D: shared library (.sl, .so, or .dll)
|
||||
# s, S: archive library (.a or .lib(
|
||||
suffixes="a A d D s S"
|
||||
|
||||
unset buildlogs
|
||||
|
||||
for b in $btypes; do
|
||||
for s in $suffixes; do
|
||||
log=`echo $alllogs | tr ' ' '\n' | grep "[-]$b$s-" \
|
||||
| sort | tail -n 1`
|
||||
buildlogs="$buildlogs $log"
|
||||
done
|
||||
done
|
||||
|
||||
$CROSS -o$OUTDIR/$outfile $buildlogs
|
||||
}
|
||||
|
||||
# AIX ##################################################################
|
||||
process_results "AIX 5.3" "PowerPC" "IBM XLC++ 9.0" \
|
||||
"aix-5.3-ppc-vacpp-*-9.0-*-*-log.gz.txt" \
|
||||
aix-5.3-ppc-vacpp-9.0.html
|
||||
|
||||
process_results "AIX 5.3" "PowerPC" "IBM XLC++ 8.0" \
|
||||
"aix-5.3-ppc-vacpp-*-8.0-*-*-log.gz.txt" \
|
||||
aix-5.3-ppc-vacpp-8.0.html
|
||||
|
||||
process_results "AIX 5.3" "PowerPC" "IBM XLC++ 7.0" \
|
||||
"aix-5.3-ppc-vacpp-*-7.0.0.0-*-*-log.gz.txt" \
|
||||
aix-5.3-ppc-vacpp-7.0.html
|
||||
|
||||
process_results "AIX 5.2" "PowerPC" "IBM VisualAge C++ 6.0" \
|
||||
"aix-5.2-ppc-visualage-*-6.0.0-*-*-log.gz.txt" \
|
||||
aix-5.2-ppc-visualage-6.0.html
|
||||
|
||||
# FreeBSD ##############################################################
|
||||
process_results "FreeBSD 6.2" "x86" "gcc 3.4.4" \
|
||||
"freebsd-6.2-x86-gcc-*-3.4.4-*-*-log.gz.txt" \
|
||||
freebsd-6.2-x86-gcc-3.4.4.html
|
||||
|
||||
# HP-UX ################################################################
|
||||
process_results "HP-UX 11.31" "PA-RISC" "HP aCC 3.74" \
|
||||
"hpux-11.31-pa-acc-*-3.74-*-*-log.gz.txt" \
|
||||
hpux-11.31-pa-acc-3.74.html
|
||||
|
||||
process_results "HP-UX 11.31" "PA-RISC" "HP aCC 3.73" \
|
||||
"hpux-11.31-pa-acc-*-3.73-*-*-log.gz.txt" \
|
||||
hpux-11.31-pa-acc-3.73.html
|
||||
|
||||
process_results "HP-UX 11.23" "IPF" "HP aCC 6.13" \
|
||||
"hpux-11.23-ia64-acc-64b-6.13-*-*-log.gz.txt" \
|
||||
hpux-11.23-ia64-acc-6.13.html
|
||||
|
||||
process_results "HP-UX 11.23" "IPF" "HP aCC 6.00" \
|
||||
"hpux-11.23-ia64-acc-64b-6.00-*-*-log.gz.txt" \
|
||||
hpux-11.23-ia64-acc-6.00.html
|
||||
|
||||
process_results "HP-UX 11.23" "IPF" "HP aCC 5.57" \
|
||||
"hpux-11.23-ia64-acc-64b-5.57-*-*-log.gz.txt" \
|
||||
hpux-11.23-ia64-acc-5.57.html
|
||||
|
||||
process_results "HP-UX 11.23" "PA-RISC" "HP aCC 3.73" \
|
||||
"hpux-11.23-pa-acc-*-3.73-*-*-log.gz.txt" \
|
||||
hpux-11.23-pa-acc-3.73.html
|
||||
|
||||
process_results "HP-UX 11.23" "PA-RISC" "HP aCC 3.63" \
|
||||
"hpux-11.23-pa-acc-*-3.63-*-*-log.gz.txt" \
|
||||
hpux-11.23-pa-acc-3.63.html
|
||||
|
||||
process_results "HP-UX 11.11" "PA-RISC" "HP aCC 3.73" \
|
||||
"hpux-11.11-pa-acc-*-3.73-*-*-log.gz.txt" \
|
||||
hpux-11.11-pa-acc-3.73.html
|
||||
|
||||
process_results "HP-UX 11.11" "PA-RISC" "HP aCC 3.63" \
|
||||
"hpux-11.11-pa-acc-*-3.63-*-*-log.gz.txt" \
|
||||
hpux-11.11-pa-acc-3.63.html
|
||||
|
||||
# IRIX #################################################################
|
||||
process_results "IRIX 6.5.16" "MIPS" "SGI MIPSpro 7.41" \
|
||||
"irix-6.5.16-mips-mipspro-*-7.41-*-*-log.gz.txt" \
|
||||
irix-6.5.16-mips-mipspro-7.41.htm
|
||||
|
||||
# Red Hat Linux ########################################################
|
||||
process_results "Red Hat EL 5.0" "EM64T" "gcc 4.1.1" \
|
||||
"linux_redhat_el-5.0-em64t-gcc-*-4.1.1-*-*-log.gz.txt" \
|
||||
linux_redhat_el-5.0-em64t-gcc-4.1.1.html
|
||||
|
||||
process_results "Red Hat AS 4 Update 4" "AMD64" "gcc 3.4.4" \
|
||||
"linux_redhat_el-4.4-amd64-gcc-*-3.4.4-*-*-log.gz.txt" \
|
||||
linux_redhat_el-4.4-amd64-gcc-3.4.4.html
|
||||
|
||||
process_results "Red Hat AS 4 Update 2" "AMD64" "gcc 3.4.6" \
|
||||
"linux_redhat_el-4.4-amd64-gcc-*-3.4.6-*-*-log.gz.txt" \
|
||||
linux_redhat_el-4.4-amd64-gcc-3.4.6.html
|
||||
|
||||
process_results "Red Hat AS 4 Update 2" "IA64" "gcc 3.4.4" \
|
||||
"linux_redhat_el-4.2-ia64-gcc-*-3.4.4-*-*-log.gz.txt" \
|
||||
linux_redhat_el-4.2-ia64-gcc-3.4.4.html
|
||||
|
||||
process_results "Red Hat AS 3 Update 8" "EM64T" "gcc 3.2.3" \
|
||||
"linux_redhat_el-3.8-em64t-gcc-3.2.3-*-*-log.gz.txt \
|
||||
linux_redhat_el-3.8-em64t-gcc-64b-3.2.3-*-log.gz.txt" \
|
||||
linux_redhat_el-3.8-em64t-gcc-3.2.3.html
|
||||
|
||||
# Solaris ##############################################################
|
||||
process_results "Solaris 10" "SPARC" "gcc 4.1.1" \
|
||||
"solaris-10-sparc-gcc-*-4.1.1-*-*-log.gz.txt" \
|
||||
solaris-10-sparc-gcc-4.1.1.html
|
||||
|
||||
process_results "Solaris 10" "SPARC" "Sun C++ 5.9" \
|
||||
"solaris-10-sparc-sunpro-*-5.9-*-*-log.gz.txt" \
|
||||
solaris-10-sparc-sunpro-5.9.html
|
||||
|
||||
process_results "Solaris 10" "SPARC" "Sun C++ 5.8" \
|
||||
"solaris-10-sparc-sunpro-*-5.8-*-*-log.gz.txt" \
|
||||
solaris-10-sparc-sunpro-5.8.html
|
||||
|
||||
process_results "Solaris 10" "SPARC" "Sun C++ 5.7" \
|
||||
"solaris-10-sparc-sunpro-*-5.7-*-*-log.gz.txt" \
|
||||
solaris-10-sparc-sunpro-5.7.html
|
||||
|
||||
process_results "Solaris 9" "SPARC" "Sun C++ 5.6" \
|
||||
"solaris-9-sparc-sunpro-*-5.6-*-*-log.gz.txt" \
|
||||
solaris-9-sparc-sunpro-5.6.html
|
||||
|
||||
# process_results "Solaris 9" "SPARC" "Sun C++ 5.5" \
|
||||
# "solaris-9-sparc-sunpro-*-5.5-*-*-log.gz.txt" \
|
||||
# solaris-9-sparc-sunpro-5.5.html
|
||||
|
||||
process_results "Solaris 9" "SPARC" "EDG eccp 3.9" \
|
||||
"solaris-9-sparc-eccp-*-3.9-*-*-log.gz.txt" \
|
||||
solaris-9-sparc-eccp--3.9.html
|
||||
|
||||
# process_results "Solaris 8" "SPARC" "Sun C++ 5.5" \
|
||||
# "solaris-8-sparc-sunpro-*-5.5-*-*-log.gz.txt" \
|
||||
# solaris-8-sparc-sunpro-5.5.html
|
||||
|
||||
process_results "Solaris 8" "SPARC" "Sun C++ 5.3" \
|
||||
"solaris-8-sparc-sunpro-*-5.3-*-*-log.gz.txt" \
|
||||
solaris-8-sparc-sunpro-5.3.html
|
||||
|
||||
# SuSE Linux ###########################################################
|
||||
process_results "SuSE ES 10.0" "x86" "gcc 4.1.0" \
|
||||
"linux_suse-10.0-em64t-gcc-*-4.1.0-*-*-log.gz.txt" \
|
||||
linux_suse-10.0-em64t-gcc-4.1.0.html
|
||||
|
||||
process_results "SuSE ES 9.1" "AMD64" "gcc 3.3.3" \
|
||||
"linux_suse-9.1-amd64-gcc-3.3.3-43.28-*-*-log.gz.txt \
|
||||
linux_suse-9.1-amd64-gcc-64b-3.3.3-*-*-log.gz.txt" \
|
||||
linux_suse-9.1-amd64-gcc-3.3.3.html
|
||||
|
||||
# CygWin ###############################################################
|
||||
process_results "CygWin/Windows XP" "x86" "gcc 3.4.4" \
|
||||
"win_xp-2-x86-gcc-*-3.4.4-*-*-log.gz.txt" \
|
||||
win_xp-2-x86-gcc-3.4.4.html
|
||||
|
||||
cat<<EOF
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
981
extern/stdcxx/4.2.1/bin/xbuildgen
vendored
Normal file
981
extern/stdcxx/4.2.1/bin/xbuildgen
vendored
Normal file
@@ -0,0 +1,981 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Id: xbuildgen 589895 2007-10-29 22:37:40Z sebor $
|
||||
#
|
||||
########################################################################
|
||||
#
|
||||
# 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
|
||||
Reference in New Issue
Block a user