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