#! /bin/bash # pbuilder -- personal Debian package builder # Copyright (C) 2001,2002,2005-2007 Junichi Uekawa # # 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # functions local to pbuilder-buildpackage getdscfiles () { local DSCFILE="$1" local DSCFILES=() DSCFILES+=("$DSCFILE") DSCFILES+=("$(cat "$DSCFILE" | awk 'BEGIN{p=0} ! /^[ \t]/ {p=0} /^Files:/ {p=1} ! /^[ \t]*/ {p=0} /^ / {if (p){print "'$(dirname "$DSCFILE")'/" $3}}' | tr '\n' ' ' | sed -e 's/[[:space:]]*$//')") # ↑↑↑ because we are really picky (and we have picky tests...) echo "${DSCFILES[@]}" } function copydsc () { local DSCFILE=$(getdscfiles "$1") local TARGET="$2" for FILE in ${DSCFILE[@]} ; do log.i "copying [$FILE]" cp -p "$FILE" "$TARGET" done } function checkbuilddep () { # call satisfydepends local BUILDOPT="--binary-all" case "${BINARY_ARCH}" in yes) BUILDOPT="--binary-arch";; *) ;; esac if "$PBUILDERSATISFYDEPENDSCMD" --control "$1" --chroot "${BUILDPLACE}" --internal-chrootexec "${CHROOTEXEC}" "${BUILDOPT}" "${PBUILDERSATISFYDEPENDSOPT[@]}"; then : else # If asked to preserve the build place, and pbuilder-satisfydepends # didn't taint it, then don't clean it when exiting. if [ $? -eq 2 -a "${PRESERVE_BUILDPLACE}" = "yes" ]; then trap umountproc_trap exit sighup fi log.e "pbuilder-satisfydepends failed." exit 2 fi # install extra packages to the chroot if [ -n "$EXTRAPACKAGES" ]; then $CHROOTEXEC usr/bin/apt-get -q -y "${APTGETOPT[@]}" install ${EXTRAPACKAGES} fi } function showbuildbanner () { # show some banners for building log.i "pbuilder-buildpackage/"$(dpkg --print-architecture) log.i "$1" } function cowprotect () { # a hack for cowdancer, used when a file is edited in-place; # Copy the file to create a new i-node so that hardlinked original is intact for A in "$@"; do if readlink -f "$A" > /dev/null; then A=$(readlink -f "$A") mv "$A" "$A"~ cp -a "$A"~ "$A" rm -f "$A"~ fi done } function createbuilduser () { # create the build user, if it is necessary and specified. if [ -n "$BUILDUSERNAME" -a -n "$BUILDUSERID" ]; then if [ -e $BUILDPLACE/etc/shadow ]; then p='x'; else p='*'; fi if [ -e $BUILDPLACE/etc/gshadow ]; then g='x'; else g='*'; fi if ! grep -q ^$BUILDUSERNAME: $BUILDPLACE/etc/passwd; then cowprotect $BUILDPLACE/etc/passwd echo "$BUILDUSERNAME:$p:$BUILDUSERID:$BUILDUSERID:,,,:$BUILD_HOME:/bin/sh" >> $BUILDPLACE/etc/passwd fi if ! grep -q ^$BUILDUSERNAME: $BUILDPLACE/etc/group; then cowprotect $BUILDPLACE/etc/group echo "$BUILDUSERNAME:$g:$BUILDUSERID:" >> $BUILDPLACE/etc/group fi if [ -e $BUILDPLACE/etc/shadow ] && ! grep -q ^$BUILDUSERNAME: $BUILDPLACE/etc/shadow; then cowprotect $BUILDPLACE/etc/shadow echo "$BUILDUSERNAME:!:::::::" >> $BUILDPLACE/etc/shadow fi if [ -e $BUILDPLACE/etc/gshadow ] && ! grep -q ^$BUILDUSERNAME: $BUILDPLACE/etc/gshadow; then cowprotect $BUILDPLACE/etc/gshadow echo "$BUILDUSERNAME:!::" >> $BUILDPLACE/etc/gshadow fi unset LOGNAME || true else unset LOGNAME || true fi } function setup_ccache() { if [ -n "$CCACHEDIR" ]; then log.i "Setting up ccache" if ! [ -d "$BUILDPLACE/$CCACHEDIR" ]; then mkdir -p "$BUILDPLACE/$CCACHEDIR" fi chown -R $BUILDUSERID:$BUILDUSERID "$BUILDPLACE/$CCACHEDIR" CCACHE_ENV="CCACHE_DIR=$CCACHEDIR" unset CCACHE_DIR fi } function binNMU() { if [ "$BIN_NMU" == "no" ]; then return fi if [ -z "$BINNMU_MESSAGE" ]; then log.e "No changelog message provided for binNMU entry." exit 1 fi if [ -z "$BINNMU_VERSION" ]; then log.w "No version provided for binNMU entry, fall back to 1." BINNMU_VERSION=1 fi log.i "Doing a binNMU, version $BINNMU_VERSION to '$BINNMU_MESSAGE'" local cl=$(ls "$BUILDPLACE"/"$BUILDDIR"/*/debian/changelog) local tmpcl=$(mktemp pbuilder.tmpchangelog.XXXXXXXXXXX) if [ ! -f "$cl" ]; then log.e "Cannot open debian/changelog for binNMU version handling." exit 1 fi mv "$cl" "$tmpcl" local package=$(dpkg-parsechangelog -l "$tmpcl" -c 1 --show-field Source) local version=$(dpkg-parsechangelog -l "$tmpcl" -c 1 --show-field Version) local arch=$($CHROOTEXEC dpkg-architecture -qDEB_HOST_ARCH) local date=$(date -R) if [ -z "$BINNMU_MAINTAINER" ]; then log.w "No maintainer provided for binNMU entry, fall back to last uploader." BINNMU_MAINTAINER=$(dpkg-parsechangelog -l $tmpcl -c 1 --show-field Maintainer) fi if [ -z "$DISTRIBUTION" ]; then log.w "No distribution provided, using the field from the last upload" DISTRIBUTION=$(dpkg-parsechangelog -l "$tmpcl" -c 1 --show-field Distribution) fi DEBBUILDOPTS="${DEBBUILDOPTS} -e\"$BINNMU_MAINTAINER\"" cat > "$cl" << EOF $package ($version+b$BINNMU_VERSION) $DISTRIBUTION; urgency=low, binary-only=yes * Binary-only non-maintainer upload for $arch; no source changes. * $BINNMU_MESSAGE -- $BINNMU_MAINTAINER $date EOF cat "$tmpcl" >> "$cl" rm "$tmpcl" }