2011-03-02 15:48:57 +00:00
|
|
|
#!/bin/bash
|
|
|
|
#
|
|
|
|
# buildinstall
|
|
|
|
#
|
|
|
|
# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
|
|
|
die() {
|
|
|
|
[ -n "$TREEDIR" ] && rm -rf $TREEDIR
|
|
|
|
[ -n "$BUILDINSTDIR" ] && rm -rf $BUILDINSTDIR
|
|
|
|
[ -n "$yumconf" ] && rm -rf $yumconf
|
|
|
|
echo "Aborting buildinstall"
|
|
|
|
echo "$@"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
echo "Usage: buildinstall --version <version> --brand <brand> --product <product> --release <comment> [--output outputdir] [--discs <discstring>] <root>" >&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
CWD="$(pwd)"
|
|
|
|
PRODUCTPATH="anaconda"
|
|
|
|
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case $1 in
|
|
|
|
# general options affecting how we build things
|
|
|
|
--nogr)
|
|
|
|
NOGRSTR="--nogr"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--debug)
|
|
|
|
DEBUGSTR="--debug"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--localscripts)
|
|
|
|
LOCALSCRIPTS="yes"
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
|
|
|
|
# release information
|
|
|
|
--version)
|
|
|
|
VERSION=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--release)
|
|
|
|
RELEASESTR=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--product)
|
|
|
|
PRODUCTSTR=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--brand)
|
|
|
|
BRANDSTR=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--variant)
|
|
|
|
VARIANT=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--bugurl)
|
|
|
|
BUGURL=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--output)
|
|
|
|
OUTPUT=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--updates)
|
|
|
|
UPDATES=$2
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
--mirrorlist)
|
|
|
|
MIRRORLIST="$MIRRORLIST $2"
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
|
|
|
|
--yumconf)
|
|
|
|
yumconf="$2"
|
|
|
|
shift; shift
|
|
|
|
;;
|
|
|
|
|
|
|
|
*)
|
|
|
|
if [ -z "$REPO" ]; then
|
|
|
|
REPO=$1
|
|
|
|
else
|
|
|
|
EXTRA_REPOS="$EXTRA_REPOS $1"
|
|
|
|
fi
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ -z "$PRODUCTSTR" ]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$VERSION" ]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$REPO" ]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$RELEASESTR" ]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$BUGURL" ]; then
|
|
|
|
BUGURL="your distribution provided bug reporting tool."
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ "$REPO" =~ ^/ ]]; then
|
|
|
|
[ -n "$OUTPUT" ] || OUTPUT=$REPO
|
|
|
|
REPO="file://$REPO"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$OUTPUT" ]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ ! -d "$OUTPUT" ]; then
|
|
|
|
mkdir -p $OUTPUT
|
|
|
|
fi
|
|
|
|
|
|
|
|
# The first -release and -logos package we are going to look for is the lowercase
|
|
|
|
if [ -z "$BRANDSTR" ]; then
|
|
|
|
BRANDSTR="`echo $PRODUCTSTR | tr '[:upper:]' '[:lower:]'`"
|
|
|
|
fi
|
|
|
|
export brandpkgname="$BRANDSTR"
|
|
|
|
|
|
|
|
BUILDINSTDIR=$(mktemp -d ${TMPDIR:-/tmp}/buildinstall.tree.XXXXXX)
|
|
|
|
TREEDIR=$(mktemp -d ${TMPDIR:-/tmp}/treedir.XXXXXX)
|
|
|
|
CACHEDIR=$(mktemp -d ${TMPDIR:-/tmp}/yumcache.XXXXXX)
|
|
|
|
|
|
|
|
if [ -z "$yumconf" ]; then
|
|
|
|
yumconf=$(mktemp ${TMPDIR:-/tmp}/yum.conf.XXXXXX)
|
|
|
|
cat > $yumconf <<EOF
|
|
|
|
[main]
|
|
|
|
cachedir=$CACHEDIR
|
|
|
|
keepcache=0
|
|
|
|
gpgcheck=0
|
|
|
|
plugins=0
|
|
|
|
reposdir=
|
|
|
|
tsflags=nodocs
|
|
|
|
|
|
|
|
[anacondarepo]
|
|
|
|
name=anaconda repo
|
|
|
|
baseurl=$REPO
|
|
|
|
enabled=1
|
|
|
|
EOF
|
|
|
|
|
|
|
|
n=1
|
|
|
|
for r in $EXTRA_REPOS; do
|
|
|
|
if [[ $r =~ ^/ ]]; then
|
|
|
|
r="file://$r"
|
|
|
|
fi
|
|
|
|
cat >> $yumconf <<EOF
|
|
|
|
|
|
|
|
[anaconda-extrarepo-$n]
|
|
|
|
name=anaconda extra repo $n
|
|
|
|
baseurl=$r
|
|
|
|
enabled=1
|
|
|
|
EOF
|
|
|
|
let n++
|
|
|
|
done
|
|
|
|
|
|
|
|
n=1
|
|
|
|
for l in $MIRRORLIST; do
|
|
|
|
cat >> $yumconf <<EOF
|
|
|
|
|
|
|
|
[anaconda-mirrorlistrepo-$n]
|
|
|
|
name=anaconda mirrorlist repo $n
|
|
|
|
mirrorlist=$l
|
|
|
|
enabled=1
|
|
|
|
EOF
|
|
|
|
let n++
|
|
|
|
done
|
|
|
|
else
|
|
|
|
newyumconf=$(mktemp ${TMPDIR:-/tmp}/yum.conf.XXXXXX)
|
|
|
|
cp $yumconf $newyumconf
|
|
|
|
yumconf=$newyumconf
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Running buildinstall..."
|
|
|
|
|
|
|
|
if [ "$LOCALSCRIPTS" = "yes" ]; then
|
|
|
|
UPD_INSTROOT="$CWD/upd-instroot"
|
|
|
|
MK_IMAGES="$CWD/mk-images"
|
|
|
|
MK_TREEINFO="$CWD/maketreeinfo.py"
|
|
|
|
MK_STAMP="$CWD/makestamp.py"
|
|
|
|
BUILDINSTALL="$CWD/buildinstall"
|
|
|
|
else
|
|
|
|
pushd $BUILDINSTDIR
|
|
|
|
BUILDARCH=`repoquery -c $yumconf --qf "%{ARCH}\n" anaconda`
|
|
|
|
# lets use rpmutils to make sure we have the canonical basearch
|
|
|
|
# BUILDARCH != BASEARCH (e.g. i586 != i386, sparcv9 != sparc)
|
|
|
|
BASEARCH=`python -c "import rpmUtils.arch; \
|
|
|
|
print rpmUtils.arch.getBaseArch(myarch=rpmUtils.arch.getCanonArch(skipRpmPlatform = True));"`
|
|
|
|
yumdownloader -c $yumconf anaconda || exit 1
|
2011-06-23 10:20:14 +00:00
|
|
|
rpm --checksig anaconda*rpm | grep -v pgp && exit 1
|
2011-03-02 15:48:57 +00:00
|
|
|
rpm2cpio anaconda*rpm | cpio --quiet -iumd './usr*'
|
|
|
|
rm -f anaconda*rpm
|
|
|
|
popd
|
|
|
|
|
|
|
|
UPD_INSTROOT=./upd-instroot
|
|
|
|
MK_IMAGES=./mk-images
|
|
|
|
MK_TREEINFO=./maketreeinfo.py
|
|
|
|
MK_STAMP=./makestamp.py
|
|
|
|
BUILDINSTALL=./buildinstall
|
|
|
|
|
|
|
|
for f in $UPD_INSTROOT $MK_IMAGES $MK_STAMP $MK_TREEINFO $BUILDINSTALL; do
|
|
|
|
if [ -n "$UPDATES" -a -f $UPDATES/usr/lib/anaconda-runtime/$f ]; then
|
|
|
|
cp -a $UPDATES/usr/lib/anaconda-runtime/$f* $BUILDINSTDIR/
|
|
|
|
elif [ ! -f $f ]; then
|
|
|
|
cp -a $BUILDINSTDIR/usr/lib/anaconda-runtime/$f* $BUILDINSTDIR/
|
|
|
|
else
|
|
|
|
cp -a $f* $BUILDINSTDIR/
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
UPD_INSTROOT=$BUILDINSTDIR/upd-instroot
|
|
|
|
MK_IMAGES=$BUILDINSTDIR/mk-images
|
|
|
|
MK_TREEINFO=$BUILDINSTDIR/maketreeinfo.py
|
|
|
|
MK_STAMP=$BUILDINSTDIR/makestamp.py
|
|
|
|
BUILDINSTALL=$BUILDINSTDIR/buildinstall
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$UPDATES" ]; then UPDATES="--updates $UPDATES"; fi
|
|
|
|
|
|
|
|
echo "Building images..."
|
|
|
|
$UPD_INSTROOT $DEBUGSTR $NOGRSTR --arch $BUILDARCH $UPDATES --imgdir $TREEDIR/install $yumconf || die "upd-instroot failed"
|
|
|
|
|
|
|
|
echo "Writing .treeinfo file..."
|
|
|
|
# NOTE --arch must match MK_IMAGES or the resulting treeinfo will be invalid
|
|
|
|
$MK_TREEINFO --family="$PRODUCTSTR" ${VARIANT:+--variant="$VARIANT"} --version=$VERSION --arch=$BASEARCH --outfile=$OUTPUT/.treeinfo
|
|
|
|
|
|
|
|
# FIXME: need to update mk-images to take the yumconf
|
|
|
|
echo "Making images: $PWD"
|
|
|
|
$MK_IMAGES $DEBUGSTR $NOGRSTR --imgdir $TREEDIR/install --arch $BASEARCH --product "$PRODUCTSTR" --version $VERSION --bugurl "$BUGURL" --output $OUTPUT $yumconf || die "image creation failed"
|
|
|
|
|
|
|
|
echo "Writing .discinfo file"
|
|
|
|
$MK_STAMP --releasestr="$RELEASESTR" --arch=$BASEARCH --discNum="ALL" --outfile=$OUTPUT/.discinfo
|
|
|
|
|
|
|
|
rm -rf $TREEDIR $BUILDINSTDIR
|
|
|
|
rm -f $yumconf
|