smlinux/gsb/buildgsb

547 lines
16 KiB
Bash

#!/bin/bash
# Version: 1.9.3 GNOME SlackBuild Build Script
# Copyright (c) 2007, 2008, 2009
# Darren 'Tadgy' Austin <darren (at) gnomeslackbuild.org>, Coventry, UK.
# Steve Kennedy <steve (at) gnomeslackbuild.org>
# Chip Cuccio <chipster (at) gnomeslackbuild.org>, Byron, MN USA
# All rights reserved.
#
# Licenced under the terms of the GNU General Public Licence version 3.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.
# GNOME SlackBuild Version
GSB_VERSION=2_32
#========================================================================
# FUNCTIONS
. ${BASH_SOURCE%/*}/functions.sh || {
echo "Can't find functions.sh."
exit 1;
}
# Trap keyboard interrupt
trap error_out SIGINT
#========================================================================
# ENVIRONMENT
# If the user created an options file, read it.
[ -r ./gsb.options ] && {
. ./gsb.options
export OPTIONSREAD=1
}
# Basic settings
TMP=${TMP:-/tmp}
ARCH=${ARCH:-"$(arch)"}
GSB_ARCH=${GSB_ARCH:-""}
if [ "$ARCH" = "x86_64" ]; then
GSB_ARCH=64
fi
GSBDIR=${GSBDIR:-gsb${GSB_ARCH}}
TAG=${TAG:-gsb}
PKGDEST=${PKGDEST:-$TMP/gsb${GSB_ARCH}-tree}
LOGSDIR=${LOGSDIR:-$TMP/gsb${GSB_ARCH}-buildlogs}
# Location of our build source
BUILDSOURCE=${BUILDSOURCE:-"${BASH_SOURCE%/*}/../src"}
# GPG-KEY
GPGKEY=${GPGKEY:-"${BUILDSOURCE}/../GPG-KEY"}
[ ! -f ${GPGKEY} ] && {
echo ; header "WARNING: Can't find GPG-KEY for verification."
exit 1;
}
# We will mimic Slackware's tree
SOURCEDIR=${SOURCEDIR:-source}
CHANGELOG=${CHANGELOG:-$LOGSDIR/ChangeLog.txt}
TESTINGDIR=${TESTINGDIR:-testing}
EXTRADIR=${EXTRADIR:-extra}
PASTUREDIR=${PASTUREDIR:-pasture}
PATCHESDIR=${PATCHESDIR:-patches}
# Option defaults.
WITH_TEST_PACKAGES=0
AUTO_DOWNLOAD=0
ONLY_DOWNLOAD=0
CONFIRM_INSTALLS=0
NOPATCHESDIR=0
NOSKIP=0
SKIP_REBUILDS=0
NOPRUNE=0
PUBLISH=0
# Download settings
DOWNLOAD_ATTEMPTS=${DOWNLOAD_ATTEMPTS:-3}
WGET_OPTIONS="-4"
#========================================================================
# COMMAND LINE PARSING
#
while [ -n "$1" ] ; do
case $1 in
-force|--force)
SLACKBUILD_ARGS="${SLACKBUILD_ARGS:+"$SLACKBUILD_ARGS "}--force"
shift
;;
-no-cleanup|--no-cleanup)
SLACKBUILD_ARGS="${SLACKBUILD_ARGS:+"$SLACKBUILD_ARGS "}--no-cleanup"
shift
;;
-no-patchesdir|--no-patchesdir)
NOPATCHESDIR=1
shift
;;
-no-skip|--no-skip)
NOSKIP=1
NOPATCHESDIR=1
shift
;;
-no-prune|--no-prune)
NOPRUNE=1
shift
;;
-publish|--publish)
PUBLISH=1
SKIP_REBUILDS=1
shift
;;
-with-testing|--with-testing)
WITH_TEST_PACKAGES=1
shift
;;
-confirm-installs|--confirm-installs)
CONFIRM_INSTALLS=1
shift
;;
-set=*|--set=*)
SETS=$(echo $1 | cut -f2 -d=)
shift
;;
-package=*|--package=*)
PKG_ONLY=$(echo $1 | cut -f2 -d=)
shift
;;
-download-only|--download-only)
ONLY_DOWNLOAD=1
shift
;;
-download|--download)
AUTO_DOWNLOAD=1
shift
;;
-skip-rebuilds|--skip-rebuilds)
SKIP_REBUILDS=1
shift
;;
-help|--help)
usage
exit 1
;;
*)
usage ;
echo ;
echo "Invalid option: $1"
exit 1
;;
esac
done
#========================================================================
# STARTUP
echo ; header "* Building GSB "
if [ "$(id -u)" != "0" ]; then
echo "* Error: Only root can build, install, upgrade, or remove packages."
exit 1
fi
# Temporary space, package and log file storage.
mkdir -p $TMP &&
mkdir -p $PKGDEST &&
mkdir -p $LOGSDIR &&
mkdir -p $PKGDEST/${EXTRADIR} &&
mkdir -p $PKGDEST/${PASTUREDIR} &&
mkdir -p $PKGDEST/${TESTINGDIR} || exit
[ "$NOPATCHESDIR" = "0" ] && {
mkdir -p $PKGDEST/${PATCHESDIR}/packages || exit 1
}
# Clear away all tagfiles from build tree to prevent some applications
# from being skipped when upgradepkg is called.
find $PKGDEST/ -name tagfile -exec rm {} \;
#========================================================================
# MAIN LIST
#
# The set list is read in from buildlist.txt, with any comments and blank
# lines removed.
#
cd ${BUILDSOURCE}
BUILDLIST=${BUILDLIST:-""}
[ -f buildlist.txt ] && {
BUILDLIST="$(egrep -v "^#|^$" buildlist.txt | \
# Remove our testing packages if not specified.
if [ "$WITH_TEST_PACKAGES" = "1" ]; then cat ; else egrep -v testing; fi | \
# Perhaps the user only wants a certain set of packages.
if [ -z "$SETS" ]; then cat ; else egrep ^${SETS}; fi | \
# Perhaps the user only wants a specific package.
if [ -z "$PKG_ONLY" ]; then cat ; else egrep ${PKG_ONLY}$; fi;)"
}
[ -z "$BUILDLIST" ] && {
echo "Nothing to build."
exit 1;
}
#========================================================================
# CLEAN SYSTEM OF TESTING/ PACKAGES
#
# Clear the system of any packages from testing/ which might be lying around.
# This ensures that we don't accidently build against a package we don't want.
#
if [ "$WITH_TEST_PACKAGES" = "0" -a "${ONLY_DOWNLOAD}" = "0" ]; then
echo; header "Removing any test packages."
( cd ${BUILDSOURCE}/../testing &&
for testpkg in $(find . -type d -mindepth 1 -maxdepth 1); do
removepkg $testpkg 1>/dev/null 2>/dev/null
done;
)
fi;
#========================================================================
# MAIN BUILD LOOP
#
# Do the build.
echo; header "* Starting build."; echo;
# LOOP THROUGH ALL PACKAGES IN $BUILDLIST
for listitem in $BUILDLIST ;
do
(
BUILD_OPTION="$(echo $listitem | cut -f1 -d:)"
SET="$(echo $listitem | cut -f2 -d: | cut -f1 -d/)"
PACKAGE="$(echo $listitem | cut -f2 -d: | cut -f2 -d/)"
SKIP_BUILD=0
DISALLOW_PATCHES=0
SOURCE=$BUILDSOURCE
# Create our tree according to Slackware defaults
case $SET in
extra)
SUBDIR=$GSBDIR/../${EXTRADIR}/${PACKAGE}
SOURCE=$BUILDSOURCE/../
DISALLOW_PATCHES=1
;;
pasture)
SUBDIR=$GSBDIR/../${PASTUREDIR}
SOURCE=$BUILDSOURCE/../
DISALLOW_PATCHES=1
;;
testing)
SUBDIR=$GSBDIR/../${TESTINGDIR}/packages
SOURCE=$BUILDSOURCE/../
DISALLOW_PATCHES=1
;;
*)
SUBDIR=$GSBDIR/$SET
;;
esac
if [ -d $SOURCE/$SET ]; then
cd $SOURCE/$SET
else
echo "Can't find set directory $SOURCE/$SET."
exit 1
fi
# Look for package
[ ! -d $PACKAGE ] && {
header "Error: Can't find package $PACKAGE." ;
exit 1 ;
}
# Make sure we can run our SlackBuild
[ ! -x "$PACKAGE/$PACKAGE.SlackBuild" ] && {
header "'$PACKAGE.SlackBuild' is not executable." ;
exit 1
}
# Get package version and build numbers from the package SlackBuild.
declare PACKAGE_$( egrep -m 1 "^VERSION=.*" $PACKAGE/$PACKAGE.SlackBuild )
declare PACKAGE_$( egrep -m 1 "^BUILD=.*" $PACKAGE/$PACKAGE.SlackBuild )
# Check that we got a version and build.
[ -z "$PACKAGE_VERSION" ] || [ -z "$PACKAGE_BUILD" ] && {
header "Failed to get VERSION or BUILD from '$PACKAGE.SlackBuild' " ; exit 1
}
# Check if the package should be rebuilt, and where it should be put.
# The assumption is to always rebuild and put packages in the main
# directory, unless modified by the checks below.
if [ "${ONLY_DOWNLOAD}" = "0" ]; then
if find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"" "" "" "\.txz" >/dev/null && [ "$NOSKIP" = "0" ]
then
if find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" "\.txz" >/dev/null
then
# Package with same version/build was found in the main directory.
SKIP_BUILD=1
else
# Not in the main directory, check patches.
if [ "$NOPATCHESDIR" = "0" -a "$DISALLOW_PATCHES" = "0" ]; then
[ -d $PKGDEST/$PATCHESDIR/packages ] && {
if find_package_files "$PKGDEST/$PATCHESDIR/packages" \
"${PACKAGE//+/\+}" "${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" \
"\.txz" >/dev/null
then
# Found in patches dir.
SKIP_BUILD=1
SUBDIR=$PATCHESDIR/packages
else
# No package in patches with the same version/build.
SUBDIR=$PATCHESDIR/packages
fi
}
fi
fi
fi
fi;
#========================================================================
# BUILD PACKAGES
#
# Build package if required.
#
SUCCESSFUL_NEW_BUILD=0
if [ "${ONLY_DOWNLOAD}" = "1" ]; then
cd $PACKAGE &&
download_package $PACKAGE || exit $?
elif [ "$SKIP_BUILD" = "0" -o "$BUILD_OPTION" = "rebuild" -a "$SKIP_REBUILDS" = "0" ]; then
rm -f $( find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" "\.txz|\.txt|\.txz\.asc" \
| tr '\n' ' ' ) >/dev/null 2>&1
find_package_files "/var/log/packages" "${PACKAGE//+/\+}" "" "" "" "" \
>/dev/null && {
echogreen "* "; echo "Removing old $PACKAGE and cleaning up files."
removepkg $( basename $( find_package_files "/var/log/packages" \
"${PACKAGE//+/\+}" "" "" "" "" ) ) || exit 1
}
echo ; echogreen "* "; echo "Building package '$PACKAGE'"
mkdir -p $PKGDEST/$SUBDIR
mkdir -p $LOGSDIR/$SET
# Run the SlackBuild
(
cd $PACKAGE &&
export PKGDEST=$PKGDEST/$SUBDIR || exit 1
if [ "$AUTO_DOWNLOAD" = "1" ]; then
[ "$BUILD_OPTION" = "nofetch" ] || {
download_package $PACKAGE || exit $?
}
fi;
./$PACKAGE.SlackBuild $SLACKBUILD_ARGS 2>&1
) | tee $LOGSDIR/$SET/$PACKAGE-$( date +%Y%m%d-%H%M%S ).log
ERR=${PIPESTATUS[0]}
[ "$ERR" != "0" ] && {
exit $ERR
}
SUCCESSFUL_NEW_BUILD=1
else
echo "* Found: $PACKAGE-${PACKAGE_VERSION//-/_}-${ARCH}-${PACKAGE_BUILD}${TAG}.txz"
fi
#========================================================================
# PRUNE OLD FILES
#
# Remove any old packages lying around
#
if [ "${NOPRUNE}" = "0" -a "${ONLY_DOWNLOAD}" = "0" ]; then
PRUNE_FILES="$( find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"" "" "" "\.txz|\.txt|\.txz\.asc" | grep -v "$( find_package_files \
"$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" "${PACKAGE_VERSION//-/_}" "" \
"${PACKAGE_BUILD}${TAG}" "\.txz|\.txz\.asc" )" | tr '\n' ' ' )"
[ ! -z "$PRUNE_FILES" ] && {
rm -f $PRUNE_FILES
}
fi;
#========================================================================
# MAKE CHECKSUMS AND DESCRIPTIONS
#
# Make a txt description of the package
if [ "$PUBLISH" = "1" -a "${ONLY_DOWNLOAD}" = "0" ]; then
make_pkg_txt "$( find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" "\.txz" )" || {
header "Failed to create txt description for '$PACKAGE'." ; exit 1
}
# Sign the package
SIGN_PACKAGE="$( find_package_files "$PKGDEST/$SUBDIR" "${PACKAGE//+/\+}" \
"${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" "\.txz" )"
if [ -f ${SIGN_PACKAGE}.asc ]; then
gpg --verify ${SIGN_PACKAGE}.asc ${SIGN_PACKAGE} 1>/dev/null 2>/dev/null || {
echo ;echo ; header "$SIGN_PACKAGE failed to pass asc verification."
echo "Has the package been corrupted?" ;
exit 1
}
echo " (ASC Signature passed.) "
else
echo ; echogreen "* " ; echo "Please sign for ${PACKAGE}:"
make_pkg_asc "$SIGN_PACKAGE" || {
header "Failed to create asc signature for '$PACKAGE'." ; exit 1
}
fi;
fi;
#========================================================================
# INSTALL NEW PACKAGE
#
# Install our new package if necessary
#
if [ "${ONLY_DOWNLOAD}" = "0" ]; then
INSTALLED=$(find_package_files "/var/log/packages" "${PACKAGE//+/\+}" "${PACKAGE_VERSION//-/_}" \
"" "${PACKAGE_BUILD}${TAG}" "")
if [ "$SKIP_BUILD" = "0" -o "${INSTALLED}" = "" ]; then
# Should we pause for before installing package?
[ "${CONFIRM_INSTALLS}" = "1" ] && {
echo ;echo "Press enter to install new package." ;
read goop;
}
upgradepkg --install-new $( find_package_files "$PKGDEST/$SUBDIR" \
"${PACKAGE//+/\+}" "${PACKAGE_VERSION//-/_}" "" "${PACKAGE_BUILD}${TAG}" "\.txz" ) || {
header "Failed to install '$PACKAGE'." ; exit 1
}
# Update changelog on success install and build of changed packages.
if [ "${SUCCESSFUL_NEW_BUILD}" = "1" ]; then
changelog "${SET}/${PACKAGE}-${PACKAGE_VERSION//-/_}-${ARCH}-${PACKAGE_BUILD}${TAG}.txz: Built." ;
fi;
fi;
fi;
# BUILDING PACKAGE
) || {
echo "Check the build logs in: $LOGSDIR"
exit 1
}
# Done our PACKAGES loop
done
# Break out if there has been an error.
[ "$?" != "0" ] && {
exit 1
}
#========================================================================
# COPY DOCUMENTATION AND TAGFILES
#
if [ "${PUBLISH}" = "1" -a "${ONLY_DOWNLOAD}" = "0" ]; then
(
cd $BUILDSOURCE ;
# Copy tagfiles
for tagfile in $(find . -type f -name tagfile);
do
cp $tagfile $PKGDEST/$GSBDIR/$(echo $tagfile | cut -f2 -d/) || exit 1
done;
# Copy our main documentation
cd $BUILDSOURCE/.. ;
if [ "$ARCH" = "x86_64" ]; then
cat README.TXT | sed 's,@BINARY_EDITION@,64-bit x86_64 edition,g' > \
$PKGDEST/README.TXT ;
else
cat README.TXT | sed 's,@BINARY_EDITION@,32-bit x86 edition,g' > \
$PKGDEST/README.TXT ;
fi;
for i in COPYING COPYING3 CREDITS INSTALL.TXT UPGRADE.TXT \
CHANGES_AND_HINTS.TXT GPG-KEY COPYRIGHT.TXT MIRRORS.TXT CURRENT.WARNING \
SLACKWARE_REPLACED_PACKAGES.TXT FAQ.TXT ANNOUNCE.$GSB_VERSION;
do
if [ -f $i ]; then
cp $i $PKGDEST || exit 1;
fi;
done;
cat << EOF > $PKGDEST/$GSBDIR/README.TXT
This directory contains the primary GNOME SlackBuild packages -- the ones that
actually install files to your hard drive. You can install these packages with
"pkgtool", or "installpkg". See the man pages (man installpkg) for details.
Have fun!
EOF
# Copy extra documentation
cp extra/README.TXT $PKGDEST/$EXTRADIR || exit 1
[ "$WITH_TEST_PACKAGES" = "1" ] && {
cp testing/README.TXT $PKGDEST/$TESTINGDIR || exit 1
}
if [ "$ARCH" = "x86_64" ]; then
cp ChangeLog.slackware64 $PKGDEST/ChangeLog.txt &&
cp VERSIONS.slackware64 $PKGDEST/VERSIONS || exit 1
else
cp ChangeLog.slackware $PKGDEST/ChangeLog.txt &&
cp VERSIONS.slackware $PKGDEST/VERSIONS || exit 1
fi
echo;
header "* Published documentation."
echo;
)
fi;
#========================================================================
# CREATE MD5 CHECKSUMS, FILELIST AND MANIFEST
#
if [ "${PUBLISH}" = "1" ]; then
echo ; header "* Generating package file lists and checksums."
(
cd $PKGDEST || exit 1
PUBLISH_DIRS="$GSBDIR $PATCHESDIR $EXTRADIR $SOURCEDIR $PASTUREDIR"
if [ "${WITH_TEST_PACKAGES}" = "1" ]; then
PUBLISH_DIRS="${PUBLISH_DIRS} $TESTINGDIR"
fi;
for DIR in ${PUBLISH_DIRS}
do
if [ -d "${DIR}" ]; then
# Skip making packages for our source/
if [ "${DIR}" != "source" ]; then
make_packages_txt ${DIR} ${DIR} || exit 1
fi;
make_manifest ${DIR} ${DIR} || exit 1
make_filelist_txt "${DIR}" "${DIR}" "FILE_LIST" || exit 1
make_checksums_md5 ${DIR} ${DIR} || exit 1
fi;
done
( cd $PKGDEST ; mv $GSBDIR/PACKAGES.TXT . )
( cd $GSBDIR ; ln -sf ../PACKAGES.TXT )
# Make a date stamped file list of our full set of files.
make_filelist_txt "." "" "" "1" || exit 1
make_checksums_md5 .
)
fi;
echo "* Finished building GSB!"
echo "* The complete GSB binary tree can be found in: $PKGDEST"
echo "* Build logs can be found in: $LOGSDIR"
echo ;