#!/bin/bash # Script to automate backporting for CRAN # Creates a source package and binary packages for the following architecture ARCH=i386 export ARCH # R version against which the software is compiled iteration=0 Rversion=3.5.0 # Set required r-base-dev version for packages build-depending on R rbasedev="r-base-dev (>= $Rversion)" # Where the buildresults should be stored and where to look for current backports rcrandir=/home/jranke/svn/website/www/ranke/r-cran # Author: Johannes Ranke # Preconditions: # - up to date R version specified above, for packages depending on R # - sudo and pbuilder configuration (see README) # - sid sources in /etc/apt/sources/list # - cdbs installed (and maybe more) # - shell variables DEBEMAIL and DEBFULLNAME usage() { echo "Usage: ./backport [options] sourcepackage stretch|jessie" echo "Options:" echo " -k, --keep Keep copied source package and directory used for package building" echo " -s, --skip Skip apt-get update/upgrade and pbuilder update" } # Loop over options skip=false keep=false while test -n "${1}"; do case "$1" in -k | --keep) keep=true shift ;; -s | --skip) skip=true shift ;; -*) echo "Error: Unknown option: $1" >&2 usage exit 1 ;; *) # No more options break ;; esac done # Positional arguments if [ $# -lt 2 ]; then usage; exit 1; fi pkg=$1 DIST=$2 # Validate distribution argument if [ $DIST != "stretch" ] && [ $DIST != "jessie" ]; then usage; exit 1; fi export DIST # Remove previously extracted sources if [ -d $pkg-* ] then sudo rm -rf `ls -d $pkg-*` fi # Get current source from unstable if [ "$skip" = false ] then sudo apt-get update sudo apt-get upgrade fi sudo apt-get source $pkg # Copy sources to $DIST directory to enable parallel builds mkdir -p $DIST cp -r $pkg\_* $DIST cp -r $pkg-* $DIST # Go to package building directory cd $DIST/$pkg-* # Determine the version of the upstream Debian package upstreamversion=`dpkg-parsechangelog | grep ^Version | cut -f2 -d " "` # Define the version to be used for the backport cranversion=$upstreamversion"~"$DIST"cran.$iteration" # Only do a backport if not already available # This avoids recompiling packages resulting in different sizes which # would make an update of the archive index inside the loop in backport_others # necessary new_dsc=$rcrandir/$DIST-cran35/${pkg}_${cranversion}.dsc logfile=$rcrandir/$DIST-cran35/${pkg}_${cranversion}_${ARCH}.build if [ -e $new_dsc ]; then echo backport.sh: $new_dsc already present else echo backport.sh: Upstream version is $upstreamversion echo backport.sh: New CRAN version is $cranversion # Add new version to changelog dch -v "${cranversion}" --force-distribution -D $DIST-cran -b "Backport from Debian unstable to Debian $DIST" # Adapt build dependency on r-base-dev if present if grep -q "^Build-Depends.*r-base-dev" debian/control then ssed -i -R "/^Build-Depends/s/r-base-dev \(>= .*?\)/$rbasedev/" debian/control ssed -i -R "/^Build-Depends-Indep/s/r-base-dev \(>= .*?\)/$rbasedev/" debian/control dch -a "debian/control: Adapt build dependency on r-base-dev to current backport" fi # Check for a script doing modifications required for backporting script=../\_reverts\_$pkg\.sh if [ -f $script ]; then source $script; fi if [ "$skip" = false ] then sudo -E pbuilder update \ --override-config \ --distribution $DIST \ --basetgz /var/cache/pbuilder/$DIST-$ARCH-base.tgz \ --aptcache /var/cache/pbuilder/$DIST-$ARCH/aptcache fi sudo -E pdebuild --debbuildopts '-sa' \ --buildresult $rcrandir/$DIST-cran35/ \ --logfile $logfile \ -- --override-config \ --distribution $DIST --basetgz /var/cache/pbuilder/$DIST-$ARCH-base.tgz \ --aptcache /var/cache/pbuilder/$DIST-$ARCH/aptcache \ --buildplace /var/cache/pbuilder/$DIST-$ARCH/build if [ $? -ne 0 ]; then exit fi fi cd ../.. # Clean sources from $DIST directory if [ "$keep" = false ] then rm -f $DIST/$pkg\_* rm -rf $DIST/$pkg-* fi