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 |