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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
#!/bin/bash
#
# Copyright © 2016 Canonical Ltd.
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License version 3,
# as published by the Free Software Foundation.
#
# 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Taken from the Mir Project (https://launchpad.net/mir)
set -e
name=${0}
usage() {
echo "Usage: ${name} [options] mychroot-dir"
echo "options:"
echo " -a arch Select architecture, i.e. armhf, arm64, ppc... Default is armhf"
echo " -d dist Select distribution, i.e. vivid, wily. Default is vivid"
echo " -r rep Select an additional repository for bootstrap. Default is none"
echo
echo "please supply at least a directory to create partial chroot in. (eg, ./setup-partial-armhf-chroot.sh mychroot-dir)"
}
# Default to vivid as we don't seem to have any working wily devices right now.
# Also Jenkins expects this script to default to vivid (TODO: update CI?)
arch=armhf
dist=vivid
sourceid=0
repositories=
sources=
while getopts a:d:r:h opt; do
case $opt in
a)
arch=$OPTARG
;;
d)
dist=$OPTARG
;;
r)
repositories="$repositories $OPTARG"
((++sourceid))
sources="$sources source$sourceid"
;;
:)
echo "Option -$OPTARG requires an argument"
usage
exit 1
;;
h)
usage
exit 0
;;
\?)
echo "Invalid option: -$OPTARG"
usage
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -z ${1} ]; then
usage
exit 1
fi
directory=${1}
echo "creating phablet-compatible $arch partial chroot for anbox compilation in directory ${directory}"
if [ ! -d ${directory} ]; then
mkdir -p ${directory}
fi
DEBCONTROL=$(pwd)/../debian/control
pushd ${directory} > /dev/null
# Empty dpkg status file, so that ALL dependencies are listed with dpkg-checkbuilddeps
echo "" > status
# Manual error code checking is needed for dpkg-checkbuilddeps
set +e
# Parse dependencies from debian/control
# dpkg-checkbuilddeps returns non-zero when dependencies are not met and the list is sent to stderr
builddeps=$(dpkg-checkbuilddeps -a ${arch} --admindir=. ${DEBCONTROL} 2>&1 )
if [ $? -eq 0 ] ; then
exit 0
fi
echo "${builddeps}"
# now turn exit on error option
set -e
# Sanitize dependencies list for submission to multistrap
# build-essential is not needed as we are cross-compiling
builddeps=$(echo ${builddeps} | sed -e 's/dpkg-checkbuilddeps://g' \
-e 's/error://g' \
-e 's/Unmet build dependencies://g' \
-e 's/build-essential:native//g')
builddeps=$(echo ${builddeps} | sed 's/([^)]*)//g')
builddeps=$(echo ${builddeps} | sed -e 's/abi-compliance-checker//g')
builddeps=$(echo ${builddeps} | sed -e 's/multistrap//g')
case ${arch} in
amd64 | i386 )
source_url=http://archive.ubuntu.com/ubuntu
;;
* )
source_url=http://ports.ubuntu.com/ubuntu-ports
;;
esac
echo "[General]
arch=${arch}
directory=${directory}
unpack=false
noauth=true
bootstrap=Ubuntu UbuntuUpdates UbuntuSecurity ${sources}
[Ubuntu]
packages=${builddeps}
source=${source_url}
suite=${dist}
components=main universe
[UbuntuUpdates]
packages=${builddeps}
source=${source_url}
suite=${dist}-updates
components=main universe
[UbuntuSecurity]
packages=${builddeps}
source=${source_url}
suite=${dist}-security
components=main universe
" > mstrap.conf
sourceid=0
for x in ${repositories};
do
((++sourceid))
echo "[source${sourceid}]
source=${x}
suite=${dist}
" >> mstrap.conf
done
multistrap -f mstrap.conf
rm -f var/cache/apt/archives/lock
# Remove libc libraries that confuse the cross-compiler
rm -f var/cache/apt/archives/libc-dev*.deb
rm -f var/cache/apt/archives/libc6*.deb
for deb in var/cache/apt/archives/* ; do
if [ ! -d ${deb} ] ; then
echo "unpacking: ${deb}"
dpkg -x ${deb} .
fi
done
# Fix up symlinks which asssumed the usual root path
for broken_symlink in $(find . -name \*.so -type l -xtype l) ; do
ln -sf $(pwd)$(readlink ${broken_symlink}) ${broken_symlink}
done
popd > /dev/null
|