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)
# 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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."