a39749ff68
Package build-info is referenced in man build scripts. It's relocation requires that the build scripts be modified to reflect the new location. from: stx/middleware/recipes-common/build-info/release-info.inc to: stx/stx-integ/utilities/build-info/release-info.inc Change-Id: I82a9c12cd1e5607c1c903fc942a3c2007aca4920 Story: 2002801 Task: 22687 Signed-off-by: Scott Little <scott.little@windriver.com>
341 lines
9.0 KiB
Bash
Executable File
341 lines
9.0 KiB
Bash
Executable File
#!/bin/env bash
|
|
|
|
#
|
|
# Build the tis-centos-image.img or tis-centos-image-rt.img file
|
|
#
|
|
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
|
|
# NOTE: TMP_DIR must end in '/'
|
|
# NOTE: /tmp/ is now tmpfs like. Can't be trusted across multiple mock commands
|
|
# TMP_DIR=/tmp/
|
|
TMP_DIR=/
|
|
|
|
# Use RPMs from the std build only, for now
|
|
export BUILD_TYPE=std
|
|
export MY_BUILD_DIR_TOP=$MY_BUILD_DIR
|
|
|
|
function init_vars {
|
|
# Output path (current dir unless MY_WORKSPACE defined)
|
|
OUTPUT_DIR="$PWD/export"
|
|
if [ ! -z "$MY_WORKSPACE" ] && [ -d "$MY_WORKSPACE" ] ; then
|
|
OUTPUT_DIR="$MY_WORKSPACE/export"
|
|
CGCS_REPO_DIR="$MY_WORKSPACE/rpmbuild/RPMS"
|
|
fi
|
|
|
|
if [ -n "$MY_GUEST_DIR" ]; then
|
|
GUEST_DIR=$MY_GUEST_DIR
|
|
else
|
|
GUEST_DIR=$MY_WORKSPACE/guest
|
|
fi
|
|
|
|
MOCK=/usr/bin/mock
|
|
if [ $VERBOSE -eq 0 ]; then
|
|
MOCK="$MOCK -q"
|
|
fi
|
|
|
|
# Path to guest configuration
|
|
GUEST_BUILD_DIR=$DIR/build_guest
|
|
GUEST_BUILD_CMD=$GUEST_BUILD_DIR/build-guest-image.py
|
|
if [ $VERBOSE -eq 1 ]; then
|
|
GUEST_BUILD_CMD="$GUEST_BUILD_CMD -x"
|
|
fi
|
|
|
|
if [ $BUILD_MODE == 'std' ]; then
|
|
OUTPUT_FILE=$OUTPUT_DIR/tis-centos-guest.img
|
|
elif [ $BUILD_MODE == 'rt' ]; then
|
|
OUTPUT_FILE=$OUTPUT_DIR/tis-centos-guest-rt.img
|
|
else
|
|
printf " Error -- unknown BUILD_MODE '$BUILD_MODE'\n";
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
function check_vars {
|
|
# Where to store data
|
|
printf "Finding cgcs-root\n"
|
|
printf " Checking \$MY_REPO (value \"$MY_REPO\")\n"
|
|
|
|
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO
|
|
printf " Found!\n"
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " No joy -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
|
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
|
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " Error -- could not locate cgcs-root repo.\n"
|
|
exit 1
|
|
fi
|
|
|
|
STX_DIR=$INTERNAL_REPO_ROOT/stx
|
|
|
|
if [ "x$MY_BUILD_CFG" == "x" ];then
|
|
printf " Error -- reqiure MY_BUILD_CFG to be defined.\n"
|
|
exit 1
|
|
fi
|
|
|
|
RELEASE_INFO=$STX_DIR/stx-integ/utilities/build-info/release-info.inc
|
|
export PLATFORM_RELEASE=$(source $RELEASE_INFO && echo $PLATFORM_RELEASE)
|
|
}
|
|
|
|
|
|
function create_rootfs {
|
|
printf "\nCreating guest file system\n"
|
|
|
|
mkdir -p $GUEST_DIR
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Could not create $GUEST_DIR\n";
|
|
exit 1
|
|
fi
|
|
|
|
# Place build-time environment variables in mock configuration
|
|
GUEST_ENV="${MY_BUILD_ENVIRONMENT}-guest"
|
|
GUEST_CFG=$GUEST_DIR/$MY_BUILD_ENVIRONMENT_FILE
|
|
|
|
MY_BUILD_ENVIRONMENT=$GUEST_ENV ${DIR}/modify-build-cfg $GUEST_CFG
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Could not update $GUEST_CFG\n";
|
|
exit 1
|
|
fi
|
|
|
|
# Setup mock directories for the guest
|
|
if [ -d /localdisk/loadbuild/mock ]; then
|
|
LNK=/localdisk/loadbuild/mock/$GUEST_ENV
|
|
if [ ! -L $LNK ]; then
|
|
ln -s $GUEST_DIR $LNK
|
|
fi
|
|
fi
|
|
|
|
if [ -d /localdisk/loadbuild/mock-cache ]; then
|
|
mkdir -p $GUEST_DIR/cache
|
|
LNK=/localdisk/loadbuild/mock-cache/$GUEST_ENV
|
|
if [ ! -L $LNK ]; then
|
|
ln -s $GUEST_DIR/cache $LNK
|
|
fi
|
|
fi
|
|
|
|
# Setup mock chroot environment
|
|
$MOCK -r $GUEST_CFG --clean && $MOCK -r $GUEST_CFG --init
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to setup guest mock chroot\n";
|
|
exit 1
|
|
fi
|
|
|
|
# Install the RPMs to the root filesystem
|
|
|
|
# Note that the "rt" build needs access to both local-std and local-rt repos
|
|
local EXTRA_REPOS=""
|
|
|
|
if [ $BUILD_MODE == 'std' ]; then
|
|
INC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-install-list.txt)
|
|
TIS_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/image.inc)
|
|
elif [ $BUILD_MODE == 'rt' ]; then
|
|
INC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-install-list-rt.txt)
|
|
TIS_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/image-rt.inc)
|
|
EXTRA_REPOS="--enablerepo local-rt"
|
|
else
|
|
printf " Error -- unknown BUILD_MODE '$BUILD_MODE'\n";
|
|
exit 1
|
|
fi
|
|
|
|
$MOCK -r $GUEST_CFG --install ${INC_RPM_LIST} ${TIS_RPM_LIST} ${EXTRA_REPOS}
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to install RPM packages\n";
|
|
exit 1
|
|
fi
|
|
|
|
# Remove RPMs that are not required in image (pruned package list)
|
|
# NOTE: these are automatically installed from the mock init not
|
|
# through dependencies.
|
|
EXC_RPM_LIST=$(grep -v '^#' ${GUEST_BUILD_DIR}/rpm-remove-list.txt)
|
|
|
|
$MOCK -r $GUEST_CFG --remove ${EXC_RPM_LIST}
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to remove RPM packages\n";
|
|
exit 1
|
|
fi
|
|
|
|
printf " Done\n"
|
|
}
|
|
|
|
|
|
function update_rootfs {
|
|
printf "\nCustomizing guest file system\n"
|
|
|
|
# Copy over skeleton configuration files
|
|
for GUEST_ROOTFS in $GUEST_BUILD_DIR/rootfs $GUEST_BUILD_DIR/rootfs-$BUILD_MODE;
|
|
do
|
|
for f in $(cd $GUEST_ROOTFS && find . -type f | cut -c3-);
|
|
do
|
|
echo "$MOCK -r $GUEST_CFG --copyin $GUEST_ROOTFS/$f $f"
|
|
$MOCK -r $GUEST_CFG --copyin $GUEST_ROOTFS/$f $f
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to copyin file $f\n";
|
|
exit 1
|
|
fi
|
|
done
|
|
done
|
|
|
|
# Run the root file system setup script inside the chroot
|
|
ROOTFS_SETUP=rootfs-setup.sh
|
|
$MOCK -r $GUEST_CFG --copyin $GUEST_BUILD_DIR/$ROOTFS_SETUP $TMP_DIR && \
|
|
if [ $BUILD_MODE == 'rt' ]; then
|
|
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP --rt"
|
|
elif [ $BUILD_MODE == 'std' ]; then
|
|
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP --std"
|
|
else
|
|
ROOTFS_SETUP_CMD="$TMP_DIR$ROOTFS_SETUP"
|
|
fi
|
|
$MOCK -r $GUEST_CFG --chroot "$ROOTFS_SETUP_CMD"
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to run guest $ROOTFS_SETUP\n";
|
|
exit 1
|
|
fi
|
|
$MOCK -r $GUEST_CFG --chroot "rm -f $TMP_DIR$ROOTFS_SETUP"
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to delete $ROOTFS_SETUP from guest\n";
|
|
exit 1
|
|
fi
|
|
|
|
printf " Done\n"
|
|
}
|
|
|
|
|
|
function build_image {
|
|
# Build the image
|
|
printf "\nBuilding guest image $OUTPUT_FILE\n"
|
|
|
|
mkdir -p $OUTPUT_DIR
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Could not create $OUTPUT_DIR\n";
|
|
exit 1
|
|
fi
|
|
|
|
# Build guest rootfs archive
|
|
ROOTFS_SPACE=$((500*1024*1024))
|
|
ROOTFS_TAR=rootfs.tar
|
|
ROOTFS_EXCLUDE=rootfs-exclude.txt
|
|
|
|
$MOCK -r $GUEST_CFG --copyin $GUEST_BUILD_DIR/$ROOTFS_EXCLUDE $TMP_DIR
|
|
$MOCK -r $GUEST_CFG --chroot -- tar -cf $TMP_DIR$ROOTFS_TAR -X $TMP_DIR$ROOTFS_EXCLUDE --numeric-owner /
|
|
$MOCK -r $GUEST_CFG --copyout $TMP_DIR$ROOTFS_TAR $GUEST_DIR
|
|
$MOCK -r $GUEST_CFG --chroot -- rm -f $TMP_DIR$ROOTFS_TAR
|
|
|
|
$GUEST_BUILD_CMD -i $GUEST_DIR/$ROOTFS_TAR -o $OUTPUT_FILE -s $ROOTFS_SPACE
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to build guest image\n";
|
|
exit 1
|
|
fi
|
|
|
|
printf " Done\n"
|
|
}
|
|
|
|
|
|
function clean_guest {
|
|
printf "\nCleaning the guest $GUEST_DIR\n"
|
|
|
|
if [ ! -e $GUEST_DIR ]; then
|
|
printf " Done...nothing to do\n";
|
|
exit 0
|
|
fi
|
|
|
|
# Place build-time environment variables in mock configuration
|
|
GUEST_ENV="${MY_BUILD_ENVIRONMENT}-guest"
|
|
GUEST_CFG=$GUEST_DIR/$MY_BUILD_ENVIRONMENT_FILE
|
|
|
|
if [ ! -e $GUEST_CFG ]; then
|
|
MY_BUILD_ENVIRONMENT=$GUEST_ENV ${DIR}/modify-build-cfg $GUEST_CFG
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Could not update $GUEST_CFG\n";
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
$MOCK -r $GUEST_CFG --clean
|
|
$MOCK -r $GUEST_CFG --scrub=cache
|
|
|
|
rm -rf $GUEST_DIR
|
|
if [ $? -ne 0 ]; then
|
|
printf " Error -- Failed to remove guest $GUEST_DIR\n";
|
|
exit 1
|
|
fi
|
|
|
|
printf " Done\n"
|
|
}
|
|
|
|
#############################################
|
|
# Main code
|
|
#############################################
|
|
|
|
usage () {
|
|
echo ""
|
|
echo "Usage: "
|
|
echo " build-guest [--rt | --std] [--verbose]"
|
|
echo " build-guest [--help]"
|
|
echo " build-guest [--clean]"
|
|
echo ""
|
|
}
|
|
|
|
# Default argument values
|
|
HELP=0
|
|
CLEAN=0
|
|
VERBOSE=0
|
|
BUILD_MODE='std'
|
|
|
|
# read the options
|
|
TEMP=`getopt -o h --long clean --long rt --long std --long verbose -n 'test.sh' -- "$@"`
|
|
eval set -- "$TEMP"
|
|
|
|
# extract options and their arguments into variables.
|
|
while true ; do
|
|
case "$1" in
|
|
-h|--help) HELP=1 ; shift ;;
|
|
--clean) CLEAN=1 ; shift ;;
|
|
--verbose) VERBOSE=1 ; shift ;;
|
|
--rt) BUILD_MODE='rt' ; shift ;;
|
|
--std) BUILD_MODE='std' ; shift ;;
|
|
--) shift ; break ;;
|
|
*) echo "Internal error!" ; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [ $HELP -eq 1 ]; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
(
|
|
printf "\n*****************************\n"
|
|
printf "Create Titanium Cloud/CentOS Guest Image\n"
|
|
printf "*****************************\n\n"
|
|
|
|
init_vars
|
|
check_vars
|
|
|
|
if [ $CLEAN -eq 1 ]; then
|
|
clean_guest
|
|
exit 0
|
|
fi
|
|
|
|
create_rootfs
|
|
update_rootfs
|
|
build_image
|
|
|
|
) 2>&1 | stdbuf -o0 awk '{ print strftime("%H:%M:%S"), $0; fflush(); }' ; exit ${PIPESTATUS[0]}
|