Files
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

452 lines
10 KiB
Bash

#!/bin/ksh
#
# @(#)54 1.5 src/bldscripts/dbld, ade_build, bos412, GOLDA411a 9/13/94 16:24:07
#
# COMPONENT_NAME:
#
# FUNCTIONS:
#
# ORIGINS: 27
#
# IBM CONFIDENTIAL -- (IBM Confidential Restricted when
# combined with the aggregated modules for this product)
# SOURCE MATERIALS
#
# (C) COPYRIGHT International Business Machines Corp. 1993
# All Rights Reserved
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
#------------------------------------------------------------------------------
#
# Description:
#
# Builds each stage listed in input file.
#
# Inputs: file containing list of stages to build
#
# Outputs: build logs to BLD_LOG_DIR
# built portions of each stage
# database updates to $BLD_LOG_DIR/buildDB/$BLDCYCLE/
#
# History:
#
# 04/29/94 JDS Initial version.
#
#------------------------------------------------------------------------------
. `/usr/bin/dirname $0`/bldDBfunctions
SAVEPATH=$PATH
. `/usr/bin/dirname $0`/common.sh
PATH=$SAVEPATH
function logName
{
# INPUTS:
# LPP_TO_BUILD
#
# OUTPUTS:
#
# NAME_OF_LOG
#
# RETURN CODES:
# 0 = good return
#
# DESCRIPTION:
#
# Based on the LPP_TO_BUILD the next available
# build log file is returned (via a print command).
# The log files are assumed to be located in
# the $BLD_LOG_DIR directory.
#
LPP_TO_BUILD=$1
integer latest_log_count
latest_log_count=1
ls -rt "$BLD_LOG_DIR"/"$LPP_TO_BUILD".log.[0-9]* >/dev/null
if (( $? != 0 ))
then
latest_log_count=1
else
ls -rt "$BLD_LOG_DIR"/"$LPP_TO_BUILD".log.[0-9]* |
tail -1 |
read latest_log
latest_log_count=${latest_log##*\.}
((latest_log_count = $latest_log_count + 1))
fi
LOG_NAME=$BLD_LOG_DIR"/"$LPP_TO_BUILD".log."$latest_log_count
print $LOG_NAME
return 0
}
#------------------------------------------------------------------------------
#
function build_lpp
{
# INPUTS:
# LPP_TO_BUILD
# FORCE_FLAG
#
#
# OUTPUTS:
#
# none
#
# RETURN CODES:
# 0 = lpp is already built
# 1 = lpp is currently being built by someone
# 2 = lpp is broken
#
# DESCRIPTION:
#
# Based on the LPP_TO_BUILD the function
# 1) checks to see if the lpp has already built
# succesfully
# 2) if the lpp has not built successfully
# and the FORCE_FLAG is not equal to Y
# calls wait_on_prereqs to make sure
# the prereqs to the LPP_TO_BUILD have
# completed
# 3) determines the necessary parameters used
# to build the lpp
# 4) updates the database to indicate that the
# lpp is building
# 5) builds the lpp
# 6) checks the log to see if the lpp completed
# succesfully. If the build was successful the
# database is updated to reflect this.
#
LPP_TO_BUILD=$1
FORCE_FLAG=$2
#
# check to see if it is already built
#
maintainBuildStage -r -k $BLDCYCLE/$LPP_TO_BUILD -f COMPLETE |
read COMPLETE
case $COMPLETE in
Y) if [[ $FORCE_FLAG != 'Y' ]]
then return 0 # already built
fi
;;
W) return 1 # somebody is currently building
;;
esac
#
# If the FORCE_FLAG is set then don't bother waiting
# for prereqs
#
if [[ $FORCE_FLAG != 'Y' ]]
then
wait_on_prereqs $LPP_TO_BUILD
fi
showStage -k $LPP_TO_BUILD -f "RELEASE" |
tail +2 |
awk '{FS="|" ; print $1}' |
read RELEASE
showStage -k $LPP_TO_BUILD -f "SCRIPT" |
tail +2 |
awk '{FS="|" ; print $1}' |
read SCRIPT
showStage -k $LPP_TO_BUILD -f "MAKE_PASS" |
tail +2 |
awk '{FS="|" ; print $1}' |
read MAKE_PASS
showStage -k $LPP_TO_BUILD -f "STAGE_DIRS" |
tail +2 |
awk '{FS="|" ; print $1}' |
read STAGE_DIRS
showStage -k $LPP_TO_BUILD -f "LABEL" |
tail +2 |
awk '{FS="|" ; print $1}' |
read LABEL_TO_CONVERT
print $LABEL_TO_CONVERT | sed 's/ /_/g' | read LABEL
print "\n\nReady to build: " $LPP_TO_BUILD
#
# Update the database to show that the stage is being built
# on the current machine
#
#
# ADD GOOD LOCKING MECHANISM HERE!!!!
#
maintainBuildStage -k $BLDCYCLE/$LPP_TO_BUILD -v COMPLETE="W"
maintainBuildStage -k $BLDCYCLE/$LPP_TO_BUILD -v BUILD_MACHINE=$(hostname)
cd $BUILDBASE/$BLDCYCLE"/src"
#
# Get a log to print output to
#
log_name=$(logName "$LPP_TO_BUILD")
cmd="$SCRIPT $LABEL $MAKE_PASS $STAGE_DIRS"
print " Building $LPP_TO_BUILD (see $log_name)"
$cmd >$log_name 2>&1
if [[ $? -eq 0 ]] ; then
maintainBuildStage -k $BLDCYCLE/$LPP_TO_BUILD -v COMPLETE="Y"
return 0
else
maintainBuildStage -k $BLDCYCLE/$LPP_TO_BUILD -v COMPLETE="B"
return 2
fi
}
#------------------------------------------------------------------------------
#
function check_prereq_complete
{
# INPUTS:
# PREREQ_TO_CHECK
#
# RETURN CODES:
# 0 = prereq has succesfully built
# 1 = prereq did not succesfully build
#
# DESCRIPTION:
#
# The database is checked to see if the PREREQ_TO_CHECK
# has built succesfully.
#
PREREQ_TO_CHECK=$1
maintainBuildStage -r -k $BLDCYCLE/$PREREQ_TO_CHECK -f COMPLETE |
read PREREQ_COMPLETE
if [[ $PREREQ_COMPLETE != "Y" ]]
then
return 1
else
return 0
fi
}
#------------------------------------------------------------------------------
#
function wait_on_prereqs
{
# INPUTS:
# LPP_TO_BUILD
#
# RETURN CODES:
# 0 = all prereqs are satisfied
#
# DESCRIPTION:
#
# Based on the LPP_TO_BUILD the database is
# checked to determine all lpp's necessary to
# be built prior to building the LPP_TO_BUILD.
# If the prereq's to the LPP_TO_BUILD are have
# not completed the function sleeps for 60
# seconds and checks again.
#
LPP_TO_BUILD=$1
integer READY_TO_BUILD
integer PREREQS_CHECKED
PREREQS_CHECKED=1
FOO=0; PP=""
while (( PREREQS_CHECKED == 1))
do
READY_TO_BUILD=0
showStageReq -k $1 -f "STAGE_REQ" 2>/dev/null |
tail +2 |
while read PREREQ
do
if [[ "$PREREQ" != "$PP" ]] ; then
print "PREREQ to $LPP_TO_BUILD : " $PREREQ
PP=$PREREQ
FOO=0
fi
check_prereq_complete $PREREQ
if (( $? != 0 ))
then
READY_TO_BUILD=1
fi
done
PREREQS_CHECKED=READY_TO_BUILD
if ((READY_TO_BUILD == 1 ))
then
if [[ $FOO -eq 0 ]] ; then
echo "\nWaiting on prereqs for: $LPP_TO_BUILD \c"
FOO=1
fi
echo ".\c"
sleep 60
fi
done
echo ""
return 0
}
#===========================================================================
# Main Program
#===========================================================================
#
# INITIALIZATION
#
#
# create the database for the build ;
# it will be stored 'locally' with the
# logs
#
initDB
USAGE="USAGE: "$(basename $0)" [-b <break process>] [-c <completion process>] <file_containing_list_of_LPPs>"
if [[ $# < 1 ]] ; then
print $USAGE
exit 99
fi
#
# Get Options
#
# --- b specifies a 'break' process
# --- c specifies a 'completion' process
#
while getopts b:c: arguments
do case $arguments in
b) BREAK_PROCESS=$OPTARG ;;
c) COMPLETE_PROCESS=$OPTARG ;;
esac
done
#
# determine the number of arguments that are 'switched'
# shift that number 'out of the input'
#
((positions_occupied_by_switches = OPTIND - 1))
shift $positions_occupied_by_switches
#
# Identify input file
#
LPP_FILE=$1
#
#
# BUILDBASE and BLDCYCLE must exist!
#
# BUILDBASE is the top of the build tree
# (ex: /.../bai.cell.austin.ibm.com/fs/project/aix4/build/red )
#
if [[ -z "$BUILDBASE" ]] ; then
print "Variable BUILDBASE must be defined"
exit 1
fi
#
# BLDCYCLE is the build cycle (ex: 9405A)
#
if [[ -z "$BLDCYCLE" ]] ; then
print "Variable BLDCYCLE must be defined"
exit 1
fi
#
# TD_BLDCYCLE is the build cycle (ex: 9405A)
#
if [[ -z "$TD_BLDCYCLE" ]] ; then
export TD_BLDCYCLE=$BLDCYCLE
fi
#
# Build source must exist
#
if [[ ! -d "$BUILDBASE/$BLDCYCLE/src" ]] ; then
print "Build $BUILDBASE/$BLDCYCLE does not exist"
exit 1
fi
#
# Must be able to write to the log directory
#
if [[ ! -w $BLD_LOG_DIR ]]
then
print "Cannot write to $BLD_LOG_DIR"
exit 1
fi
#
#
#
if [[ -f $BUILDBASE/$BLDCYCLE/STATUS/using_backing_tree_links ]]
then
export USE_BACKING_TREE_LINKS=yes
fi
#
# The input file must exist
#
if [[ ! -f "$LPP_FILE" ]] ; then
print "The $LPP_FILE input file was not found"
exit 1
fi
#
#
# MAIN LOOP
#
#
# for each lpp in the input file
# try to build
#
grep -E '^[a-z]|^[A-Z]' $LPP_FILE |
while read LPP_TO_BUILD FORCE_FLAG
do
#
# if the database is being updated then rest
#
while [[ ! -f $BLD_LOG_DIR/buildDB/DB_UPDATE ]]
do
print "...waiting for database update to complete"
sleep 60
done
echo "[Attempting to build: ${LPP_TO_BUILD}]"
build_lpp $LPP_TO_BUILD $FORCE_FLAG
case $? in
0) echo " LPP ${LPP_TO_BUILD} is SUCCESSFULLY built!"
if [[ ! -z "$COMPLETE_PROCESS" ]] ; then
$COMPLETE_PROCESS "Build- $BLDCYCLE - $LPP_TO_BUILD IS COMPLETE"
fi
;;
1) echo " LPP ${LPP_TO_BUILD} is being built \c"
echo "on another machine"
;;
2) echo " LPP ${LPP_TO_BUILD} is BROKE..."
if [[ ! -z "$BREAK_PROCESS" ]] ; then
$BREAK_PROCESS "Build- $BLDCYCLE - $LPP_TO_BUILD IS BROKEN"
fi
;;
esac
done
exit 0