chiark / gitweb /
Kill the old chroot-maintenance tools.
[distorted-chroot] / mess / maint / install-cross-tools
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