Skip to content
Snippets Groups Projects
cvs-build 3.76 KiB
Newer Older
#!/bin/sh
# *** Does this actually work with sh, or does it have to be bash? ***

# Purpose: Builds rpm binaries out of CVS
# Author : Manuel M. T. Chakravarty <chak@acm.org>
# Created: 26 April 2000
#
# This file is subject to the same free software license as GHC.

# Usage
# -----
#
# This script checks the given version of an fptools component out of CVS and
# builds a binary rpm package from it.  By default it builds the CVS head from
# anonymous CVS.  In the case of anonymous CVS, this script requires that `cvs 
# login' was already executed.
#
# The current version of this script handles ghc only, but in fact it is 
# planned to extend it to cover the other components in fptools.
#
# Options:
#
# -d REPOSITORY -- Value passed to CVS's -d option
# -r TAG	-- build the revision identified by the given CVS tag
# -D DATE	-- build the revision identified by the given CVS date
#
# (if there is more than one of the options -r and -D, the last one takes 
# effect)

# Requires: autoconf, cvs, GNU tar, gnuopt

# TODO
# ----
#
# * cover other fptools
# * it would be convenient to be able to specify an alternative .spec file 
#   (instead of using that in the repository)

# Default values
# --------------

# Use anonymous CVS by default
#
CVS_REPOSITORY=:pserver:anoncvs@glass.cse.ogi.edu:/cvs

# We build the CVS head by default (a date of `tomorrow' guarantees to catch
# the most recent check ins in the presence of clock skews - `now' wouldn't do
# that)
CVS_TAG="-D tomorrow"

# This is where we let rpm do the actual build
#
BUILD_DIR=/tmp/cvs-build-$$

# Works only for i386 for the moment...
# !!!IMPROVE THIS
ARCH=i386

START_DIR=`pwd`

# Command line option processing
#
GETOPT_OUTOUT=`getopt -o d:r:D: -n $0 -- "$@"`
if [ $? != 0 ]; then 
  echo "Terminating..." >&2
  exit 1
fi

eval set -- "$GETOPT_OUTPUT"
while [ $# -gt 0 ]; do
  case "$1" in
    -d) CVS_REPOSITORY=$2; shift 2;;
    -r) CVS_TAG="-r $2"; shift 2;;
    -D) CVS_TAG="-D $2"; shift 2;;
    --) shift; break;;
     *) echo "Internal error!" ; exit 1 ;;
  esac
done

if [ $# != 0 ]; then
  echo "Too many arguments..." >&2
  exit 1
fi

# Check the sources out of CVS
#
echo "*** Exporting sources from CVS... (will build in $BUILD_DIR)"
mkdir -p $BUILD_DIR || exit 1
cd $BUILD_DIR
cvs -d $CVS_REPOSITORY export $CVS_TAG fpconfig || exit 1
cvs -d $CVS_REPOSITORY export $CVS_TAG ghc    || exit 1
cvs -d $CVS_REPOSITORY export $CVS_TAG hslibs || exit 1

VERSION=`sed -e 's/.*\([0-9]\)\.\([0-9]*\).*/\1.\2/' ghc/VERSION`
echo "*** ...got ghc $VERSION"


# Configure the tree (will produce the .spec file)
#
echo "*** Configuring sources..."
autoconf
cd ghc; autoconf; cd ..
./configure || exit 1

# Populate the rpm build tree
#
echo "*** Setting up the rpm build tree..."
mkdir $BUILD_DIR/SPEC
mkdir $BUILD_DIR/SOURCES
mkdir $BUILD_DIR/BUILD
mkdir $BUILD_DIR/RPMS
mkdir $BUILD_DIR/RPMS/$ARCH
mkdir $BUILD_DIR/SRPMS

cp ghc/ghc.spec $BUILD_DIR/SPEC/ghc-${VERSION}.spec
cd $BUILD_DIR
tar -cz -f $BUILD_DIR/SOURCES/ghc-$VERSION-src.tar.gz fptools || exit 1
rm -rf $BUILD_DIR/fptools

# set up the configuration for rpm
#
# * !!! this is not really elegant - any better idea?
#
our_rcfile=$BUILD_DIR/rpmrc
our_macrofile=$BUILD_DIR/rpmmacros
cat >$our_rcfile <<END
macrofiles: /usr/lib/rpm/macros:/usr/lib/rpm/%{_target}/macros:/etc/rpm/macros:/etc/rpm/%{_target}/macros:~/.rpmmacros:$our_macrofile
END

cat >$our_macrofile <<END
%_topdir $BUILD_DIR
END

# Build packages with rpm
#
echo "*** Building packages..."
rcfiles=/usr/lib/rpm/rpmrc:$our_rcfile
rpm --rcfile "$rcfiles" -ba SPEC/ghc-${VERSION}.spec || exit 1
echo "*** ...made the packages"

# Cleaning up
#
echo "*** Cleaning up..."
cd $START_DIR
cp $BUILD_DIR/SOURCES/ghc-$VERSION-src.tar.gz .
cp $BUILD_DIR/RPMS/$ARCH/ghc* .
cp $BUILD_DIR/SRPMS/ghc* .
rm -rf $BUILD_DIR

echo "*** ...done."