slitaz-arm annotate sat @ rev 26

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