On CI use common install prefix named 'dep_prefix' for installing local packages
[platform/upstream/dbus.git] / tools / ci-install.sh
1 #!/bin/bash
2
3 # Copyright © 2015-2016 Collabora Ltd.
4 #
5 # Permission is hereby granted, free of charge, to any person
6 # obtaining a copy of this software and associated documentation files
7 # (the "Software"), to deal in the Software without restriction,
8 # including without limitation the rights to use, copy, modify, merge,
9 # publish, distribute, sublicense, and/or sell copies of the Software,
10 # and to permit persons to whom the Software is furnished to do so,
11 # subject to the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be
14 # included in all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 # SOFTWARE.
24
25 set -euo pipefail
26 set -x
27
28 NULL=
29
30 # ci_distro:
31 # OS distribution in which we are testing
32 # Typical values: ubuntu, debian; maybe fedora in future
33 : "${ci_distro:=ubuntu}"
34
35 # ci_docker:
36 # If non-empty, this is the name of a Docker image. ci-install.sh will
37 # fetch it with "docker pull" and use it as a base for a new Docker image
38 # named "ci-image" in which we will do our testing.
39 : "${ci_docker:=}"
40
41 # ci_host:
42 # Either "native", or an Autoconf --host argument to cross-compile
43 # the package
44 : "${ci_host:=native}"
45
46 # ci_in_docker:
47 # Used internally by ci-install.sh. If yes, we are inside the Docker image
48 # (ci_docker is empty in this case).
49 : "${ci_in_docker:=no}"
50
51 # ci_local_packages:
52 # prefer local packages instead of distribution
53 : "${ci_local_packages:=yes}"
54
55 # ci_suite:
56 # OS suite (release, branch) in which we are testing.
57 # Typical values for ci_distro=debian: sid, jessie
58 # Typical values for ci_distro=fedora might be 25, rawhide
59 : "${ci_suite:=xenial}"
60
61 # ci_variant:
62 # One of debug, reduced, legacy, production
63 : "${ci_variant:=production}"
64
65 if [ $(id -u) = 0 ]; then
66     sudo=
67 else
68     sudo=sudo
69 fi
70
71 if [ -n "$ci_docker" ]; then
72     sed \
73         -e "s/@ci_distro@/${ci_distro}/" \
74         -e "s/@ci_docker@/${ci_docker}/" \
75         -e "s/@ci_suite@/${ci_suite}/" \
76         < tools/ci-Dockerfile.in > Dockerfile
77     exec docker build -t ci-image .
78 fi
79
80 case "$ci_distro" in
81     (debian|ubuntu)
82         # Don't ask questions, just do it
83         sudo="$sudo env DEBIAN_FRONTEND=noninteractive"
84
85         # Debian Docker images use httpredir.debian.org but it seems to be
86         # unreliable; use a CDN instead
87         $sudo sed -i -e 's/httpredir\.debian\.org/deb.debian.org/g' \
88             /etc/apt/sources.list
89
90         case "$ci_suite" in
91             (xenial)
92                 # Ubuntu 16.04 didn't have the wine32, wine64 packages
93                 wine32=wine:i386
94                 wine64=wine:amd64
95                 ;;
96             (*)
97                 wine32=wine32
98                 wine64=wine64
99                 ;;
100         esac
101
102         case "$ci_suite" in
103             (trusty)
104                 # Ubuntu 14.04 didn't have the wine32, wine64 packages
105                 wine32=wine:i386
106                 wine64=wine:amd64
107                 ;;
108             (*)
109                 wine32=wine32
110                 wine64=wine64
111                 ;;
112         esac
113
114         case "$ci_host" in
115             (i686-w64-mingw32)
116                 $sudo dpkg --add-architecture i386
117                 ;;
118             (x86_64-w64-mingw32)
119                 # assume the host or container is x86_64 already
120                 ;;
121         esac
122
123         $sudo apt-get -qq -y update
124         packages=()
125
126         case "$ci_host" in
127             (i686-w64-mingw32)
128                 packages=(
129                     "${packages[@]}"
130                     binutils-mingw-w64-i686
131                     g++-mingw-w64-i686
132                     $wine32 wine
133                 )
134                 ;;
135             (x86_64-w64-mingw32)
136                 packages=(
137                     "${packages[@]}"
138                     binutils-mingw-w64-x86-64
139                     g++-mingw-w64-x86-64
140                     $wine64 wine
141                 )
142                 ;;
143         esac
144
145         if [ "$ci_host/$ci_variant/$ci_suite" = "native/production/buster" ]; then
146             packages=(
147                 "${packages[@]}"
148                 qttools5-dev-tools
149                 qt5-default
150             )
151         fi
152
153         packages=(
154             "${packages[@]}"
155             adduser
156             autoconf-archive
157             automake
158             autotools-dev
159             ccache
160             cmake
161             debhelper
162             dh-autoreconf
163             dh-exec
164             docbook-xml
165             docbook-xsl
166             doxygen
167             dpkg-dev
168             g++
169             gcc
170             gnome-desktop-testing
171             libapparmor-dev
172             libaudit-dev
173             libcap-ng-dev
174             libexpat-dev
175             libglib2.0-dev
176             libselinux1-dev
177             libsystemd-dev
178             libx11-dev
179             python
180             python-dbus
181             python-gi
182             sudo
183             valgrind
184             wget
185             xauth
186             xmlto
187             xsltproc
188             xvfb
189         )
190
191         case "$ci_suite" in
192             (stretch)
193                 # Debian 9 'stretch' didn't have the ducktype package
194                 ;;
195
196             (*)
197                 # assume Ubuntu 18.04 'bionic', Debian 10 'buster' or newer
198                 packages=(
199                     "${packages[@]}"
200                     ducktype yelp-tools
201                 )
202                 ;;
203         esac
204
205         $sudo apt-get -qq -y --no-install-recommends install "${packages[@]}"
206
207         if [ "$ci_in_docker" = yes ]; then
208             # Add the user that we will use to do the build inside the
209             # Docker container, and let them use sudo
210             adduser --disabled-password --gecos "" user
211             echo "user ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/nopasswd
212             chmod 0440 /etc/sudoers.d/nopasswd
213         fi
214
215         # manual package setup
216         case "$ci_suite" in
217             (jessie|xenial)
218                 # autoconf-archive in Debian 8 and Ubuntu 16.04 is too old,
219                 # use the one from Debian 9 instead
220                 wget http://deb.debian.org/debian/pool/main/a/autoconf-archive/autoconf-archive_20160916-1_all.deb
221                 $sudo dpkg -i autoconf-archive_*_all.deb
222                 rm autoconf-archive_*_all.deb
223                 ;;
224         esac
225
226         # Make sure we have a messagebus user, even if the dbus package
227         # isn't installed
228         $sudo adduser --system --quiet --home /nonexistent --no-create-home \
229             --disabled-password --group messagebus
230         ;;
231
232     (*)
233         echo "Don't know how to set up ${ci_distro}" >&2
234         exit 1
235         ;;
236 esac
237
238 if [ "$ci_local_packages" = yes ]; then
239     case "$ci_host" in
240         (*-w64-mingw32)
241             mirror=http://repo.msys2.org/mingw/${ci_host%%-*}
242             dep_prefix=$(pwd)/${ci_host}-prefix
243             install -d "${dep_prefix}"
244             for pkg in \
245                 bzip2-1.0.8-1 \
246                 expat-2.2.9-1 \
247                 gcc-libs-9.3.0-2 \
248                 gettext-0.19.8.1-8 \
249                 glib2-2.64.2-1 \
250                 iconv-1.16-1 \
251                 libffi-3.3-1 \
252                 libiconv-1.16-1 \
253                 libwinpthread-git-8.0.0.5814.9dbf4cc1-1 \
254                 pcre-8.44-1 \
255                 zlib-1.2.11-7 \
256             ; do
257                 wget ${mirror}/mingw-w64-${ci_host%%-*}-${pkg}-any.pkg.tar.xz
258                 tar -C ${dep_prefix} --strip-components=1 -xvf mingw-w64-${ci_host%%-*}-${pkg}-any.pkg.tar.xz
259             done
260
261             # limit access rights
262             if [ "$ci_in_docker" = yes ]; then
263                 chown -R user "${dep_prefix}"
264             fi
265             ;;
266     esac
267 fi
268
269 # vim:set sw=4 sts=4 et: