slitaz-arm view sat @ rev 36

Tiny edits
author Paul Issott <paul@slitaz.org>
date Fri Mar 07 19:13:20 2014 +0000 (2014-03-07)
parents b38c9a3fca9a
children 7c5d5748623d
line source
1 #!/bin/sh
2 #
3 # Sat - SliTaz ARM Tool
4 #
5 # Copyright (C) 2012-2014 SliTaz ARM - BSD License
6 # Author: Christophe Lincoln <pankso@slitaz.org>
7 #
8 . /lib/libtaz.sh
9 #. /usr/lib/slitaz/libpkg.sh
10 . /etc/slitaz/slitaz.conf
12 # Internal variables: libtaz.sh set: --work= --init=
13 [ "$work" ] || work="$(pwd)"
14 [ "$init" ] || init="gz"
15 initramfs="slitaz-arm.$init"
16 packages="$work/packages"
17 distro="$work/distro"
18 flavors="$work/flavors"
19 rootfs="$distro/rootfs"
20 data="$distro/data"
22 # http://mirror.slitaz.org/packages/cooking/arm/
23 mirror="http://cook.slitaz.org/cross/arm/packages/"
25 #
26 # Functions
27 #
29 # Help and usage
30 usage() {
31 cat << EOT
33 $(boldify "Usage:") $(basename $0) [command|--options]
35 $(boldify "Commands:")
36 gen Generate a distro cpio/gzip initramfs
37 flavors List and give info about flavors
38 ckpkgs Distro packages dependencies check
39 clean Clean up the work directory
40 vdisk Create a virtual disk to be used by Qemu
41 emu Emulate the distro with qemu-system-arm
42 mirror Download or sync the SliTaz ARM mirror
44 $(boldify "Options:")
45 --spk Clean or include Spk package manager in the distro
46 --kmap Include the system keymap config in the distro
47 --noinit Don't create the compressed initramfs
48 --work= Path to work dir with packages and rootfs
49 --size= Specify optional vdisk size (default 20Mb)
50 --init= Specify the initramfs compression: gz bz2 xz
51 --flavor= Generate specific SliTaz ARM flavor
52 --append= SliTaz and Kernel bootime arguments for Qemu
54 EOT
55 }
57 # --> use libpkg.sh when released (function is shared with spk)
58 # Check mirror ID: return 1 if no changes or mirror unreachable
59 check_mirror_id() {
60 [ "$forced" ] && rm -f ID
61 [ -f "ID" ] || echo $$ > ID
62 mv ID ID.bak
63 if busybox wget -qs ${mirror%/}/ID 2>/dev/null; then
64 busybox wget -q ${mirror%/}/ID
65 else
66 gettext "Mirror is unreachable"; newline
67 return 1
68 fi
69 if [ "$(cat ID)" == "$(cat ID.bak)" ]; then
70 gettext "Mirror is up-to-date"; newline
71 return 1
72 fi
73 }
75 #
76 # Commands
77 #
79 case "$1" in
80 gen)
81 time=$(date +%s)
82 check_root
83 newline && boldify "Generating SliTaz ARM distro"
84 separator
85 rm -rf $distro && mkdir -p ${rootfs} ${data}
87 # Get --flavor= packages lists
88 if [ "$flavor" ]; then
89 echo -n "Getting $flavor packages.list..."
90 cp -f $flavors/$flavor/packages.list ${data} 2>/dev/null &&
91 cp -f $flavors/$flavor/flavor.conf ${data} 2>/dev/null
92 status
93 fi
95 # Packages
96 rm -f ${data}/packages.full
97 if [ -f "${data}/packages.list" ]; then
98 for pkg in $(cat ${data}/packages.list)
99 do
100 IFS="|"
101 grep "^$pkg |" $work/mirror/packages.desc | while read pkg version desc
102 do
103 echo ${pkg}-${version}-arm.tazpkg | sed s'/ //'g \
104 >> ${data}/packages.full
105 done
106 unset IFS
107 done
108 cd ${work}/mirror
109 else
110 if [ ! -d "$packages" ]; then
111 echo "Missing distro/packages.list or packages/ directory"
112 echo "" && exit 1
113 fi
114 echo -n "Using packages directory..."
115 cd $packages && ls -1 >${data}/packages.full
116 status
117 fi
119 # Deps install is not well handled by tazpkg/spk actually.
120 # So simply install all packages and don't resolve deps.
121 for pkg in $(cat ${data}/packages.full)
122 do
123 pkgdir=$(basename $pkg .tazpkg)
124 db=${rootfs}/var/lib/tazpkg
125 echo -n "Installing: $(basename $pkg)"
126 tazpkg extract $pkg >/dev/null
127 . $pkgdir/receipt
128 mkdir -p $db/installed/$PACKAGE
129 cp $pkgdir/receipt $pkgdir/files.list \
130 $db/installed/$PACKAGE
131 cp -a $pkgdir/fs/* $distro/rootfs && rm -rf $pkgdir
132 md5sum $(basename $pkg) >> $db/installed.md5
133 status
134 done
136 # Install spk if requested. Spk multiarch support must be tested
137 if [ "$spk" ]; then
138 hg=http://hg.slitaz.org
139 echo -n "Installing: spk ($hg)"
140 cd $work
141 [ -d "spk" ] || hg clone $hg/spk >/dev/null 2>/dev/null
142 cd $work/spk
143 [ "$noup" ] || hg pull -u >/dev/null
144 make DESTDIR=${rootfs} install >/dev/null
145 status
146 fi
148 # Move kernel outside the distro
149 if [ -d "$rootfs/boot" ]; then
150 mv -f ${rootfs}/boot/linux-* ${distro}/linux-arm
151 chmod -x ${distro}/linux-arm
152 else
153 # RPi uses a custom Kernel: --rpi
154 if [ ! "$rpi" ]; then
155 echo -n "Missing Kernel directory: rootfs/boot/"; false
156 status
157 fi
158 fi
160 # SLITAZ_ARCH
161 if [ -f "${rootfs}/etc/slitaz/slitaz.conf" ]; then
162 echo -n "Setting SliTaz arch to: arm"
163 sed -i s"/SLITAZ_ARCH=.*/SLITAZ_ARCH=\"arm\"/" \
164 ${rootfs}/etc/slitaz/slitaz.conf
165 status
166 else
167 echo -n "Missing distro: /etc/slitaz/slitaz.conf"; false
168 status && exit 1
169 fi
171 # Mirror
172 echo "$mirror" > ${rootfs}/var/lib/tazpkg/mirror
174 # /init & /run
175 cd ${rootfs}
176 rm init && ln -s /bin/busybox init
177 mkdir -p run
179 # Update modules.dep
180 if [ -f "var/lib/tazpkg/installed/linux/receipt" ]; then
181 . var/lib/tazpkg/installed/linux/receipt
182 depmod -b . ${VERSION}-slitaz
183 fi
185 # Custom rootfs: make sure all files belong to root
186 if [ -d "$work/rootfs" ]; then
187 size=$(du -sh $work/rootfs | awk '{print $1}')
188 echo -n "Copying custom ARM rootfs: $size"
189 tmp=$distro/tmp-$$
190 mkdir -p $tmp
191 cp -r $work/rootfs/* $tmp
192 chown -R root.root $tmp
193 cp -a $tmp/* ${rootfs} && rm -rf $tmp
194 status
195 fi
197 # Custom flavor rootfs
198 if [ -f "${data}/flavor.conf" ]; then
199 . ${data}/flavor.conf
200 fi
201 if [ -d "$flavors/${FLAVOR}/rootfs" ]; then
202 size=$(du -sh $flavors/${FLAVOR}/rootfs | awk '{print $1}')
203 echo -n "Copying ${FLAVOR} ARM rootfs: $size"
204 tmp=$distro/tmp-$$
205 mkdir -p $tmp
206 cp -r $flavors/${FLAVOR}/rootfs/* $tmp
207 chown -R root.root $tmp
208 cp -a $tmp/* ${rootfs} && rm -rf $tmp
209 status
210 fi
212 # --kmap
213 if [ "$kmap" ]; then
214 echo -n "Copying local: /etc/keymap.conf"
215 cp -f /etc/keymap.conf ${rootfs}/etc
216 status
217 fi
219 # Distro: /etc/slitaz/flavor.conf
220 if [ -f "${data}/flavor.conf" ]; then
221 echo -n "Including $FLAVOR: flavor.conf"
222 echo "BUILD_DATE=\"$(date '+%Y%m%d')\"" >> ${data}/flavor.conf
223 cp -f ${data}/flavor.conf ${rootfs}/etc/slitaz
224 status
225 fi
227 # Rootfs cpio: gzip xz --> /usr/lib/slitaz/liblive.sh ???
228 if [ ! "$noinit" ]; then
229 echo -n "Compressing initramfs: $initramfs"
230 case "$initramfs" in
231 *.bz2) find . | cpio -o -H newc | bzip2 > ../$initramfs ;;
232 *.gz) find . | cpio -o -H newc | gzip -9 > ../$initramfs ;;
233 *.xz) find . | cpio -o -H newc | xz -9 --format=lzma > ../$initramfs ;;
234 esac
235 status
236 fi
238 # Summary
239 separator && newline
240 boldify "SliTaz ARM distro summary"
241 separator
242 time=$(($(date +%s) - $time))
243 [ "$noinit" ] || \
244 initramfs_size="$(du -sh $distro/$initramfs | awk '{print $1}')"
245 rootfs_size="$(du -sh ${rootfs} | awk '{print $1}')"
246 pkgs_count="$(ls $db/installed | wc -l)"
247 [ "$FLAVOR" ] && echo "Flavor name : $FLAVOR"
248 echo "Build time : ${time}s"
249 [ "$noinit" ] || echo "Initramfs : $initramfs"
250 [ "$noinit" ] || echo "Initramfs size : $initramfs_size"
251 echo "Rootfs size : $rootfs_size"
252 echo "Packages : $pkgs_count"
253 separator && newline ;;
255 flavors)
256 newline
257 echo -n "$(boldify 'Flavor')" &&
258 echo -n "$(indent 12 $(boldify 'Packages'))"
259 indent 24 $(boldify 'Description')
260 separator
261 for flavor in $(ls $flavors)
262 do
263 . $flavors/$flavor/flavor.conf
264 pkgs=$(cat $flavors/$flavor/packages.list | wc -l)
265 echo -n "$flavor" &&
266 echo -n "$(indent 12 $pkgs)" && indent 24 "$SHORT_DESC"
267 unset SHORT_DESC
268 done
269 newline ;;
271 ckpkgs)
272 installed="${rootfs}/var/lib/tazpkg/installed"
273 SLITAZ_ARCH="arm"
274 count=0
275 if [ ! -d "$installed" ]; then
276 echo "Missing distro rootfs" && exit 1
277 fi
278 echo ""
279 echo -n "$(boldify 'Package name')"
280 indent 24 "$(boldify 'Missing dependencies')"
281 separator
282 for pkg in ${installed}/*
283 do
284 . $pkg/receipt
285 for dep in $DEPENDS
286 do
287 if [ ! -d "${installed}/$dep" ]; then
288 echo -n "$(colorize 34 $PACKAGE)" && indent 24 "$dep"
289 count=$(($count + 1))
290 fi
291 done
292 unset DEPENDS
293 done
294 if [ "$count" == 0 ]; then
295 echo "No missing dependencies"
296 fi
297 separator
298 echo -n "Installed packages: "; colorize 32 $(ls $installed | wc -l)
299 newline ;;
301 clean)
302 check_root
303 echo -n "Cleaning: distro"
304 rm -rf $distro && status
305 if [ "$spk" ]; then
306 echo -n "Cleaning: spk"
307 rm -rf $work/spk && status
308 fi ;;
310 vdisk)
311 # Lets use and HD in Qemu to store files|packages|whatever
312 vdisk="vdisk.img"
313 : ${size=20}
314 newline
315 echo "Creating virtual disk: $vdisk"
316 cd $work
317 dd if=/dev/zero of=$vdisk bs=1M count=$size
318 #mkfs.ext3 -q -T ext3 -L "SliTaz" -F $vdisk
319 # Partition
320 echo "Creating partition with: fdisk"
321 fdisk ${vdisk} >/dev/null << EOT
322 o
323 n
324 p
325 1
326 w
327 EOT
328 newline ;;
330 emu)
331 cd $work
332 [ -f "vdisk.img" ] && opts="-hda vdisk.img"
333 [ "$append" ] && append="-append ${append}"
334 qemu-system-arm -m 256 ${opts} \
335 -M versatilepb -cpu arm1176 \
336 -kernel ${distro}/linux-arm \
337 -initrd ${distro}/${initramfs} ${append} ;;
339 mirror)
340 #
341 # --> spk-mirror $mirror --sync --dest=/path ???
342 #
343 count=0
344 newline && boldify "Syncing SliTaz ARM mirror"
345 separator
346 mkdir -p $work/mirror && cd $work/mirror
348 echo -n "URL: " && colorize 34 "$mirror"
349 if ! check_mirror_id; then
350 newline && exit 0
351 fi
352 for list in packages.list packages.desc packages.md5; do
353 echo -n "Fetching: $list"
354 rm -f $list && wget -q ${mirror%/}/$list
355 status
356 done
357 echo -n "Checking packages $SUM..."
358 for pkg in $(cat $work/mirror/packages.list); do
359 pkg=${pkg}.tazpkg
360 if [ ! -f "$pkg" ]; then
361 count=$(($count + 1))
362 [ "$count" == 1 ] && newline
363 echo -n "Fetching: ${pkg}"
364 wget -q ${mirror%/}/$pkg
365 status
366 fi
367 pkgsum=$($CHECKSUM $pkg)
368 debug "$pkgsum"
369 [ "$pkgsum" ] || pkgsum=$$
370 mirsum=$(fgrep -h $pkgsum packages.$SUM)
371 debug "$mirsum"
372 if [ ! "$pkgsum" == "$mirsum" ]; then
373 count=$(($count + 1))
374 [ "$count" == 1 ] && newline
375 echo -n "Fetching: ${pkg}.tazpkg"
376 rm -f $pkg
377 wget -q ${mirror%/}/$pkg
378 status
379 fi
380 done
381 [ "$count" == 0 ] && status
382 separator && newline ;;
384 *) usage ;;
385 esac
386 exit 0