4 myarch
=$
(dpkg-architecture
-qDEB_HOST_ARCH
)
5 while getopts "a:" opt
; do
11 shift $
(( $OPTIND - 1 ))
12 case $# in 0) badp
=t
;; esac
16 usage: $0 [-a MYARCH] DIST ...
22 case $arg in *-*) echo >&2 "$0: bad arch name \`$arg'"; exit 1 ;; esac
24 mymulti
=$
(dpkg-architecture
-a
$myarch -qDEB_HOST_MULTIARCH
)
26 cross_archs
="arm-linux-gnueabi arm-linux-gnueabihf aarch64-linux-gnu"
28 apt bash ccache coreutils dash eatmydata fakeroot findutils
29 gnupg gpgv gzip m4 make mawk qemu-user-static sed tar xz-utils"
30 for a
in $cross_archs; do
31 for i
in gcc g
++ binutils
; do
32 cross_pkgs
="$cross_pkgs $i-$a"
35 cross_pkgs
=$
(echo $cross_pkgs)
38 /usr/bin/ apt apt-cache apt-config apt-get apt-key apt-mark
39 /usr/lib/apt/ methods/ solvers/
41 /bin/ cat chgrp chown cp date dd df dir echo false ln ls mkdir
42 mknod mktemp mv pwd readlink rm rmdir sleep stty sync touch
44 /usr/bin/ [ arch b2sum base32 base64 basename chcon cksum comm
45 csplit cut dircolors dirname du env expand expr factor fmt
46 fold groups head hostid id install join link logname md5sum
47 mkfifo nice nl nohup nproc numfmt od paste pathchk pinky pr
48 printenv printf ptx realpath runcon seq sha1sum sha224sum
49 sha256sum sha384sum sha512sum shred shuf sort split stat
50 stdbuf sum tac tail tee test timeout tr truncate tsort tty
51 unexpand uniq unlink users wc who whoami yes
52 /usr/lib/$mymulti/ coreutils/
54 /lib/$mymulti/ libnss_*.so.*
56 /usr/bin/ gpg gpgv gpgconf kbxutil watchgnupg
58 /usr/bin/ qemu-*-static
60 /bin/ bash dash gzip sed tar
61 /usr/bin/ ccache find m4 make mawk xargs xz
62 /usr/lib/$mymulti/ libeatmydata.so* libfakeroot/
64 /etc/ld.so.conf.d/ $mymulti.conf fakeroot*.conf"
66 for a
in $cross_archs; do
69 /usr/bin/$a- addr2line ar as c++filt dwp elfedit gprof ld ld.*
70 nm objcopy objdump ranlib readelf size strings strip
72 /usr/bin/$a- cpp gcc g++ gcov gcov-dump gcov-tool gprof
73 gcc-ar gcc-nm gcc-ranlib
74 /usr/lib/gcc-cross/$a/ ..."
76 wanted
=$
(echo $wanted)
79 i386
) elfsig
=7f454c46010101??
0000000000000000????
0300 ;;
80 amd64
) elfsig
=7f454c46020101??
0000000000000000????
3e00
;;
81 *) echo >&2 "$0: unsupported local arch \`$myarch'"; exit 1 ;;
93 case $d in */*) d
=${d%/*} ;; *) d
= ;; esac
96 case $p in */*) f
=${p%%/*} p
=${p#*/} ;; *) f
=$p p
="" ;; esac
100 if ! [ -e
"$crossnew$d" ] && ! [ -L
"$crossnew$d" ]; then
101 if [ -d
"$root/$d" ] && ! [ -L
"$root/$d" ]; then
104 echo >&2 "$0: copy /$d to satisfy symlinks"
105 rsync
-aHR
$root/.
/$d $crossnew
108 if [ -L
"$crossnew$d" ]; then
109 t
=$
(readlink
"$crossnew$d")
110 case $t in /*) t
=${t#/} d
= ;; esac
111 case $d in */*) d
=${d%/*} ;; *) d
= ;; esac
119 echo >&2 "$0: create $d snapshot"
120 sess
=$
(schroot
-bc$d-$myarch 3>&-)
121 schroot
-uroot
-rc
$sess -- eatmydata sh
-ec
"
124 apt-get -y install $cross_pkgs"
125 crossdir
=/usr
/local.schroot
/cross
/$d-$myarch/
126 crossold
=${crossdir%/}.old
/ crossnew
=${crossdir%/}.new
/
127 rm -rf
$crossnew; mkdir
-p
$crossnew
129 root
=/schroot
/$sess/fs
; dir
=/
136 case $i in ...
) f
=$dir ;; *) f
=$dir$i ;; esac
137 echo >&2 "$0: copy $f"
138 rsync
-aHR
$root/.
$f $crossnew
143 find $crossnew -xtype l
-print |
while read i
; do
144 chase_link
${i#$crossnew}
147 find $crossnew -type f
-print |
while read i
; do
148 sig
=$
(head -c20
"$i" | bincode
-e
-m0
-flowerc hex
)
149 case $sig in $elfsig) echo "$i" ;; esac
150 done >$root/private
/QUEUE.
in
153 cp $root/private
/QUEUE.
in /tmp
/mdw
/queue.
in.
$counter
155 while [ -s
$root/private
/QUEUE.
in ]; do
156 schroot
-uroot
-rc
$sess -- eatmydata sh
-ec
'
159 echo >&2 "$prog: scanning binary $i"
160 ldd "$i" | while read a b c d; do
162 not:a:dynamic:executable) ;;
163 statically:linked::) ;;
165 *:=\>:/*) echo "$c" ;;
167 *) echo >&2 "$i: unable to find $a"; exit 2 ;;
170 done </private/QUEUE.in >/private/QUEUE.out' - "$0"
172 cp $root/private
/QUEUE.out
/tmp
/mdw
/queue.out.
$counter
173 counter
=$
(( $counter + 1 ))
176 if [ -e
"$crossnew$i" ] ||
[ -L
"$crossnew$i" ]
178 if [ -d
"$root$i" ]; then continue; fi
179 echo >&2 "$0: copy $i"
180 rsync
-aHR
$root/.
$i $crossnew >&3
182 sig
=$
(head -c20
$crossnew$i | bincode
-e
-m0
-flowerc hex
)
183 case $sig in $elfsig) echo "$i" ;; esac
184 done <$root/private
/QUEUE.out
>$root/private
/QUEUE.
in
186 cp $root/private
/QUEUE.
in /tmp
/mdw
/queue.
in.
$counter
190 echo >&2 "$0: establish TOOLCHAIN"
191 for a
in $cross_archs; do
192 tooldir
=$crossnew/TOOLCHAIN
/$a
194 for i
in $crossnew/usr
/bin
/$a-*; do
195 t
=${i#$crossnew/usr/bin/}
197 ln -s
$t $tooldir/${t#$a-}
200 mkdir
$crossnew/TOOLCHAIN
/lib
201 ln -s ..
/..
/usr
/lib
/gcc-cross
$crossnew/TOOLCHAIN
/lib
/
203 echo >&2 "$0: establish QEMU"
205 mv $crossnew/usr
/bin
/qemu-
*-static
$crossnew/QEMU
/
207 echo >&2 "$0: remove snapshot"
208 schroot
-ec
$sess 3>&-
209 if [ -d
$crossdir ]; then mv $crossdir $crossold; fi
210 mv $crossnew $crossdir; rm -rf
$crossold
211 echo >&2 "$0: committed $crossdir"