Quote strings to be empty tested
[git-tools-moved-to-github.git] / id-deb-build / id-pbuild.sh
1 #!/bin/sh
2 # This script builds Debian packages for one or more distributions
3 # in i386/amd64 architectures. It uses pbuilder. pbuilder requires root
4 # privilege and so this script should be invoked with sudo.
5
6 usage()
7 {
8     cat <<EOF
9 Usage: id-pbuild.sh [OPTIONS]
10 Options:
11         [--debian=distros]
12         [--ubuntu=distros]
13         [--centos=distros]
14         [--upload]
15         [--concurrency=N]
16         [--product=X]
17 EOF
18     exit $1
19 }
20
21 # things that might be set by options
22 upload=false
23 do_help=false
24 concurrency=4
25 ARCHS="i386 amd64"
26
27 if test -f IDMETA; then
28     . ./IDMETA
29 fi
30 while test $# -gt 0; do
31     case "$1" in
32         -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
33         *) optarg= ;;
34     esac
35     case $1 in
36         --debian=*)
37             DEBIAN_DIST_A=$optarg
38             ;;
39         --ubuntu=*)
40             UBUNTU_DIST_A=$optarg
41             ;;
42         --centos=*)
43             CENTOS_DIST_A=$optarg
44             ;;
45         --upload)
46             upload=true
47             ;;
48         --concurrency=*)
49             concurrency=$optarg
50             ;;
51         --product=*)
52             PRODUCT=$optarg
53             ;;
54         -*)
55             do_help=yes
56             ;;
57     esac
58     shift
59 done
60
61 if test "$DEBIAN_DIST_A" -o "$UBUNTU_DIST_A" -o "$CENTOS_DIST_A"; then
62     DEBIAN_DIST=$DEBIAN_DIST_A
63     UBUNTU_DIST=$UBUNTU_DIST_A
64     CENTOS_DIST=$CENTOS_DIST_A
65 fi
66
67 if test "$do_help" = "yes"; then
68     usage 1 1>&2
69 fi
70
71 if test "$DEBIAN_DIST" -o "$UBUNTU_DIST"; then
72     debian=true
73 else
74     debian=false
75 fi
76
77 D0=`dirname $0`
78 ID_DEB_BUILD=`cd $D0; pwd`
79 PBUILDROOT=${ID_DEB_BUILD}/id-pbuild-root.sh
80 if test ! -x $PBUILDROOT; then
81     echo "$PBUILDROOT not found"
82     exit 1
83 fi
84
85 MKDEBSRC=${ID_DEB_BUILD}/id-mk-deb-src.sh
86 if test ! -x $MKDEBSRC; then
87     echo "$MKDEBSRC not found"
88     exit 1
89 fi
90
91 if $upload; then
92     :
93 else
94     if $debian; then
95         if test "${SUDO_USER}"; then
96             if test ! -d deb-src; then
97                 $MKDEBSRC
98             fi
99         else
100             if test -d deb-src; then
101                 rm -f deb-src/*.gz
102                 if test $? -ne 0; then
103                     echo "deb-src could not be removed. Remove deb-src manually"
104                     exit 1
105                 fi
106             fi
107             $MKDEBSRC
108         fi
109     else
110         mkdir -p deb-src
111     fi
112 fi
113
114 cd deb-src
115
116 if $debian; then
117     for f in *.dsc; do
118         if test -f "$f"; then
119             PKG=$f
120         fi
121     done
122     if test -z "$PKG"; then
123         echo "Specify .dsc file"
124         exit 1
125     fi
126     if test ! -e "$PKG"; then
127         echo "${PKG} does not exist"
128         exit 1
129     fi
130     if grep "Architecture: all" $PKG >/dev/null; then
131         USE_ARCHS=i386
132     else
133         USE_ARCHS=$ARCHS
134     fi
135 fi
136
137 if test -z "$PRODUCT"; then
138     PRODUCT=$NAME
139 fi
140 if test -z "$PRODUCT"; then
141     if $debian; then
142         PRODUCT=`echo *.dsc|sed 's/_.*//g'`
143     else
144         PRODUCT=`cd ..;rpm -q --specfile *.spec --queryformat "%{NAME};" | cut -d ";" -f1`
145     fi
146 fi
147 echo "Dsc $PKG . Product $PRODUCT"
148 echo "Ubuntu distros: $UBUNTU_DIST"
149 echo "Debian distros: $DEBIAN_DIST"
150 echo "Centos distros: $CENTOS_DIST"
151
152 if $debian; then
153     if test "${SUDO_USER}"; then
154         echo "Running as sudo."
155         echo "Tip: You can avoid it by adding the following in /etc/sudoers"
156         echo "${SUDO_USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
157         HOME_EXPORT=/home/${SUDO_USER}
158     else
159         sudo -k
160         HOME_EXPORT=$HOME
161     fi
162     if test ! -f ${HOME_EXPORT}/.pbuilderrc; then
163         echo "${HOME_EXPORT}/.pbuilderrc missing"
164         exit 1
165     fi
166 fi
167
168 if $upload; then
169     for dist in ${CENTOS_DIST}; do
170         arch=amd64
171         prodver=${PRODUCT}-${VERSION}
172         if scp ${ID_DEB_BUILD}/../id-rpm-build/upload-rpms.sh ${dist}:rpmbuild/SOURCES/${prodver}/; then
173             :
174         else
175             echo "Copy of upload-rpms.sh to $dist failed"
176             exit 1
177         fi
178         if ssh $dist "cd rpmbuild/SOURCES/${prodver} && chmod +x upload-rpms.sh && ./upload-rpms.sh ${PRODUCT}.spec"; then
179             :
180         else
181             echo "Upload failed for $dist"
182             exit 1
183         fi
184     done
185     for dist in ${UBUNTU_DIST}; do
186         scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/ubuntu/${dist}
187     done
188     for dist in ${DEBIAN_DIST}; do
189         scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/debian/${dist}
190     done
191     echo ""
192     echo "===================================================="
193     echo "APT/YUM should be updated via cron every 15 minutes "
194     echo " from July 11 2013 and later."
195     echo "No need to call update archive on kebab"
196     echo "===================================================="
197     exit 0
198 fi
199
200 rm -f *.log
201
202 # copy tars to centos build hosts
203 for dist in ${CENTOS_DIST}; do
204     arch=amd64
205     prodver=${PRODUCT}-${VERSION}
206     tarname=${prodver}.tar.gz
207     if test ! -f ../${tarname}; then
208         echo "$tarname: missing"
209         exit 1
210     fi
211
212     if ssh $dist "test -f .rpmmacros && test -d rpmbuild/SOURCES && test -d rpmbuild/RPMS && test -d rpmbuild/SRPMS"; then
213         :
214     else
215         echo "Host $dist does not seem to be prepared with rpmbuild directories"
216         exit 1
217     fi
218
219     if scp ../${tarname} $dist:rpmbuild/SOURCES/ ; then
220         :
221     else
222         echo "Could not copy $tarname to $dist"
223         exit 1
224     fi
225     if ssh $dist "cd rpmbuild/SOURCES && rm -fr $prodver && tar zxf $tarname && cd ${prodver} && rpmbuild -ba ${PRODUCT}.spec" >${dist}-${arch}.log 2>&1; then
226         :
227     else
228         echo "FAILED: See ${dist}-${arch}.log"
229         exit 1
230     fi
231 done
232
233 # call our privileged wrapper to clean the directories, no --dsc option
234 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
235     for arch in ${USE_ARCHS}; do
236         sudo -n $PBUILDROOT --home=${HOME_EXPORT} --dist=$dist --arch=$arch
237         if test $? -ne 0; then
238             echo "FAILED"
239             echo "Run id-pbuild.sh using sudo or add yourself to /etc/sudoers:"
240             echo "${USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
241             exit 1
242         fi
243     done
244 done
245
246 # call our privileged wrapper to do the real work, with --dsc option
247 i=0
248 date
249 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
250     for arch in ${USE_ARCHS}; do
251         sudo -n $PBUILDROOT --home=${HOME_EXPORT} \
252             --dist=$dist --arch=$arch --dsc=$PKG >${dist}-${arch}.log 2>&1 &
253         i=`expr $i + 1`
254         if test $i -eq $concurrency; then
255             i=0
256             wait
257             if test -f ${dist}-${arch}/*.dsc; then
258                 :
259             else
260                 echo "FAILED: No .dsc file for ${dist}-${arch}"
261                 exit 1
262             fi
263         fi
264     done
265 done
266 wait
267 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
268     for arch in ${USE_ARCHS}; do
269         if test -f ${dist}-${arch}/*.dsc; then
270             :
271         else
272             echo "FAILED: No .dsc file for ${dist}-${arch}"
273             exit 1
274         fi
275     done
276 done
277
278 date
279 echo "Done"
280 # Local Variables:
281 # mode:shell-script
282 # sh-indentation: 2
283 # sh-basic-offset: 4
284 # End: