#!/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 rpm_verify anaconda*rpm || exit 1 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