aboutsummaryrefslogtreecommitdiff
path: root/pdebuild-internal
blob: b737216da5d6490f8541e51c75555919ba93a83b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#! /bin/bash
#   pbuilder-internal -- personal Debian package builder, internal routine
#   Copyright (C) 2003-2009 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
#
# invoke this as 
#  pbuilder execute pdebuild-internal --bindmount "${pwd}/.." "$1"
# does not support --buildresult, but should that be required ?
#
# Risk: May corrupt your files depending on how user-mode-linux works, if used inside UML.
# Will take longer if your package does not successfully run 'debian/rules clean'
# 

# This script is running inside chroot under 'pbuilder execute' as root.

set -e

# I am probably running as root; make sure I have pbuilder installed here.
# passwd is needed as well because of useradd and groupadd calls.
apt-get install -q -y "${APTGETOPT[@]}" pbuilder passwd

# I'm not going to have the same LOGNAME as outside, I'm root.
export LOGNAME=root

cd "$1"
shift;

# dummy function that does enough, real one is defined elsewhere.
# We don't deal with LOGLEVEL here, though.
# We can't just source the modules and use log.{i,w,e} since we don't know if
# the pbuilder version inside the chroot is new enough.
function log() {
    echo "$*"
}

while [ -n "$1" ]; do 
    case "$1" in 
	--debbuildopts)
	    # append to DEBBUILDOPTS or reset to empty if $2 isn't set
	    DEBBUILDOPTS="${2:+${DEBBUILDOPTS:+$DEBBUILDOPTS }$2}";
	    log "I: Setting DEBBUILDOPTS=$DEBBUILDOPTS"
	    shift; shift;
	    ;;
	--uid)
	    BUILDRESULTUID=$2
	    shift; shift;
	    ;;
	--gid)
	    BUILDRESULTGID=$2
	    shift; shift;
	    ;;
	--pbuildersatisfydepends)
	    PBUILDERSATISFYDEPENDSCMD=$2
	    shift; shift;
	    ;;
	--debug)
	    PBUILDER_DEBUGMODE=yes
	    set -x
	    shift;
	    ;;
	--*)
	    log "E: Unknown option [$1] was specified "
	    exit 1;
	    ;;
	*)
	    break;
	    ;;
    esac
done

# Calling pbuilder-runhooks; we try to fix up enough to fool
# pbuilder-runhooks.  The following source call depends on
# pbuilder-runhook inside the chroot, which might be different from
# the version outside the chroot.
. /usr/lib/pbuilder/pbuilder-runhooks
# fool pbuilder-runhooks to use / as buildplace, since I am already
# inside chroot.
BUILDPLACE=/
# chroot command will just chroot to /, which will effectively chdir
# to / and nothing else.
CHROOTEXEC="chroot $BUILDPLACE "
# make HOOKDIR contain something if there is a hook, to fool HOOKDIR
# check inside pbuilder-runhooks that there is HOOKDIR
# configuration. We don't call loadhooks or unloadhooks ourselves,
# pbuilder execute will do that for you, so we should be okay.
# TODO: handle when --hookdir was not initially specified.
if [ -d "/$hookdir" ]; then
    HOOKDIR="/$hookdir"
fi

executehooks "D"
export PBCURRENTCOMMANDLINEOPERATION="pdebuild"
"$PBUILDERSATISFYDEPENDSCMD"
apt-get install -q -y "${APTGETOPT[@]}" fakeroot


# set home directory to ..
export HOME=$(readlink -f $(pwd)/../)
if [ -z "${HOME}" ]; then
    echo "E: Failed to obtain reasonable HOME from pwd"
fi

# create the user similar to that used outside.
# TODO: what about id -G output? if other groups than the designated
# is used, we're stuffed.
groupadd -g "${BUILDRESULTGID}" -o pbgroup
useradd -g pbgroup -u "${BUILDRESULTUID}" -d "${HOME}" -o pbuser

executehooks "A"

# do build with that user.
# $DEBBUILDOPTS is evaluated inside the su and chroot.
export DEBBUILDOPTS
CMD="env PATH=$PATH /usr/bin/dpkg-buildpackage -rfakeroot -us -uc "'${DEBBUILDOPTS}'
echo "I: Running $CMD"
# This command should be ran with current directory as bind-mounted
# package source directory
if echo "$CMD" | \
    su -p pbuser; 
    then
    # build was successful
    :
else
    executehooks "C"
    exit 1
fi

executehooks "B"