Commit | Line | Data |
---|---|---|
fd0f20e1 MW |
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 |