#!/bin/ksh # # build_world # ######################################################################## # set -x ########################################################################## # # Script setup: THIS NEEDS TO BE FIRST # SCRIPTS_DIR="`dirname $0`" if [ "" = "$SCRIPTS_DIR" ]; then SCRIPTS_DIR=/project/dt/scripts fi ########################################################################## ########################################################################## # # Script specific global variables # ########################################################################## ########################################################################## PROJECT_NAME="dt" BUILD_TYPE="" LOG_DIR="" MAIL_LIST="" PRE_BUILD="" POST_BUILD="" TOP="" PROG_NAME="$0" LOG_DATE="`date +%h.%d,%H:%M:%S`" TMP_LOG_DIR_BASE=/project/dt/logs/build #Need to define now for usage() VIEW_TAG="`uname -s`:no_view_specified" X_PROJECT=x11 MOTIF_PROJECT=motif CDE_PROJECT=cde CDEDOC_PROJECT=cdedoc CDETEST_PROJECT=cde-test BUILD=build DO_X_BUILD="False" DO_MOTIF_BUILD="False" DO_CDE_BUILD="False" DO_CDEDOC_BUILD="False" DO_REDIRECT_IO="True" DO_CDETEST_BUILD="False" DO_DEBUG="False" DO_NOT_BUILD="False" DO_COMPONENT_LOGS="True" DO_ERROR_FILES="True" DO_WARNING_FILES="True" ########################################################################## usage () { cat <] # script_name is a program that is run before the # build is run. [-post ] # script_name is a program that is run after the # build is run. [{-v | -view | -view_tag} ] # The ClearCase view should always be set before # this script is run. This option should only # be used on systems where ClearCase is not installed. # The view tag will be used when constructing the # log directory name. [{-ld | -log_dir} ] # Specify an alternate log directory. # Default: $TMP_LOG_DIR_BASE/// # is of the format '$LOG_DATE' [{-sd | -script_dir} ] # Specify an alternate directory for required files. # Default: $SCRIPTS_DIR/ [{-pn | -project_name} project_name] # Specifies the project name used in the log dir. # The default log dir is is /project/dt/... # Use this option (-pn x11) for X11 only builds to # get logs in /project/x11/... [-top ] # Use this to over-ride the default TOP directory # for a project. There is NO default. [{-mail | mail_list} ] [-h | -? | -help] # Print usage and exit eof } ########################################################################## while [ $# -gt 0 ]; do case $1 in -e | -dev) DO_X_BUILD="True" DO_MOTIF_BUILD="True" DO_CDE_BUILD="True" shift 1 ;; -x | -x11) DO_X_BUILD="True" shift 1 ;; -m | -motif) DO_MOTIF_BUILD="True" shift 1 ;; -c | -cde) DO_CDE_BUILD="True" shift 1 ;; -d | -cdedoc) DO_CDEDOC_BUILD="True" shift 1 ;; -t | -cdetest) DO_CDETEST_BUILD="True"; shift 1 ;; -a | -all) DO_X_BUILD="True" DO_MOTIF_BUILD="True" DO_CDE_BUILD="True" DO_CDEDOC_BUILD="True" DO_CDETEST_BUILD="True" shift 1 ;; -no_build) DO_NOT_BUILD="True"; shift 1 ;; -no_complogs) DO_COMPONENT_LOGS="False"; shift 1 ;; -no_errors) DO_ERROR_FILES="False"; shift 1 ;; -no_ioredirect) DO_REDIRECT_IO="False"; shift 1 ;; -no_warnings) DO_WARNING_FILES="False"; shift 1 ;; -rpt_summary) DO_NOT_BUILD="True" DO_COMPONENT_LOGS="False" DO_ERROR_FILES="False" DO_WARNING_FILES="False" shift 1;; -clean) BUILD_TYPE="clean"; shift 1 ;; -debug) DO_DEBUG="True" DO_REDIRECT_IO="False"; shift 1 ;; -ld | -log_dir) LOG_DIR=$2; shift 2 ;; -v | -view | -view_tag) VIEW_TAG=$2; shift 2 ;; -sd | -script_dir) SCRIPTS_DIR=$2; export SCRIPTS_DIR; shift 2 ;; -pre) PRE_BUILD=$2; shift 2 ;; -post) POST_BUILD=$2; shift 2 ;; -top) TOP=$2; shift 2 ;; -pn | -project_name) PROJECT_NAME=$2; shift 2 ;; -mail | -mail_list) MAIL_LIST=$2; shift 2 ;; -h | "-?" | -help | *) usage $PROG_NAME; exit 1; esac done ########################################################################## # # Script setup: Do this after the command line parsing to pick up # an alternate setting of SCRIPTS_DIR # if [ ! -f $SCRIPTS_DIR/script_setup.ksh ]; then print -u2 "$PRG: File '$SCRIPTS_DIR/script_setup.ksh' NOT found!" print -u2 "$PRG: Exiting ..." exit 1 fi . $SCRIPTS_DIR/script_setup.ksh do_check_file $BUILD_PROJECT -x "NOT found" do_check_file $EXTRACT_LOG -x "NOT found" do_check_file $EXTRACT_MSG -x "NOT found" do_check_file $CDE_COMPONENTS -f "NOT found" do_check_file $ERROR_MSGS -f "NOT found" do_check_file $WARNING_MSGS -f "NOT found" ########################################################################## # # Exit if $CLEAR_CASE_TOOL is installed and no view is set # if [ -x $CLEAR_CASE_TOOL ]; then $CLEAR_CASE_TOOL pwv | grep 'Set view' | grep NONE > /dev/null if [ $? -eq 0 ]; then print -u2 "Exiting ... No ClearCase view is set!" do_exit 1 fi VIEW_TAG="`$CLEAR_CASE_TOOL pwv -short`" else # # Some systems don't have $CLEAR_CASE_TOOL so we need to # work around it. Just output a warning for now. # print -u2 "$PROG_NAME: Warning: '$CLEAR_CASE_TOOL' is NOT installed." fi ########################################################################## # # If no project was selected, then build the 'dev' projects # if [ "False" = $DO_X_BUILD -a "False" = $DO_MOTIF_BUILD -a "False" = $DO_CDE_BUILD -a "FALSE" = $DO_CDEDOC_BUILD -a "False" = $DO_CDETEST_BUILD ]; then DO_X_BUILD="True" DO_MOTIF_BUILD="True" DO_CDE_BUILD="True" fi ########################################################################## # # If $INITIALIZE_VIEW is present, run it # if [ -x $INITIALIZE_VIEW -a "$X_PROJECT" != "$PROJECT_NAME" ]; then $INITIALIZE_VIEW > /dev/null 2>&1 fi ########################################################################## # # Set the log dir and log file for the project logs # # Put all undirected stdout and stderr in a separate log file # if [ "" = "$LOG_DIR" ]; then LOG_DIR=$LOG_DIR_BASE/$VIEW_TAG/$LOG_DATE if [ -L $LOG_DIR_BASE/$VIEW_TAG/LATEST ]; then rm $LOG_DIR_BASE/$VIEW_TAG/LATEST fi ln -s ./$LOG_DATE $LOG_DIR_BASE/$VIEW_TAG/LATEST fi SUMM_FILE=$LOG_DIR/build.summary if [ ! -d $LOG_DIR ]; then mkdir -p $LOG_DIR chmod 775 $LOG_DIR fi if [ "True" = "$DO_REDIRECT_IO" ]; then BUILD_LOG=$LOG_DIR/$BUILD.log BUILD_LOG_REDIRECT="-e $BUILD_LOG" rm -f $BUILD_LOG && touch $BUILD_LOG exec >> $BUILD_LOG exec 2>> $BUILD_LOG else BUILD_LOG_REDIRECT="" fi ########################################################################## # # Build a project # do_build () { # # $1 = the project name # $2 = [optional] command line options for $BUILD_PROJECT # $3 = [optional] value for command line option $2 # print -u1 "building in $1..." DATE=`date +"$BTAG_DFMT"` if [ "True" = $DO_NOT_BUILD ]; then print -u1 "$BTAG_STRT $1: $DATE" >> $SUMM_FILE print -u1 "$BTAG_PRJT = $1" >> $SUMM_FILE print -u1 "$BTAG_ENDD $1: $DATE" >> $SUMM_FILE return fi # # if building cde tests, write to cde-test-summary.log and # not cde-test.log since cde-test.log will be created by the # test-build program. # if [ "$CDETEST_PROJECT" = "$1" ]; then LOG_FILE=$LOG_DIR/$1-summary.log else LOG_FILE=$LOG_DIR/$1.log fi print -u1 "$BTAG_STRT $1: $DATE" >> $SUMM_FILE print -u1 "$BTAG_PRJT = $1" >> $SUMM_FILE print -u1 "$BTAG_LOGF = $LOG_FILE" >> $SUMM_FILE print -u1 "$BTAG_STRT $1: $DATE" > $LOG_FILE print -u1 "$BTAG_PRJT = $1" >> $LOG_FILE print -u1 "$BTAG_LOGF = $LOG_FILE" >> $LOG_FILE print -u1 "$BTAG_SYST = `uname -a`" >> $LOG_FILE print -u1 "$BTAG_VIEW = $VIEW_TAG" >> $LOG_FILE if [ "" = "$BUILD_TYPE" ]; then print -u1 "$BTAG_TYPE = incrmt" >> $LOG_FILE else print -u1 "$BTAG_TYPE = $BUILD_TYPE" >> $LOG_FILE fi if [ -x $CLEAR_CASE_TOOL ]; then $CLEAR_CASE_TOOL catcs >> $LOG_FILE fi if [ "" != "$PRE_BUILD" -a -x "$PRE_BUILD" ]; then print -u1 "Running pre-build script '$PRE_BUILD'." >> $LOG_FILE $PRE_BUILD >> $LOG_FILE 2>&1 if [ $? -ne 0 ]; then print -u2 "\nThe pre_build script '$PRE_BUILD' failed." print -u2 "Aborting the build!\n" do_exit 1 fi fi if [ "" = "$2" ]; then if [ "" = "$BUILD_TYPE" ]; then if [ "" = "$TOP" ]; then $BUILD_PROJECT -p $1 >> $LOG_FILE 2>&1 else $BUILD_PROJECT -top "$TOP" -p $1 >> $LOG_FILE 2>&1 fi else if [ "" = "$TOP" ]; then $BUILD_PROJECT -p $1 -"$BUILD_TYPE" >> $LOG_FILE 2>&1 else $BUILD_PROJECT -top "$TOP" -p $1 -"$BUILD_TYPE" >> $LOG_FILE 2>&1 fi fi else if [ "" = "$BUILD_TYPE" ]; then if [ "" = "$TOP" ]; then $BUILD_PROJECT -p $1 "$2" "$3" >> $LOG_FILE 2>&1 else $BUILD_PROJECT -top "$TOP" -p $1 "$2" "$3" >> $LOG_FILE 2>&1 fi else if [ "" = "$TOP" ]; then $BUILD_PROJECT -p $1 -"$BUILD_TYPE" "$2" "$3" >> $LOG_FILE 2>&1 else $BUILD_PROJECT -top "$TOP" -p $1 -"$BUILD_TYPE" "$2" "$3" >> $LOG_FILE 2>&1 fi fi fi if [ "" != "$POST_BUILD" -a -x "$POST_BUILD" ]; then print -u1 "Running post-build script '$POST_BUILD'." >> $LOG_FILE $POST_BUILD >> $LOG_FILE 2>&1 fi DATE=`date +"$BTAG_DFMT"` print -u1 "$BTAG_ENDD $1: $DATE" >> $LOG_FILE print -u1 "$BTAG_ENDD $1: $DATE\n" >> $SUMM_FILE } ########################################################################## # # do_summary - # do_summary () { # # $1 = the project name # $2 = the log file # PROJECT=$1 LOG_FILE=$2$3 ERR_FILE=$2$4 WRN_FILE=$2$5 print -u1 extracting errors and warnings in $PROJECT... ERR=`$EXTRACT_MSG \ -m $ERROR_MSGS \ -i $WARNING_MSGS -i $IGNORE_MSGS \ -l $LOG_FILE $BUILD_LOG_REDIRECT | wc -l` WARN=`$EXTRACT_MSG \ -m $WARNING_MSGS \ -l $LOG_FILE $BUILD_LOG_REDIRECT | wc -l` if [ "True" = $DO_ERROR_FILES ]; then $EXTRACT_MSG \ -m $ERROR_MSGS -m $BUILD_MSGS \ -i $WARNING_MSGS -i $IGNORE_MSGS \ -l $LOG_FILE $BUILD_LOG_REDIRECT | \ $COMPRESS_MSG \ -m $BUILD_MSGS $BUILD_LOG_REDIRECT > $ERR_FILE fi if [ "True" = $DO_WARNING_FILES ]; then $EXTRACT_MSG \ -m $WARNING_MSGS -m $BUILD_MSGS \ -l $LOG_FILE $BUILD_LOG_REDIRECT | \ $COMPRESS_MSG \ -m $BUILD_MSGS $BUILD_LOG_REDIRECT > $WRN_FILE fi AWK_PROJECT='{printf("%-32s %5s errors %5s warnings",$1,$2,$3)}' echo $PROJECT $ERR $WARN | awk "$AWK_PROJECT" >> $SUMM_FILE print -u1 >> $SUMM_FILE if [ "True" = "$DO_DEBUG" ]; then echo $PROJECT $ERR $WARN | awk "$AWK_PROJECT" print -u1 fi } ########################################################################## # # do_component_summary # do_component_summary () { # # $1 = the project name # $2 = the project log file # $3 = the components file # PROJECT=$1 PROJECT_LOG_FILE=$2 COMPONENTS_FILE=$3 COMPONENTS_LOG_DIR=$LOG_DIR/$PROJECT typeset -i TTL_ERR typeset -i TTL_WARN AWK_COMPONENT='{printf(" %-32s %5s errors %5s warnings",$1,$2,$3)}' # # Separate the log file for the project into log files for the # individual components. Put them into a subdirectory since # there may be alot of them. # if [ "$DO_COMPONENT_LOGS" = "True" ]; then if [ ! -d $COMPONENTS_LOG_DIR ]; then mkdir -p $COMPONENTS_LOG_DIR chmod 775 $COMPONENTS_LOG_DIR fi $EXTRACT_LOG \ -l $PROJECT_LOG_FILE \ -c $COMPONENTS_FILE \ -ld $COMPONENTS_LOG_DIR $BUILD_LOG_REDIRECT fi let TTL_ERR=0 let TTL_WARN=0 for COMPONENT in `cat $COMPONENTS_FILE` do print -u1 extracting errors and warnings in $PROJECT/$COMPONENT... COMPONENT_FILE_BASE=`echo $COMPONENT | tr "/" ","` COMPONENT_LOG_FILE=$COMPONENTS_LOG_DIR/$COMPONENT_FILE_BASE.log if [ ! -f $COMPONENT_LOG_FILE ]; then print -u2 $PROG_NAME: Error, $COMPONENT_LOG_FILE not found. continue fi ERR=`$EXTRACT_MSG \ -m $ERROR_MSGS \ -i $WARNING_MSGS -i $IGNORE_MSGS \ -l $COMPONENT_LOG_FILE $BUILD_LOG_REDIRECT | wc -l` WARN=`$EXTRACT_MSG \ -m $WARNING_MSGS \ -l $COMPONENT_LOG_FILE $BUILD_LOG_REDIRECT | wc -l` let TTL_ERR=TTL_ERR+ERR let TTL_WARN=TTL_WARN+WARN if [ $ERR -ne 0 -o $WARN -ne 0 ]; then echo $PROJECT/$COMPONENT $ERR $WARN | \ awk "$AWK_COMPONENT" >> $SUMM_FILE print -u1 >> $SUMM_FILE if [ "True" = $DO_ERROR_FILES -a $ERR -gt 0 ]; then COMPONENT_ERR_FILE=$COMPONENTS_LOG_DIR/$COMPONENT_FILE_BASE.err $EXTRACT_MSG \ -m $ERROR_MSGS -m $BUILD_MSGS \ -i $WARNING_MSGS -i $IGNORE_MSGS \ -l $COMPONENT_LOG_FILE $BUILD_LOG_REDIRECT | \ $COMPRESS_MSG \ -m $BUILD_MSGS $BUILD_LOG_REDIRECT > $COMPONENT_ERR_FILE fi if [ "True" = $DO_WARNING_FILES -a $WARN -gt 0 ]; then COMPONENT_WRN_FILE=$COMPONENTS_LOG_DIR/$COMPONENT_FILE_BASE.wrn $EXTRACT_MSG \ -m $WARNING_MSGS -m $BUILD_MSGS \ -l $COMPONENT_LOG_FILE $BUILD_LOG_REDIRECT | \ $COMPRESS_MSG \ -m $BUILD_MSGS $BUILD_LOG_REDIRECT > $COMPONENT_WRN_FILE fi if [ "True" = "$DO_DEBUG" ]; then echo $PROJECT/$COMPONENT $ERR $WARN | awk "$AWK_COMPONENT" print -u1 echo TOTAL $TTL_ERR $TTL_WARN | awk "$AWK_COMPONENT" print -u1 fi fi done echo $PROJECT-TOTAL $TTL_ERR $TTL_WARN | awk "$AWK_COMPONENT" >> $SUMM_FILE print -u1 >> $SUMM_FILE } ########################################################################## # # Print header stuff needed for build_summary # DATE=`date +"$BTAG_DFMT"` print -u1 "###################################################" >> $SUMM_FILE print -u1 "$BTAG_DATE = $DATE" >> $SUMM_FILE print -u1 "$BTAG_VIEW = $VIEW_TAG" >> $SUMM_FILE if [ -x $CLEAR_CASE_TOOL ]; then TMP_FILE_NAME=`$CLEAR_CASE_TOOL catcs | head -1 | awk '{printf "%s\n", $3}'` if [ -f "$TMP_FILE_NAME" ]; then print -u1 "$BTAG_CFGS = `$CLEAR_CASE_TOOL catcs | head -1 | awk '{printf "%s\n", $3}'`" >> $SUMM_FILE else print -u1 "$BTAG_CFGS = NoSpecFile" >> $SUMM_FILE fi else print -u1 "$BTAG_CFGS = NoClrCase" >> $SUMM_FILE fi print -u1 "$BTAG_PTFM = `uname -s`" >> $SUMM_FILE print -u1 "$BTAG_LOGD = $LOG_DIR" >> $SUMM_FILE if [ "" = "$BUILD_TYPE" ]; then print -u1 "$BTAG_TYPE = incrmt" >> $SUMM_FILE else print -u1 "$BTAG_TYPE = $BUILD_TYPE" >> $SUMM_FILE fi print -u1 "###################################################\n" >> $SUMM_FILE ########################################################################## # # Do the builds and Summarize the results # if [ "True" = $DO_X_BUILD ]; then print -u1 "#############################################" >> $SUMM_FILE do_build $X_PROJECT "" "" do_summary $X_PROJECT $LOG_DIR/$X_PROJECT .log .err .wrn do_component_summary \ $X_PROJECT \ $LOG_DIR/$X_PROJECT.log \ $X_COMPONENTS print -u1 "#############################################\n" >> $SUMM_FILE fi if [ "True" = $DO_MOTIF_BUILD ]; then print -u1 "#############################################" >> $SUMM_FILE do_build $MOTIF_PROJECT "" "" do_summary $MOTIF_PROJECT $LOG_DIR/$MOTIF_PROJECT .log .err .wrn do_component_summary \ $MOTIF_PROJECT \ $LOG_DIR/$MOTIF_PROJECT.log \ $MOTIF_COMPONENTS print -u1 "#############################################\n" >> $SUMM_FILE fi if [ "True" = $DO_CDE_BUILD ]; then print -u1 "#############################################" >> $SUMM_FILE do_build $CDE_PROJECT "" "" do_summary $CDE_PROJECT $LOG_DIR/$CDE_PROJECT .log .err .wrn do_component_summary \ $CDE_PROJECT \ $LOG_DIR/$CDE_PROJECT.log \ $CDE_COMPONENTS print -u1 "#############################################\n" >> $SUMM_FILE fi if [ "True" = $DO_CDEDOC_BUILD ]; then print -u1 "#############################################" >> $SUMM_FILE do_build $CDEDOC_PROJECT "" "" do_summary $CDEDOC_PROJECT $LOG_DIR/$CDEDOC_PROJECT .log .err .wrn do_component_summary \ $CDEDOC_PROJECT \ $LOG_DIR/$CDEDOC_PROJECT.log \ $CDEDOC_COMPONENTS print -u1 "#############################################\n" >> $SUMM_FILE fi if [ "True" = "$DO_CDETEST_BUILD" ]; then print -u1 "#############################################" >> $SUMM_FILE do_build $CDETEST_PROJECT "-log_dir" "$LOG_DIR" if [ -f $LOG_DIR/$CDETEST_PROJECT/allmake.* ]; then ln -s $LOG_DIR/$CDETEST_PROJECT/allmake.* $LOG_DIR/$CDETEST_PROJECT.log fi do_summary $CDETEST_PROJECT $LOG_DIR/$CDETEST_PROJECT .log .err .wrn do_component_summary \ $CDETEST_PROJECT \ $LOG_DIR/$CDETEST_PROJECT.log \ $CDETEST_COMPONENTS print -u1 "#############################################\n" >> $SUMM_FILE fi #print -u1 "###################################################\n" >> $SUMM_FILE #do_summary $BUILD $LOG_DIR/$BUILD.log #print -u1 "###################################################\n" >> $SUMM_FILE ########################################################################## # # Complete the build summary with the config spec and the $BTAG_CMPL # print -u1 "###################################################\n" >> $SUMM_FILE if [ -x $CLEAR_CASE_TOOL ]; then $CLEAR_CASE_TOOL catcs >> $SUMM_FILE fi print -u1 "###################################################\n" >> $SUMM_FILE DATE=`date +"$BTAG_DFMT"` print -u1 "###################################################\n" >> $SUMM_FILE print -u1 "$BTAG_CMPL: $DATE\n" >> $SUMM_FILE print -u1 "###################################################\n" >> $SUMM_FILE ########################################################################## # # Complete the build summary and mail it or dump it to stdout # if [ "" != "$MAIL_LIST" ]; then mailx -s "$SUBJECT_BUILD_COMPLETE - $VIEW_TAG (`date $SUBJECT_DATE`)" "$MAIL_LIST" < $SUMM_FILE else cat $SUMM_FILE fi # # Clean up temporary files and exit # do_exit 0