| 1 | #! /bin/sh -e |
| 2 | |
| 3 | badp=nil |
| 4 | myarch=$(dpkg-architecture -qDEB_HOST_ARCH); unset myqarch |
| 5 | while getopts "a:q:" opt; do |
| 6 | case $opt in |
| 7 | a) myarch=$OPTARG ;; |
| 8 | q) myqarch=$OPTARG ;; |
| 9 | *) badp=t ;; |
| 10 | esac |
| 11 | done |
| 12 | shift $(( $OPTIND - 1 )) |
| 13 | case $# in 0) badp=t ;; esac |
| 14 | case $badp in |
| 15 | t) |
| 16 | cat >&2 <<EOF |
| 17 | usage: $0 [-a MYARCH] [-q MYQARCH] DIST-ARCH ... |
| 18 | EOF |
| 19 | exit 1 |
| 20 | ;; |
| 21 | esac |
| 22 | case ${myqarch+t} in t) ;; *) myqarch=$myarch ;; esac |
| 23 | mymulti=$(dpkg-architecture -a$myarch -qDEB_HOST_MULTIARCH) |
| 24 | |
| 25 | for arg in "$@"; do |
| 26 | d=${arg%-*} a=${arg#*-} |
| 27 | |
| 28 | if ! [ -d /usr/local.schroot/cross/$d-$myarch ]; then |
| 29 | echo 2>&1 "$0: no tree for \`$d-$myarch'"; exit 1 |
| 30 | fi |
| 31 | |
| 32 | gnuarch=$(dpkg-architecture -A$a -qDEB_TARGET_GNU_TYPE) |
| 33 | |
| 34 | case $a in |
| 35 | armel | armhf) qarch=arm ;; |
| 36 | arm64) qarch=aarch64 ;; |
| 37 | amd64) qarch=x86_64 ;; |
| 38 | i386) qarch=i386 ;; |
| 39 | *) echo >&2 "$0: no qemu arch for $a"; exit 1 ;; |
| 40 | esac |
| 41 | |
| 42 | sess=$(schroot -bcsource:$d-$a) |
| 43 | root=/schroot/$sess/fs |
| 44 | qemudir=/usr/local.schroot/cross/$d-$myqarch/QEMU |
| 45 | crossdir=/usr/local.schroot/cross/$d-$myarch |
| 46 | |
| 47 | schroot -uroot -rc$sess -- sh -ec ' |
| 48 | if ! mountpoint -q /mnt; then |
| 49 | mount -ttmpfs -omode=700,uid=0,gid=0 private /mnt |
| 50 | fi' |
| 51 | |
| 52 | { echo $qemudir/qemu-$qarch-static |
| 53 | echo $crossdir/lib/$mymulti |
| 54 | echo $crossdir/usr/lib/$mymulti |
| 55 | echo $crossdir/usr/lib/gcc-cross |
| 56 | find $crossdir $crossdir/TOOLCHAIN/$gnuarch \ |
| 57 | \( \( -path "*/QEMU" -o -path "*/TOOLCHAIN" -o \ |
| 58 | -path "*/lib/$mymulti" -o \ |
| 59 | -path "*/lib/gcc-cross" \) -prune \) -o \ |
| 60 | \( ! -type d -print \) |
| 61 | } | while read t; do |
| 62 | case $t in |
| 63 | $qemudir/*) |
| 64 | s=/usr/bin/${t#$qemudir/} ;; |
| 65 | $crossdir/TOOLCHAIN/$gnuarch/*) |
| 66 | s=/usr/bin/${t#$crossdir/TOOLCHAIN/$gnuarch/} ;; |
| 67 | *) |
| 68 | s=${t#$crossdir} ;; |
| 69 | esac |
| 70 | if [ -L $t ]; then t=$(readlink $t); fi |
| 71 | if [ -d $t ]; then act=LINK; else act=DIVERT; fi |
| 72 | echo $act $s $t |
| 73 | done >$root/mnt/ALL.want |
| 74 | sed -n '/^DIVERT \(.*\) .*$/s//\1/p' $root/mnt/ALL.want | \ |
| 75 | sort >$root/mnt/DIVERT.want |
| 76 | sed -n '/^\(DIVERT\|LINK\) /s///p' $root/mnt/ALL.want | \ |
| 77 | sort >$root/mnt/LINK.want |
| 78 | |
| 79 | schroot -uroot -rc$sess -- sh -ec ' |
| 80 | dpkg-divert --list | |
| 81 | sed -n "/^diversion of \(.*\) to .* by install-cross-tools\$/s//\1/p" | \ |
| 82 | sort >/mnt/DIVERT.have |
| 83 | { find / -xdev -lname "/usr/local.schroot/cross/*" -printf "%p %l\n" |
| 84 | while read s _; do |
| 85 | if ! [ -L "$s" ]; then continue; fi |
| 86 | t=$(readlink $s) |
| 87 | case $t in /usr/local.schroot/cross/*) continue ;; esac |
| 88 | echo "$s $t" |
| 89 | done </mnt/LINK.want |
| 90 | } | sort >/mnt/LINK.have' |
| 91 | |
| 92 | schroot -uroot -rc$sess -- sh -ec ' |
| 93 | a=$1 |
| 94 | |
| 95 | if dpkg-divert >/dev/null 2>&1 --no-rename --help |
| 96 | then no_rename=--no-rename |
| 97 | else no_rename= |
| 98 | fi |
| 99 | |
| 100 | comm -13 /mnt/DIVERT.have /mnt/DIVERT.want | while read i; do |
| 101 | dpkg-divert --package "install-cross-tools" $no_rename \ |
| 102 | --divert "$i.$a" --add "$i" |
| 103 | done' - $a |
| 104 | |
| 105 | while read i; do |
| 106 | if [ -e $root$i ] && ! [ -e $root$i.$a ]; then |
| 107 | if [ -L $root$i ]; then |
| 108 | t=$(readlink $root$i) |
| 109 | case $t in |
| 110 | $crossdir/* | qemudir/* | /usr/local.schroot/qemu/*) continue ;; |
| 111 | esac |
| 112 | if [ -L $crossdir$i ]; then |
| 113 | u=$(readlink $crossdir$i) |
| 114 | case $t in "$u") continue ;; esac |
| 115 | fi |
| 116 | fi |
| 117 | echo >&2 "$0: preserve old $i" |
| 118 | ln $root$i $root$i.$a |
| 119 | fi |
| 120 | done <$root/mnt/DIVERT.want |
| 121 | |
| 122 | join -j1 -a1 -a2 -e- -o"0 1.2 2.2" \ |
| 123 | $root/mnt/LINK.have $root/mnt/LINK.want | |
| 124 | while read s t0 t1; do |
| 125 | case $t1 in |
| 126 | "$t0") |
| 127 | continue |
| 128 | ;; |
| 129 | -) |
| 130 | echo >&2 "$0: remove obsolete link $s -> $t0" |
| 131 | rm -f $root$s |
| 132 | ;; |
| 133 | *) |
| 134 | case $s in */*) mkdir -p $root${s%/*} ;; esac |
| 135 | rm -f $root$s.new |
| 136 | ln -s $t1 $root$s.new |
| 137 | echo >&2 "$0: link $s -> $t1" |
| 138 | mv -T $root$s.new $root$s |
| 139 | ;; |
| 140 | esac |
| 141 | done |
| 142 | |
| 143 | schroot -uroot -rc$sess -- sh -ec ' |
| 144 | a=$1 |
| 145 | comm -23 /mnt/DIVERT.have /mnt/DIVERT.want | while read i; do |
| 146 | dpkg-divert --package "install-cross-tools" --rename \ |
| 147 | --divert "$i.$a" --remove "$i" |
| 148 | done' - $a |
| 149 | |
| 150 | schroot -ec$sess |
| 151 | done |