Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / build / install-build-deps.sh
1 #!/bin/bash -e
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 # Script to install everything needed to build chromium (well, ideally, anyway)
8 # See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions
9 # and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit
10
11 usage() {
12   echo "Usage: $0 [--options]"
13   echo "Options:"
14   echo "--[no-]syms: enable or disable installation of debugging symbols"
15   echo "--[no-]lib32: enable or disable installation of 32 bit libraries"
16   echo "--[no-]arm: enable or disable installation of arm cross toolchain"
17   echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\
18        "fonts"
19   echo "--[no-]nacl: enable or disable installation of prerequisites for"\
20        "building standalone NaCl and all its toolchains"
21   echo "--no-prompt: silently select standard options/defaults"
22   echo "--quick-check: quickly try to determine if dependencies are installed"
23   echo "               (this avoids interactive prompts and sudo commands,"
24   echo "               so might not be 100% accurate)"
25   echo "--unsupported: attempt installation even on unsupported systems"
26   echo "Script will prompt interactively if options not given."
27   exit 1
28 }
29
30 # Checks whether a particular package is available in the repos.
31 # USAGE: $ package_exists <package name>
32 package_exists() {
33   apt-cache pkgnames | grep -x "$1" > /dev/null 2>&1
34 }
35
36 # These default to on because (some) bots need them and it keeps things
37 # simple for the bot setup if all bots just run the script in its default
38 # mode.  Developers who don't want stuff they don't need installed on their
39 # own workstations can pass --no-arm --no-nacl when running the script.
40 do_inst_arm=1
41 do_inst_nacl=1
42
43 while test "$1" != ""
44 do
45   case "$1" in
46   --syms)                   do_inst_syms=1;;
47   --no-syms)                do_inst_syms=0;;
48   --lib32)                  do_inst_lib32=1;;
49   --no-lib32)               do_inst_lib32=0;;
50   --arm)                    do_inst_arm=1;;
51   --no-arm)                 do_inst_arm=0;;
52   --chromeos-fonts)         do_inst_chromeos_fonts=1;;
53   --no-chromeos-fonts)      do_inst_chromeos_fonts=0;;
54   --nacl)                   do_inst_nacl=1;;
55   --no-nacl)                do_inst_nacl=0;;
56   --no-prompt)              do_default=1
57                             do_quietly="-qq --assume-yes"
58     ;;
59   --quick-check)            do_quick_check=1;;
60   --unsupported)            do_unsupported=1;;
61   *) usage;;
62   esac
63   shift
64 done
65
66 ubuntu_versions="12\.04|12\.10|13\.04|13\.10"
67 ubuntu_codenames="precise|quantal|raring|saucy"
68 ubuntu_issue="Ubuntu ($ubuntu_versions|$ubuntu_codenames)"
69 # GCEL is an Ubuntu-derived VM image used on Google Compute Engine; /etc/issue
70 # doesn't contain a version number so just trust that the user knows what
71 # they're doing.
72 gcel_issue="^GCEL"
73
74 if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
75   if ! egrep -q "($ubuntu_issue|$gcel_issue)" /etc/issue; then
76     echo "ERROR: Only Ubuntu 12.04 (precise) through 13.10 (saucy) are"\
77         "currently supported" >&2
78     exit 1
79   fi
80
81   if ! uname -m | egrep -q "i686|x86_64"; then
82     echo "Only x86 architectures are currently supported" >&2
83     exit
84   fi
85 fi
86
87 if [ "x$(id -u)" != x0 ] && [ 0 -eq "${do_quick_check-0}" ]; then
88   echo "Running as non-root user."
89   echo "You might have to enter your password one or more times for 'sudo'."
90   echo
91 fi
92
93 # Packages needed for chromeos only
94 chromeos_dev_list="libbluetooth-dev"
95
96 # Packages needed for development
97 dev_list="apache2.2-bin bison curl dpkg-dev elfutils devscripts fakeroot flex
98           fonts-thai-tlwg g++ git-core gperf language-pack-da language-pack-fr
99           language-pack-he language-pack-zh-hant libapache2-mod-php5
100           libasound2-dev libbrlapi-dev libbz2-dev libcairo2-dev libcap-dev
101           libcups2-dev libcurl4-gnutls-dev libdrm-dev libelf-dev libexif-dev
102           libgconf2-dev libgl1-mesa-dev libglib2.0-dev libglu1-mesa-dev
103           libgnome-keyring-dev libgtk2.0-dev libkrb5-dev libnspr4-dev
104           libnss3-dev libpam0g-dev libpci-dev libpulse-dev libsctp-dev
105           libspeechd-dev libsqlite3-dev libssl-dev libudev-dev libwww-perl
106           libxslt1-dev libxss-dev libxt-dev libxtst-dev mesa-common-dev openbox
107           patch perl php5-cgi pkg-config python python-cherrypy3 python-dev
108           python-psutil rpm ruby subversion ttf-dejavu-core ttf-indic-fonts
109           ttf-kochi-gothic ttf-kochi-mincho wdiff xfonts-mathml zip
110           $chromeos_dev_list"
111
112 # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
113 # NaCl binaries. These are always needed, regardless of whether or not we want
114 # the full 32-bit "cross-compile" support (--lib32).
115 if file /sbin/init | grep -q 'ELF 64-bit'; then
116   dev_list="${dev_list} libc6-i386 lib32gcc1 lib32stdc++6"
117 fi
118
119 # Run-time libraries required by chromeos only
120 chromeos_lib_list="libpulse0 libbz2-1.0"
121
122 # Full list of required run-time libraries
123 lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcap2 libcups2 libexpat1
124           libexif12 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0
125           libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0
126           libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6
127           libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6
128           libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1
129           libxtst6 zlib1g $chromeos_lib_list"
130
131 # Debugging symbols for all of the run-time libraries
132 dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libfontconfig1-dbg
133           libglib2.0-0-dbg libgtk2.0-0-dbg libpango1.0-0-dbg libpcre3-dbg
134           libpixman-1-0-dbg libsqlite3-0-dbg libx11-6-dbg libxau6-dbg
135           libxcb1-dbg libxcomposite1-dbg libxcursor1-dbg libxdamage1-dbg
136           libxdmcp6-dbg libxext6-dbg libxfixes3-dbg libxi6-dbg libxinerama1-dbg
137           libxrandr2-dbg libxrender1-dbg libxtst6-dbg zlib1g-dbg
138           libstdc++6-4.6-dbg"
139
140 # arm cross toolchain packages needed to build chrome on armhf
141 arm_list="libc6-armhf-cross libc6-dev-armhf-cross libgcc1-armhf-cross
142           libgomp1-armhf-cross linux-libc-dev-armhf-cross
143           libgcc1-dbg-armhf-cross libgomp1-dbg-armhf-cross
144           binutils-arm-linux-gnueabihf cpp-arm-linux-gnueabihf
145           gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
146           libmudflap0-dbg-armhf-cross"
147
148 # Old armel cross toolchain packages
149 armel_list="libc6-armel-cross libc6-dev-armel-cross libgcc1-armel-cross
150             libgomp1-armel-cross linux-libc-dev-armel-cross
151             libgcc1-dbg-armel-cross libgomp1-dbg-armel-cross
152             binutils-arm-linux-gnueabi cpp-arm-linux-gnueabi
153             gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
154             libmudflap0-dbg-armel-cross"
155
156 # TODO(sbc): remove armel once the armhf transition is complete
157 arm_list="$arm_list $armel_list"
158
159 # Packages to build standalone NaCl and all its toolchains.
160 nacl_list="g++-mingw-w64-i686 libtinfo-dev:i386"
161
162 # Some package names have changed over time
163 if package_exists ttf-mscorefonts-installer; then
164   dev_list="${dev_list} ttf-mscorefonts-installer"
165 else
166   dev_list="${dev_list} msttcorefonts"
167 fi
168 if package_exists libnspr4-dbg; then
169   dbg_list="${dbg_list} libnspr4-dbg libnss3-dbg"
170   lib_list="${lib_list} libnspr4 libnss3"
171 else
172   dbg_list="${dbg_list} libnspr4-0d-dbg libnss3-1d-dbg"
173   lib_list="${lib_list} libnspr4-0d libnss3-1d"
174 fi
175 if package_exists libjpeg-dev; then
176   dev_list="${dev_list} libjpeg-dev"
177 else
178   dev_list="${dev_list} libjpeg62-dev"
179 fi
180 if package_exists libudev1; then
181   dev_list="${dev_list} libudev1"
182 else
183   dev_list="${dev_list} libudev0"
184 fi
185 if package_exists libbrlapi0.6; then
186   dev_list="${dev_list} libbrlapi0.6"
187 else
188   dev_list="${dev_list} libbrlapi0.5"
189 fi
190
191
192 # Some packages are only needed if the distribution actually supports
193 # installing them.
194 if package_exists appmenu-gtk; then
195   lib_list="$lib_list appmenu-gtk"
196 fi
197
198 # Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
199 # accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
200 # been provided to yes_no(), the function also accepts RETURN as a user input.
201 # The parameter specifies the exit code that should be returned in that case.
202 # The function will echo the user's selection followed by a newline character.
203 # Users can abort the function by pressing CTRL-C. This will call "exit 1".
204 yes_no() {
205   if [ 0 -ne "${do_default-0}" ] ; then
206     [ $1 -eq 0 ] && echo "Y" || echo "N"
207     return $1
208   fi
209   local c
210   while :; do
211     c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
212          stty -echo iuclc -icanon 2>/dev/null
213          dd count=1 bs=1 2>/dev/null | od -An -tx1)"
214     case "$c" in
215       " 0a") if [ -n "$1" ]; then
216                [ $1 -eq 0 ] && echo "Y" || echo "N"
217                return $1
218              fi
219              ;;
220       " 79") echo "Y"
221              return 0
222              ;;
223       " 6e") echo "N"
224              return 1
225              ;;
226       "")    echo "Aborted" >&2
227              exit 1
228              ;;
229       *)     # The user pressed an unrecognized key. As we are not echoing
230              # any incorrect user input, alert the user by ringing the bell.
231              (tput bel) 2>/dev/null
232              ;;
233     esac
234   done
235 }
236
237 if test "$do_inst_syms" = "" && test 0 -eq ${do_quick_check-0}
238 then
239   echo "This script installs all tools and libraries needed to build Chromium."
240   echo ""
241   echo "For most of the libraries, it can also install debugging symbols, which"
242   echo "will allow you to debug code in the system libraries. Most developers"
243   echo "won't need these symbols."
244   echo -n "Do you want me to install them for you (y/N) "
245   if yes_no 1; then
246     do_inst_syms=1
247   fi
248 fi
249 if test "$do_inst_syms" = "1"; then
250   echo "Including debugging symbols."
251 else
252   echo "Skipping debugging symbols."
253   dbg_list=
254 fi
255
256 # When cross building for arm on 64-bit systems the host binaries
257 # that are part of v8 need to be compiled with -m32 which means
258 # that basic multilib support is needed.
259 if file /sbin/init | grep -q 'ELF 64-bit'; then
260   arm_list="$arm_list g++-multilib"
261 fi
262
263 if test "$do_inst_arm" = "1" ; then
264   echo "Including ARM cross toolchain."
265 else
266   echo "Skipping ARM cross toolchain."
267   arm_list=
268 fi
269
270 if test "$do_inst_nacl" = "1"; then
271   echo "Including standalone NaCl dependencies."
272 else
273   echo "Skipping standalone NaCl dependencies."
274   nacl_list=
275 fi
276
277 packages="$(
278   echo "${dev_list} ${lib_list} ${dbg_list} ${arm_list} ${nacl_list}" |
279   tr " " "\n" | sort -u | tr "\n" " "
280 )"
281
282 if [ 1 -eq "${do_quick_check-0}" ] ; then
283   failed_check="$(dpkg-query -W -f '${PackageSpec}:${Status}\n' \
284     ${packages} 2>&1 | grep -v "ok installed" || :)"
285   if [ -n "${failed_check}" ]; then
286     echo
287     nomatch="$(echo "${failed_check}" | \
288       sed -e "s/^No packages found matching \(.*\).$/\1/;t;d")"
289     missing="$(echo "${failed_check}" | \
290       sed -e "/^No packages found matching/d;s/^\(.*\):.*$/\1/")"
291     if [ "$nomatch" ]; then
292       # Distinguish between packages that actually aren't available to the
293       # system (i.e. not in any repo) and packages that just aren't known to
294       # dpkg (i.e. managed by apt).
295       unknown=""
296       for p in ${nomatch}; do
297         if apt-cache show ${p} > /dev/null 2>&1; then
298           missing="${p}\n${missing}"
299         else
300           unknown="${p}\n${unknown}"
301         fi
302       done
303       if [ -n "${unknown}" ]; then
304         echo "WARNING: The following packages are unknown to your system"
305         echo "(maybe missing a repo or need to 'sudo apt-get update'):"
306         echo -e "${unknown}" | sed -e "s/^/  /"
307       fi
308     fi
309     if [ -n "${missing}" ]; then
310       echo "WARNING: The following packages are not installed:"
311       echo -e "${missing}" | sed -e "s/^/  /"
312     fi
313     exit 1
314   fi
315   exit 0
316 fi
317
318 sudo apt-get update
319
320 # We initially run "apt-get" with the --reinstall option and parse its output.
321 # This way, we can find all the packages that need to be newly installed
322 # without accidentally promoting any packages from "auto" to "manual".
323 # We then re-run "apt-get" with just the list of missing packages.
324 echo "Finding missing packages..."
325 # Intentionally leaving $packages unquoted so it's more readable.
326 echo "Packages required: " $packages
327 echo
328 new_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
329 if new_list="$(yes n | LANGUAGE=en LANG=C $new_list_cmd)"; then
330   # We probably never hit this following line.
331   echo "No missing packages, and the packages are up-to-date."
332 elif [ $? -eq 1 ]; then
333   # We expect apt-get to have exit status of 1.
334   # This indicates that we cancelled the install with "yes n|".
335   new_list=$(echo "$new_list" |
336     sed -e '1,/The following NEW packages will be installed:/d;s/^  //;t;d')
337   new_list=$(echo "$new_list" | sed 's/ *$//')
338   if [ -z "$new_list" ] ; then
339     echo "No missing packages, and the packages are up-to-date."
340   else
341     echo "Installing missing packages: $new_list."
342     sudo apt-get install ${do_quietly-} ${new_list}
343   fi
344   echo
345 else
346   # An apt-get exit status of 100 indicates that a real error has occurred.
347
348   # I am intentionally leaving out the '"'s around new_list_cmd,
349   # as this makes it easier to cut and paste the output
350   echo "The following command failed: " ${new_list_cmd}
351   echo
352   echo "It produces the following output:"
353   yes n | $new_list_cmd || true
354   echo
355   echo "You will have to install the above packages yourself."
356   echo
357   exit 100
358 fi
359
360 # Install the Chrome OS default fonts. This must go after running
361 # apt-get, since install-chromeos-fonts depends on curl.
362 if test "$do_inst_chromeos_fonts" != "0"; then
363   echo
364   echo "Installing Chrome OS fonts."
365   dir=`echo $0 | sed -r -e 's/\/[^/]+$//'`
366   if ! sudo $dir/linux/install-chromeos-fonts.py; then
367     echo "ERROR: The installation of the Chrome OS default fonts failed."
368     if [ `stat -f -c %T $dir` == "nfs" ]; then
369       echo "The reason is that your repo is installed on a remote file system."
370     else
371       echo "This is expected if your repo is installed on a remote file system."
372     fi
373     echo "It is recommended to install your repo on a local file system."
374     echo "You can skip the installation of the Chrome OS default founts with"
375     echo "the command line option: --no-chromeos-fonts."
376     exit 1
377   fi
378 else
379   echo "Skipping installation of Chrome OS fonts."
380 fi
381
382 # Install 32bit backwards compatibility support for 64bit systems
383 if file /sbin/init | grep -q 'ELF 64-bit'; then
384   if test "$do_inst_lib32" != "1"
385   then
386     echo "NOTE: If you were expecting the option to install 32bit libs,"
387     echo "please run with the --lib32 flag."
388     echo
389     echo "Installation complete."
390     exit 0
391   else
392     # This conditional statement has been added to deprecate and eventually
393     # remove support for 32bit libraries on 64bit systems. But for the time
394     # being, we still have to support a few legacy systems (e.g. bots), where
395     # this feature is needed.
396     # We only even give the user the option to install these libraries, if
397     # they explicitly requested doing so by setting the --lib32 command line
398     # flag.
399     # And even then, we interactively ask them one more time whether they are
400     # absolutely sure.
401     # In order for that to work, we must reset the ${do_inst_lib32} variable.
402     # There are other ways to achieve the same goal. But resetting the
403     # variable is the best way to document the intended behavior -- and to
404     # allow us to gradually deprecate and then remove the obsolete code.
405     if test "${do_default-0}" -ne 1; then
406       do_inst_lib32=
407     fi
408   fi
409
410   echo "WARNING"
411   echo
412   echo "We no longer recommend that you use this script to install"
413   echo "32bit libraries on a 64bit system. Instead, consider using the"
414   echo "install-chroot.sh script to help you set up a 32bit environment"
415   echo "for building and testing 32bit versions of Chrome."
416   echo
417   echo "The code for installing 32bit libraries on a 64bit system is"
418   echo "unmaintained and might not work with modern versions of Ubuntu"
419   echo "or Debian."
420   if test "$do_inst_lib32" != "" ; then
421     echo
422     echo -n "Are you sure you want to proceed (y/N) "
423     if yes_no 1; then
424       do_inst_lib32=1
425     fi
426   fi
427   if test "$do_inst_lib32" != "1"
428   then
429     exit 0
430   fi
431
432   # Standard 32bit compatibility libraries
433   echo "First, installing the limited existing 32-bit support..."
434   cmp_list="ia32-libs lib32asound2-dev lib32stdc++6 lib32z1
435             lib32z1-dev libc6-dev-i386 libc6-i386 g++-multilib"
436   if [ -n "`apt-cache search lib32readline-gplv2-dev 2>/dev/null`" ]; then
437     cmp_list="${cmp_list} lib32readline-gplv2-dev"
438   else
439     cmp_list="${cmp_list} lib32readline5-dev"
440   fi
441   sudo apt-get install ${do_quietly-} $cmp_list
442
443   tmp=/tmp/install-32bit.$$
444   trap 'rm -rf "${tmp}"' EXIT INT TERM QUIT
445   mkdir -p "${tmp}/apt/lists/partial" "${tmp}/cache" "${tmp}/partial"
446   touch "${tmp}/status"
447
448   [ -r /etc/apt/apt.conf ] && cp /etc/apt/apt.conf "${tmp}/apt/"
449   cat >>"${tmp}/apt/apt.conf" <<EOF
450         Apt::Architecture "i386";
451         Dir::Cache "${tmp}/cache";
452         Dir::Cache::Archives "${tmp}/";
453         Dir::State::Lists "${tmp}/apt/lists/";
454         Dir::State::status "${tmp}/status";
455 EOF
456
457   # Download 32bit packages
458   echo "Computing list of available 32bit packages..."
459   sudo apt-get -c="${tmp}/apt/apt.conf" update
460
461   echo "Downloading available 32bit packages..."
462   sudo apt-get -c="${tmp}/apt/apt.conf" \
463           --yes --download-only --force-yes --reinstall install \
464           ${lib_list} ${dbg_list}
465
466   # Open packages, remove everything that is not a library, move the
467   # library to a lib32 directory and package everything as a *.deb file.
468   echo "Repackaging and installing 32bit packages for use on 64bit systems..."
469   for i in ${lib_list} ${dbg_list}; do
470     orig="$(echo "${tmp}/${i}"_*_i386.deb)"
471     compat="$(echo "${orig}" |
472               sed -e 's,\(_[^_/]*_\)i386\(.deb\),-ia32\1amd64\2,')"
473     rm -rf "${tmp}/staging"
474     msg="$(fakeroot -u sh -exc '
475       # Unpack 32bit Debian archive
476       umask 022
477       mkdir -p "'"${tmp}"'/staging/dpkg/DEBIAN"
478       cd "'"${tmp}"'/staging"
479       ar x "'${orig}'"
480       tar Cfx dpkg data.tar*
481       tar zCfx dpkg/DEBIAN control.tar.gz
482
483       # Create a posix extended regular expression fragment that will
484       # recognize the includes which have changed. Should be rare,
485       # will almost always be empty.
486       includes=`sed -n -e "s/^[0-9a-z]*  //g" \
487                        -e "\,usr/include/,p" dpkg/DEBIAN/md5sums |
488                   xargs -n 1 -I FILE /bin/sh -c \
489                     "cmp -s dpkg/FILE /FILE || echo FILE" |
490                   tr "\n" "|" |
491                   sed -e "s,|$,,"`
492
493       # If empty, set it to not match anything.
494       test -z "$includes" && includes="^//"
495
496       # Turn the conflicts into an extended RE for removal from the
497       # Provides line.
498       conflicts=`sed -n -e "/Conflicts/s/Conflicts: *//;T;s/, */|/g;p" \
499                    dpkg/DEBIAN/control`
500
501       # Rename package, change architecture, remove conflicts and dependencies
502       sed -r -i                              \
503           -e "/Package/s/$/-ia32/"           \
504           -e "/Architecture/s/:.*$/: amd64/" \
505           -e "/Depends/s/:.*/: ia32-libs/"   \
506           -e "/Provides/s/($conflicts)(, *)?//g;T1;s/, *$//;:1"   \
507           -e "/Recommends/d"                 \
508           -e "/Conflicts/d"                  \
509         dpkg/DEBIAN/control
510
511       # Only keep files that live in "lib" directories or the includes
512       # that have changed.
513       sed -r -i                                                               \
514           -e "/\/lib64\//d" -e "/\/.?bin\//d"                                 \
515           -e "\,$includes,s,[ /]include/,&32/,g;s,include/32/,include32/,g"   \
516           -e "s, lib/, lib32/,g"                                              \
517           -e "s,/lib/,/lib32/,g"                                              \
518           -e "t;d"                                                            \
519           -e "\,^/usr/lib32/debug\(.*/lib32\),s,^/usr/lib32/debug,/usr/lib/debug," \
520         dpkg/DEBIAN/md5sums
521
522       # Re-run ldconfig after installation/removal
523       { echo "#!/bin/sh"; echo "[ \"x\$1\" = xconfigure ]&&ldconfig||:"; } \
524         >dpkg/DEBIAN/postinst
525       { echo "#!/bin/sh"; echo "[ \"x\$1\" = xremove ]&&ldconfig||:"; } \
526         >dpkg/DEBIAN/postrm
527       chmod 755 dpkg/DEBIAN/postinst dpkg/DEBIAN/postrm
528
529       # Remove any other control files
530       find dpkg/DEBIAN -mindepth 1 "(" -name control -o -name md5sums -o \
531                        -name postinst -o -name postrm ")" -o -print |
532         xargs -r rm -rf
533
534       # Remove any files/dirs that live outside of "lib" directories,
535       # or are not in our list of changed includes.
536       find dpkg -mindepth 1 -regextype posix-extended \
537           "(" -name DEBIAN -o -name lib -o -regex "dpkg/($includes)" ")" \
538           -prune -o -print | tac |
539         xargs -r -n 1 sh -c "rm \$0 2>/dev/null || rmdir \$0 2>/dev/null || : "
540       find dpkg -name lib64 -o -name bin -o -name "?bin" |
541         tac | xargs -r rm -rf
542
543       # Remove any symbolic links that were broken by the above steps.
544       find -L dpkg -type l -print | tac | xargs -r rm -rf
545
546       # Rename lib to lib32, but keep debug symbols in /usr/lib/debug/usr/lib32
547       # That is where gdb looks for them.
548       find dpkg -type d -o -path "*/lib/*" -print |
549         xargs -r -n 1 sh -c "
550           i=\$(echo \"\${0}\" |
551                sed -e s,/lib/,/lib32/,g \
552                -e s,/usr/lib32/debug\\\\\(.*/lib32\\\\\),/usr/lib/debug\\\\1,);
553           mkdir -p \"\${i%/*}\";
554           mv \"\${0}\" \"\${i}\""
555
556       # Rename include to include32.
557       [ -d "dpkg/usr/include" ] && mv "dpkg/usr/include" "dpkg/usr/include32"
558
559       # Prune any empty directories
560       find dpkg -type d | tac | xargs -r -n 1 rmdir 2>/dev/null || :
561
562       # Create our own Debian package
563       cd ..
564       dpkg --build staging/dpkg .' 2>&1)"
565     compat="$(eval echo $(echo "${compat}" |
566                           sed -e 's,_[^_/]*_amd64.deb,_*_amd64.deb,'))"
567     [ -r "${compat}" ] || {
568       echo "${msg}" >&2
569       echo "Failed to build new Debian archive!" >&2
570       exit 1
571     }
572
573     msg="$(sudo dpkg -i "${compat}" 2>&1)" && {
574         echo "Installed ${compat##*/}"
575       } || {
576         # echo "${msg}" >&2
577         echo "Skipped ${compat##*/}"
578       }
579   done
580
581   # Add symbolic links for developing 32bit code
582   echo "Adding missing symbolic links, enabling 32bit code development..."
583   for i in $(find /lib32 /usr/lib32 -maxdepth 1 -name \*.so.\* |
584              sed -e 's/[.]so[.][0-9].*/.so/' |
585              sort -u); do
586     [ "x${i##*/}" = "xld-linux.so" ] && continue
587     [ -r "$i" ] && continue
588     j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' |
589          sort -n | tail -n 1)"
590     [ -r "$i.$j" ] || continue
591     sudo ln -s "${i##*/}.$j" "$i"
592   done
593 fi