ae4008b13bfab74545bad00b1d92eadcfdab93b3
[platform/framework/web/crosswalk.git] / src / chrome / installer / linux / rpm / build.sh
1 #!/bin/bash
2 #
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 # TODO(mmoss) This currently only works with official builds, since non-official
8 # builds don't add the "${BUILDDIR}/installer/" files needed for packaging.
9
10 set -e
11 if [ "$VERBOSE" ]; then
12   set -x
13 fi
14 set -u
15
16 gen_spec() {
17   rm -f "${SPEC}"
18   # Trunk packages need to install to a custom path so they don't conflict with
19   # release channel packages.
20   local PACKAGE_FILENAME="${PACKAGE}"
21   if [ "$CHANNEL" = "trunk" ] || [ "$CHANNEL" = "asan" ]; then
22     local INSTALLDIR="${INSTALLDIR}-${CHANNEL}"
23     PACKAGE_FILENAME="${PACKAGE}-${CHANNEL}"
24     local MENUNAME="${MENUNAME} (${CHANNEL})"
25   fi
26   process_template "${SCRIPTDIR}/chrome.spec.template" "${SPEC}"
27 }
28
29 # Setup the installation directory hierachy in the package staging area.
30 prep_staging_rpm() {
31   prep_staging_common
32   install -m 755 -d "${STAGEDIR}/etc/cron.daily"
33 }
34
35 # Put the package contents in the staging area.
36 stage_install_rpm() {
37   # TODO(phajdan.jr): Deduplicate this and debian/build.sh .
38   # For now duplication is going to help us avoid merge conflicts
39   # as changes are frequently merged to older branches related to SxS effort.
40   if [ "$CHANNEL" != "stable" ]; then
41     # This would ideally be compiled into the app, but that's a bit too
42     # intrusive of a change for these limited use channels, so we'll just hack
43     # it into the wrapper script. The user can still override since it seems to
44     # work to specify --user-data-dir multiple times on the command line, with
45     # the last occurrence winning.
46     local SXS_USER_DATA_DIR="\${XDG_CONFIG_HOME:-\${HOME}/.config}/${PACKAGE}-${CHANNEL}"
47     local DEFAULT_FLAGS="--user-data-dir=\"${SXS_USER_DATA_DIR}\""
48
49     # Avoid file collisions between channels.
50     # TODO(phajdan.jr): Do that for all packages for SxS,
51     # http://crbug.com/38598 .
52     # We can't do this for now for all packages because of
53     # http://crbug.com/295103 , and ultimately http://crbug.com/22703 .
54     # Also see https://groups.google.com/a/chromium.org/d/msg/chromium-dev/DBEqOORaRiw/pE0bNI6h0kcJ .
55     if [ "$CHANNEL" = "trunk" ] || [ "$CHANNEL" = "asan" ]; then
56       local PACKAGE="${PACKAGE}-${CHANNEL}"
57       local INSTALLDIR="${INSTALLDIR}-${CHANNEL}"
58     fi
59
60     # Make it possible to distinguish between menu entries
61     # for different channels.
62     local MENUNAME="${MENUNAME} (${CHANNEL})"
63   fi
64   prep_staging_rpm
65   stage_install_common
66   echo "Staging RPM install files in '${STAGEDIR}'..."
67   process_template "${BUILDDIR}/installer/common/rpmrepo.cron" \
68     "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
69   chmod 755 "${STAGEDIR}/etc/cron.daily/${PACKAGE}"
70 }
71
72 # Actually generate the package file.
73 do_package() {
74   echo "Packaging ${ARCHITECTURE}..."
75   PROVIDES="${PACKAGE}"
76   local REPS="$REPLACES"
77   REPLACES=""
78   for rep in $REPS; do
79     if [ -z "$REPLACES" ]; then
80       REPLACES="$PACKAGE-$rep"
81     else
82       REPLACES="$REPLACES $PACKAGE-$rep"
83     fi
84   done
85
86   # The symbols in libX11.so are not versioned, so when a newer version has new
87   # symbols like _XGetRequest, RPM's find-requires tool does not detect it, and
88   # there is no way to specify a libX11.so version number to prevent
89   # installation on affected distros like OpenSUSE 12.1 and Fedora 16.
90   # Thus there has to be distro-specific conflict here.
91   # TODO(thestig) Remove these in the future when other requirements prevent
92   # installation on affected distros.
93   ADDITIONAL_CONFLICTS="xorg-x11-libX11 < 7.6_1 libX11 < 1.4.99"
94   REPLACES="$REPLACES $ADDITIONAL_CONFLICTS"
95
96   # If we specify a dependecy of foo.so below, we would depend on both the
97   # 32 and 64-bit versions on a 64-bit machine. The current version of RPM
98   # we use is too old and doesn't provide %{_isa}, so we do this manually.
99   if [ "$ARCHITECTURE" = "x86_64" ] ; then
100     local EMPTY_VERSION="()"
101     local PKG_ARCH="(64bit)"
102   elif [ "$ARCHITECTURE" = "i386" ] ; then
103     local EMPTY_VERSION=""
104     local PKG_ARCH=""
105   fi
106
107   # Use find-requires script to make sure the dependencies are complete
108   # (especially libc and libstdc++ versions).
109   # - Filter out udev to avoid libudev.so.0 vs. libudev.so.1 mismatches.
110   # - Filter out libmojo_system since that a library that we provide.
111   DETECTED_DEPENDS="$(echo "${BUILDDIR}/chrome" | /usr/lib/rpm/find-requires |
112       grep -v 'udev\|libmojo_system')"
113
114   # Compare the expected dependency list to the generated list.
115   BAD_DIFF=0
116   diff "$SCRIPTDIR/expected_deps_$ARCHITECTURE" \
117       <(echo "${DETECTED_DEPENDS}") || BAD_DIFF=1
118   if [ $BAD_DIFF -ne 0 ] && [ -z "${IGNORE_DEPS_CHANGES:-}" ]; then
119     echo
120     echo "ERROR: Shared library dependencies changed!"
121     echo "If this is intentional, please update:"
122     echo "chrome/installer/linux/rpm/expected_deps_i386"
123     echo "chrome/installer/linux/rpm/expected_deps_x86_64"
124     echo
125     exit $BAD_DIFF
126   fi
127
128   # libgdk_pixbuf is added in LSB 3.2 and no longer explicitly required.
129   # libcairo, libpangocairo, libasound are in LSB 4. and no longer explicitly
130   # required.
131   # xdg-utils is still optional in LSB 4.0.
132   # nss (bundled) is optional in LSB 4.0.
133   #
134   # We want to depend on the system SSL certs so wget can upload crash reports
135   # securely, but there's no common capability between the distros. Bugs filed:
136   # https://qa.mandriva.com/show_bug.cgi?id=55714
137   # https://bugzilla.redhat.com/show_bug.cgi?id=538158
138   # https://bugzilla.novell.com/show_bug.cgi?id=556248
139   DEPENDS="lsb >= 4.0, \
140   libcurl.so.4${EMPTY_VERSION}${PKG_ARCH}, \
141   libnss3.so(NSS_3.14.3)${PKG_ARCH}, \
142   wget, \
143   xdg-utils, \
144   zlib, \
145   $(echo "${DETECTED_DEPENDS}" | tr '\n' ',')"
146   gen_spec
147
148   # Create temporary rpmbuild dirs.
149   RPMBUILD_DIR=$(mktemp -d -t rpmbuild.XXXXXX) || exit 1
150   mkdir -p "$RPMBUILD_DIR/BUILD"
151   mkdir -p "$RPMBUILD_DIR/RPMS"
152
153   # '__os_install_post ${nil}' disables a bunch of automatic post-processing
154   # (brp-compress, etc.), which by default appears to only be enabled on 32-bit,
155   # and which doesn't gain us anything since we already explicitly do all the
156   # compression, symbol stripping, etc. that we want.
157   fakeroot rpmbuild -bb --target="$ARCHITECTURE" --rmspec \
158     --define "_topdir $RPMBUILD_DIR" \
159     --define "_binary_payload w9.bzdio" \
160     --define "__os_install_post  %{nil}" \
161     "${SPEC}"
162   PKGNAME="${PACKAGE}-${CHANNEL}-${VERSION}-${PACKAGE_RELEASE}"
163   mv "$RPMBUILD_DIR/RPMS/$ARCHITECTURE/${PKGNAME}.${ARCHITECTURE}.rpm" \
164      "${OUTPUTDIR}"
165   # Make sure the package is world-readable, otherwise it causes problems when
166   # copied to share drive.
167   chmod a+r "${OUTPUTDIR}/${PKGNAME}.$ARCHITECTURE.rpm"
168   rm -rf "$RPMBUILD_DIR"
169 }
170
171 # Remove temporary files and unwanted packaging output.
172 cleanup() {
173   rm -rf "${STAGEDIR}"
174   rm -rf "${TMPFILEDIR}"
175 }
176
177 usage() {
178   echo "usage: $(basename $0) [-c channel] [-a target_arch] [-o 'dir']"
179   echo "                      [-b 'dir']"
180   echo "-c channel the package channel (trunk, asan, unstable, beta, stable)"
181   echo "-a arch    package architecture (ia32 or x64)"
182   echo "-o dir     package output directory [${OUTPUTDIR}]"
183   echo "-b dir     build input directory    [${BUILDDIR}]"
184   echo "-h         this help message"
185 }
186
187 # Check that the channel name is one of the allowable ones.
188 verify_channel() {
189   case $CHANNEL in
190     stable )
191       CHANNEL=stable
192       REPLACES="unstable beta"
193       ;;
194     unstable|dev|alpha )
195       CHANNEL=unstable
196       REPLACES="stable beta"
197       ;;
198     testing|beta )
199       CHANNEL=beta
200       REPLACES="unstable stable"
201       ;;
202     trunk|asan )
203       # This is a special package, mostly for development testing, so don't make
204       # it replace any installed release packages.
205       REPLACES="dummy"
206       # Setting this to empty will prevent it from updating any existing configs
207       # from release packages.
208       REPOCONFIG=""
209       ;;
210     * )
211       echo
212       echo "ERROR: '$CHANNEL' is not a valid channel type."
213       echo
214       exit 1
215       ;;
216   esac
217 }
218
219 process_opts() {
220   while getopts ":o:b:c:a:h" OPTNAME
221   do
222     case $OPTNAME in
223       o )
224         OUTPUTDIR=$(readlink -f "${OPTARG}")
225         mkdir -p "${OUTPUTDIR}"
226         ;;
227       b )
228         BUILDDIR=$(readlink -f "${OPTARG}")
229         ;;
230       c )
231         CHANNEL="$OPTARG"
232         verify_channel
233         ;;
234       a )
235         TARGETARCH="$OPTARG"
236         ;;
237       h )
238         usage
239         exit 0
240         ;;
241       \: )
242         echo "'-$OPTARG' needs an argument."
243         usage
244         exit 1
245         ;;
246       * )
247         echo "invalid command-line option: $OPTARG"
248         usage
249         exit 1
250         ;;
251     esac
252   done
253 }
254
255 #=========
256 # MAIN
257 #=========
258
259 SCRIPTDIR=$(readlink -f "$(dirname "$0")")
260 OUTPUTDIR="${PWD}"
261 STAGEDIR=$(mktemp -d -t rpm.build.XXXXXX) || exit 1
262 TMPFILEDIR=$(mktemp -d -t rpm.tmp.XXXXXX) || exit 1
263 CHANNEL="trunk"
264 # Default target architecture to same as build host.
265 if [ "$(uname -m)" = "x86_64" ]; then
266   TARGETARCH="x64"
267 else
268   TARGETARCH="ia32"
269 fi
270 SPEC="${TMPFILEDIR}/chrome.spec"
271
272 # call cleanup() on exit
273 trap cleanup 0
274 process_opts "$@"
275 if [ ! "$BUILDDIR" ]; then
276   BUILDDIR=$(readlink -f "${SCRIPTDIR}/../../../../../out/Release")
277 fi
278
279 source ${BUILDDIR}/installer/common/installer.include
280
281 get_version_info
282
283 if [ "$CHROMIUM_BUILD" = "_google_chrome" ]; then
284   source "${BUILDDIR}/installer/common/google-chrome.info"
285 else
286   source "${BUILDDIR}/installer/common/chromium-browser.info"
287 fi
288 eval $(sed -e "s/^\([^=]\+\)=\(.*\)$/export \1='\2'/" \
289   "${BUILDDIR}/installer/theme/BRANDING")
290
291 REPOCONFIG="http://dl.google.com/linux/${PACKAGE#google-}/rpm/stable"
292 verify_channel
293 export USR_BIN_SYMLINK_NAME="${PACKAGE}-${CHANNEL}"
294
295 # Make everything happen in the OUTPUTDIR.
296 cd "${OUTPUTDIR}"
297
298 case "$TARGETARCH" in
299   ia32 )
300     export ARCHITECTURE="i386"
301     stage_install_rpm
302     ;;
303   x64 )
304     export ARCHITECTURE="x86_64"
305     stage_install_rpm
306     ;;
307   * )
308     echo
309     echo "ERROR: Don't know how to build RPMs for '$TARGETARCH'."
310     echo
311     exit 1
312     ;;
313 esac
314
315 do_package