cookutils annotate cross @ rev 418
cross: better x86_64 support and create prebuilt toolchain
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Tue May 15 00:27:37 2012 +0200 (2012-05-15) |
parents | 0f2a3fcd0e24 |
children | 97a80eb3cf19 |
rev | line source |
---|---|
pankso@361 | 1 #!/bin/sh |
pankso@361 | 2 # |
pankso@361 | 3 # Cross - Help build a cross toolchain on SliTaz. |
pankso@361 | 4 # |
pankso@361 | 5 # Copyright 2012 (C) SliTaz GNU/Linux - BSD License |
pankso@361 | 6 # Author: Christophe Lincoln <pankso@slitaz.org> |
pankso@361 | 7 # |
pankso@361 | 8 . /lib/libtaz.sh |
pankso@370 | 9 |
pankso@370 | 10 [ -f "/etc/slitaz/cross.conf" ] && . /etc/slitaz/cross.conf |
pankso@370 | 11 [ -f "cross.conf" ] && . ./cross.conf |
pankso@361 | 12 |
pankso@374 | 13 # Handle --config=/path/to/cross.conf |
pankso@374 | 14 [ "$config" ] && . $config |
pankso@412 | 15 source=$WORK/source |
pankso@412 | 16 logdir=$WORK/log |
pankso@412 | 17 install=$WORK/install |
pankso@374 | 18 |
pankso@361 | 19 # Help and usage. |
pankso@361 | 20 usage() { |
pankso@361 | 21 cat << EOT |
pankso@361 | 22 |
pankso@361 | 23 Usage: $(basename $0) command --option |
pankso@361 | 24 |
pankso@361 | 25 Commands: |
pankso@361 | 26 howto Man alike and howto |
paul@382 | 27 info Display cross-tools info |
pankso@361 | 28 testsuite Execute a small testsuite |
pankso@361 | 29 check-env Check build host tools |
pankso@361 | 30 download Download necessary sources |
pankso@371 | 31 clean Clean-up build environment |
pankso@371 | 32 clean-tools Clean: $PREFIX |
pankso@361 | 33 show-log Show a compile log |
pankso@361 | 34 binutils Compile Binutils |
pankso@361 | 35 gcc-static Compile GCC static |
pankso@361 | 36 linux-headers Install Kernel headers |
pankso@361 | 37 glibc Compile GNU Glibc |
pankso@361 | 38 gcc-final Compile final GCC |
pankso@361 | 39 busybox Cross compile Busybox |
pankso@361 | 40 compile Compile everything at once |
pankso@361 | 41 |
pankso@361 | 42 EOT |
pankso@361 | 43 } |
pankso@361 | 44 |
pankso@361 | 45 # Make sure we have all directories. |
pankso@361 | 46 init_compile() { |
pankso@361 | 47 export LC_ALL=POSIX LANG=POSIX |
pankso@403 | 48 [ "$SYSROOT" ] || export PATH=$PATH:$PREFIX/bin |
pankso@400 | 49 export CROSS_COMPILE=${TARGET}- |
pankso@361 | 50 mkdir -p $source $logdir $install |
pankso@361 | 51 cd $source |
pankso@361 | 52 } |
pankso@361 | 53 |
pankso@361 | 54 # Get source if not yet in $SRC. |
pankso@361 | 55 download_src() { |
pankso@361 | 56 mkdir -p $SRC && cd $SRC |
pankso@361 | 57 [ -f "binutils-$BINUTILS_VERSION.tar.bz2" ] || wget $BINUTILS_WGET |
pankso@361 | 58 [ -f "linux-$LINUX_VERSION.tar.bz2" ] || wget $LINUX_WGET |
pankso@361 | 59 [ -f "glibc-$GLIBC_VERSION.tar.bz2" ] || wget $GLIBC_WGET |
pankso@361 | 60 [ -f "gcc-$GCC_VERSION.tar.bz2" ] || wget $GCC_WGET |
pankso@361 | 61 [ -f "busybox-$BUSYBOX_VERSION.tar.bz2" ] || wget $BUSYBOX_WGET |
pankso@361 | 62 } |
pankso@361 | 63 |
pankso@403 | 64 # Use sysroot or not ? |
pankso@403 | 65 check_sysroot() { |
pankso@403 | 66 if [ "$SYSROOT" ]; then |
pankso@403 | 67 PREFIX=/usr |
pankso@403 | 68 HDR_PATH=$SYSROOT/usr |
pankso@403 | 69 sysroot="--with-sysroot=$SYSROOT" |
pankso@411 | 70 echo "Configure : $sysroot" |
pankso@403 | 71 else |
pankso@403 | 72 HDR_PATH=$PREFIX |
pankso@403 | 73 fi |
pankso@403 | 74 } |
pankso@403 | 75 |
pankso@361 | 76 # 1. Binutils |
pankso@361 | 77 binutils() { |
pankso@408 | 78 init_compile |
pankso@411 | 79 rm -rf binutils-$BINUTILS_VERSION |
pankso@361 | 80 echo "Extracting: binutils-$BINUTILS_VERSION.tar.bz2" |
pankso@361 | 81 tar xjf $SRC/binutils-$BINUTILS_VERSION.tar.bz2 |
pankso@400 | 82 : ${BINUTILS_ARGS=--enable-shared} |
pankso@411 | 83 echo "Configure : $BINUTILS_ARGS" |
pankso@403 | 84 check_sysroot |
pankso@361 | 85 cd binutils-$BINUTILS_VERSION |
pankso@361 | 86 ./configure \ |
pankso@361 | 87 --prefix=$PREFIX \ |
pankso@361 | 88 --target=$TARGET \ |
pankso@361 | 89 --enable-targets=$BUILD_SYSTEM \ |
pankso@403 | 90 $BINUTILS_ARGS $sysroot |
pankso@361 | 91 make || exit 1 |
pankso@361 | 92 make install |
pankso@412 | 93 #echo "cross: binutils compiled on: $(date)" |
pankso@361 | 94 } |
pankso@361 | 95 |
pankso@403 | 96 # 2. GCC static (first pass) |
pankso@361 | 97 gcc_static() { |
pankso@408 | 98 init_compile |
pankso@361 | 99 echo "Extracting: gcc-$GCC_VERSION.tar.bz2" |
pankso@361 | 100 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2 |
pankso@411 | 101 echo "Configure : $GCC_STATIC_ARGS" |
pankso@403 | 102 check_sysroot |
pankso@403 | 103 # Arch fixes and work around |
pankso@403 | 104 case "$ARCH" in |
pankso@403 | 105 x86_64) |
pankso@403 | 106 # GCC wants Glib headers in cross environment (not tested |
pankso@403 | 107 # with sysroot) Should we install glibc-headers before ? |
pankso@403 | 108 [ "$SYSROOT" ] || \ |
pankso@409 | 109 ln -s /usr/include $PREFIX/$TARGET/include ;; |
pankso@403 | 110 esac |
pankso@361 | 111 rm -rf gcc-static |
pankso@361 | 112 mkdir gcc-static && cd gcc-static |
pankso@361 | 113 ../gcc-$GCC_VERSION/configure \ |
pankso@361 | 114 --prefix=$PREFIX \ |
pankso@374 | 115 --libexec=$PREFIX/lib \ |
pankso@361 | 116 --target=$TARGET \ |
pankso@361 | 117 --disable-shared \ |
pankso@361 | 118 --disable-threads \ |
pankso@361 | 119 --without-headers \ |
pankso@361 | 120 --with-newlib \ |
pankso@403 | 121 $GCC_STATIC_ARGS $sysroot |
pankso@361 | 122 make all-gcc all-target-libgcc || exit 1 |
pankso@361 | 123 make install-gcc install-target-libgcc |
pankso@361 | 124 cd $PREFIX/lib/gcc/$TARGET/$GCC_VERSION |
paul@382 | 125 echo "Creating symlink for static libgcc: libgcc_eh.a" |
pankso@366 | 126 rm -f libgcc_eh.a && ln -s libgcc.a libgcc_eh.a |
pankso@361 | 127 } |
pankso@361 | 128 |
pankso@403 | 129 # 3. Kernel headers use static GCC |
pankso@403 | 130 linux_headers() { |
pankso@408 | 131 init_compile |
pankso@403 | 132 echo "Extracting: linux-$LINUX_VERSION.tar.bz2" |
pankso@403 | 133 tar xjf $SRC/linux-$LINUX_VERSION.tar.bz2 |
pankso@403 | 134 check_sysroot |
pankso@403 | 135 cd linux-$LINUX_VERSION |
pankso@403 | 136 make mrproper |
pankso@403 | 137 make ARCH=$ARCH headers_check |
pankso@403 | 138 make ARCH=$ARCH headers_install \ |
pankso@403 | 139 INSTALL_HDR_PATH=$HDR_PATH |
pankso@403 | 140 } |
pankso@403 | 141 |
pankso@361 | 142 # 4. GNU Glibc |
pankso@361 | 143 glibc() { |
pankso@408 | 144 init_compile |
pankso@361 | 145 echo "Extracting: glibc-$GLIBC_VERSION.tar.bz2" |
pankso@361 | 146 tar xjf $SRC/glibc-$GLIBC_VERSION.tar.bz2 |
pankso@411 | 147 echo "Configure : $GLIBC_ARGS" |
pankso@361 | 148 [ "$continue" ] || rm -rf glibc-build |
pankso@400 | 149 # Some arch may need glibc-ports and custom CFLAGS |
pankso@403 | 150 case "$ARCH" in |
pankso@361 | 151 arm) |
pankso@401 | 152 #export CFLAGS="-march=armv6 -mtune=generic -g -O2" |
pankso@362 | 153 [ -f "$SRC/glibc-ports-$GLIBC_VERSION.tar.bz2" ] || wget \ |
pankso@362 | 154 http://ftp.gnu.org/gnu/libc/glibc-ports-$GLIBC_VERSION.tar.bz2 \ |
pankso@362 | 155 -O $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 || exit 1 |
pankso@361 | 156 echo "Extracting: glibc-ports-$GLIBC_VERSION.tar.bz2" |
pankso@361 | 157 rm -rf glibc-$GLIBC_VERSION/ports |
pankso@361 | 158 tar xjf $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 |
pankso@361 | 159 mv glibc-ports-$GLIBC_VERSION glibc-$GLIBC_VERSION/ports ;; |
pankso@418 | 160 x86_64) |
pankso@418 | 161 ccflags="-m64" ;; |
pankso@361 | 162 esac |
pankso@404 | 163 #echo "CFLAGS: $CFLAGS" |
pankso@361 | 164 mkdir -p glibc-build && cd glibc-build |
pankso@365 | 165 BUILD_CC="gcc" \ |
pankso@418 | 166 CC="${TARGET}-gcc $ccflags" \ |
pankso@361 | 167 libc_cv_forced_unwind=yes \ |
pankso@361 | 168 libc_cv_c_cleanup=yes \ |
pankso@361 | 169 ../glibc-$GLIBC_VERSION/configure \ |
pankso@361 | 170 --prefix=$PREFIX \ |
pankso@417 | 171 --libexec=$PREFIX/lib/glibc \ |
pankso@361 | 172 --host=$TARGET \ |
pankso@361 | 173 --with-headers=$PREFIX/include \ |
pankso@361 | 174 --with-binutils=$PREFIX/bin \ |
pankso@410 | 175 $GLIBC_ARGS |
pankso@361 | 176 make || exit 1 |
pankso@361 | 177 make install |
pankso@403 | 178 # Work around to let GCC find Glibc headers. |
pankso@404 | 179 if [ "$SYSROOT" ]; then |
pankso@404 | 180 cd $SYSROOT |
pankso@404 | 181 ln -s usr/include sys-include |
pankso@404 | 182 else |
pankso@403 | 183 cd $PREFIX/$TARGET |
pankso@403 | 184 rm -rf lib include |
pankso@403 | 185 ln -s ../lib lib |
pankso@403 | 186 ln -s ../include include |
pankso@403 | 187 fi |
pankso@403 | 188 #unset CFLAGS |
pankso@361 | 189 } |
pankso@361 | 190 |
pankso@361 | 191 # 5. GCC final |
pankso@361 | 192 gcc_final() { |
pankso@408 | 193 init_compile |
pankso@361 | 194 if [ ! -d "gcc-$GCC_VERSION" ]; then |
pankso@361 | 195 echo "Extracting: gcc-$GCC_VERSION.tar.bz2" |
pankso@361 | 196 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2 |
pankso@361 | 197 fi |
pankso@411 | 198 echo "Configure : $GCC_FINAL_ARGS" |
pankso@403 | 199 check_sysroot |
pankso@361 | 200 rm -rf gcc-build |
pankso@361 | 201 mkdir gcc-build && cd gcc-build |
pankso@361 | 202 ../gcc-$GCC_VERSION/configure \ |
pankso@361 | 203 --prefix=$PREFIX \ |
pankso@374 | 204 --libexec=$PREFIX/lib \ |
pankso@361 | 205 --target=$TARGET \ |
pankso@361 | 206 --enable-shared \ |
pankso@361 | 207 --enable-c99 \ |
pankso@361 | 208 --enable-long-long \ |
pankso@361 | 209 --enable-__cxa_atexit \ |
pankso@400 | 210 --with-pkgversion="SliTaz" \ |
pankso@403 | 211 $GCC_FINAL_ARGS $sysroot |
pankso@361 | 212 make || exit 1 |
pankso@361 | 213 make install |
pankso@361 | 214 } |
pankso@361 | 215 |
paul@382 | 216 # Build Busybox to we can create prebuilt tiny rootfs image and boot |
pankso@361 | 217 # from NFS ? |
pankso@361 | 218 cross_busybox() { |
pankso@408 | 219 init_compile |
pankso@361 | 220 echo "Extracting: busybox-$BUSYBOX_VERSION.tar.bz2" |
pankso@361 | 221 tar xjf $SRC/busybox-$BUSYBOX_VERSION.tar.bz2 |
pankso@361 | 222 cd busybox-$BUSYBOX_VERSION |
pankso@400 | 223 # CROSS_COMPILE is exported via init_compile. |
pankso@400 | 224 make defconfig |
pankso@400 | 225 make || exit 1 |
pankso@400 | 226 make install |
pankso@361 | 227 chmod 4755 _install/bin/busybox |
pankso@361 | 228 readelf -h _install/bin/busybox |
pankso@403 | 229 echo "Busybox install path: $(pwd)/_install" |
pankso@361 | 230 } |
pankso@361 | 231 |
pankso@361 | 232 # |
pankso@361 | 233 # Commands |
pankso@361 | 234 # |
pankso@361 | 235 |
pankso@361 | 236 case "$1" in |
pankso@361 | 237 howto|man) |
pankso@361 | 238 doc=/usr/share/doc/cookutils/cross.txt |
pankso@361 | 239 [ -f "$doc" ] && less -E $doc ;; |
pankso@361 | 240 info) |
pankso@361 | 241 init_compile |
pankso@361 | 242 CC=${TARGET}-gcc |
paul@382 | 243 echo -e "\nCross Toolchain information" && separator |
pankso@374 | 244 [ "$config" ] && echo "Config file : $config" |
pankso@361 | 245 cat << EOT |
pankso@374 | 246 Target arch : $ARCH |
pankso@374 | 247 C Compiler : $CC |
pankso@374 | 248 Build directory : $WORK |
pankso@361 | 249 EOT |
pankso@403 | 250 if [ "$SYSROOT" ]; then |
pankso@404 | 251 PREFIX=/usr |
pankso@403 | 252 echo "Arch sysroot : $SYSROOT" |
pankso@403 | 253 else |
pankso@403 | 254 echo "Additional path : $PREFIX/bin" |
pankso@403 | 255 fi |
pankso@361 | 256 separator && echo "" |
pankso@361 | 257 echo "GCC version" && separator |
pankso@404 | 258 if [ -x "$PREFIX/bin/$CC" ]; then |
pankso@374 | 259 $CC -v |
pankso@374 | 260 else |
pankso@374 | 261 echo "No C compiler. To build a toolchain run: cross compile" |
pankso@374 | 262 fi |
pankso@361 | 263 separator && echo "" ;; |
pankso@361 | 264 testsuite) |
pankso@361 | 265 init_compile |
pankso@361 | 266 echo "[COMPILING] $TARGET-gcc -v -Wall -o test.out test.c" \ |
pankso@361 | 267 | tee $logdir/testsuite.log |
pankso@361 | 268 echo 'int main() { return 0; }' > test.c |
pankso@361 | 269 $TARGET-gcc -v -Wall -o test.out test.c 2>&1 | tee -a $logdir/testsuite.log |
pankso@361 | 270 if [ -x /usr/bin/file ]; then |
pankso@361 | 271 echo -e "\n[CHECKING] file test.out" | tee -a $logdir/testsuite.log |
pankso@361 | 272 file test.out | tee -a $logdir/testsuite.log |
pankso@361 | 273 fi |
pankso@361 | 274 echo -e "\n[CHECKING] readelf -h test.out" | tee -a $logdir/testsuite.log |
pankso@361 | 275 readelf -h test.out | tee -a $logdir/testsuite.log ;; |
pankso@365 | 276 check-env) |
pankso@361 | 277 for pkg in mpfr mpfr-dev gmp gmp-dev mpc-library gawk autoconf |
pankso@361 | 278 do |
pankso@361 | 279 if [ ! -d "/var/lib/tazpkg/installed/$pkg" ]; then |
pankso@361 | 280 echo "Missing packages: $pkg" |
pankso@361 | 281 [ "$install" ] && tazpkg -gi $pkg |
pankso@361 | 282 fi |
pankso@361 | 283 done ;; |
pankso@361 | 284 download) |
pankso@361 | 285 download_src ;; |
pankso@361 | 286 show-log) |
pankso@361 | 287 pkg=$2 |
pankso@371 | 288 log=$logdir/$pkg.log |
pankso@371 | 289 if [ ! -f "$log" ]; then |
pankso@371 | 290 echo "No log file found for: $pkg" && exit 1 |
pankso@371 | 291 fi |
pankso@371 | 292 less -E $log ;; |
pankso@361 | 293 binutils) |
pankso@412 | 294 rm -f $logdir/binutils.log |
pankso@361 | 295 binutils 2>&1 | tee $logdir/binutils.log ;; |
pankso@403 | 296 gcc-static) |
pankso@403 | 297 gcc_static 2>&1 | tee $logdir/gcc-static.log ;; |
pankso@361 | 298 linux-headers) |
pankso@363 | 299 linux_headers 2>&1 | tee $logdir/linux-headers.log ;; |
pankso@361 | 300 glibc) |
pankso@361 | 301 glibc 2>&1 | tee $logdir/glibc.log ;; |
pankso@361 | 302 gcc-final) |
pankso@361 | 303 gcc_final 2>&1 | tee $logdir/gcc-final.log ;; |
pankso@361 | 304 busybox) |
pankso@361 | 305 cross_busybox 2>&1 | tee $logdir/busybox.log ;; |
pankso@361 | 306 compile) |
pankso@400 | 307 # Compile the full toolchain. |
pankso@400 | 308 time=$(date +%s) |
pankso@361 | 309 init_compile |
pankso@361 | 310 echo "Compile start: $(date)" | tee $logdir/compile.log |
pankso@361 | 311 download_src |
pankso@361 | 312 binutils 2>&1 | tee $logdir/binutils.log |
pankso@403 | 313 gcc_static 2>&1 | tee $logdir/gcc-static.log |
pankso@361 | 314 linux_headers 2>&1 | tee $logdir/linux-headers.log |
pankso@361 | 315 glibc 2>&1 | tee $logdir/glibc.log |
pankso@361 | 316 gcc_final 2>&1 | tee $logdir/gcc-final.log |
pankso@361 | 317 echo "" |
pankso@365 | 318 echo "Compile end : $(date)" | tee -a $logdir/compile.log |
pankso@400 | 319 time=$(($(date +%s) - $time)) |
pankso@400 | 320 sec=$time |
pankso@400 | 321 div=$(( ($time + 30) / 60)) |
pankso@400 | 322 [ "$div" != 0 ] && min="~ ${div}m" |
pankso@401 | 323 echo "Build time : ${sec}s $min" | tee -a $logdir/compile.log |
pankso@361 | 324 echo "" ;; |
pankso@416 | 325 clean) |
pankso@416 | 326 echo -n "Removing all source files..." |
pankso@416 | 327 rm -rf $WORK/source/* && status |
pankso@416 | 328 [ "$log" ] && rm -f $WORK/log/*.log |
pankso@416 | 329 echo "To clean chroot: rm -rf $PREFIX" ;; |
pankso@371 | 330 clean-tools) |
pankso@371 | 331 # Remove crap :-) |
pankso@371 | 332 init_compile |
pankso@416 | 333 echo "Cleaning : $PREFIX ($(du -sh $PREFIX | awk '{print $1}'))" |
pankso@371 | 334 for dir in info man locale |
pankso@371 | 335 do |
pankso@416 | 336 echo -n "Removing : $dir" |
pankso@371 | 337 rm -rf $PREFIX/share && status |
pankso@371 | 338 done |
pankso@416 | 339 rm -f $PREFIX/lib/*-gdb.py |
pankso@416 | 340 #echo -n "Stripping : shared libs" |
pankso@416 | 341 #${TARGET}-strip -s $PREFIX/lib/*.so.* |
pankso@416 | 342 #status |
pankso@416 | 343 echo -n "Stripping : GCC libs" |
pankso@416 | 344 ${TARGET}-strip -s $PREFIX/$TARGET/lib/gcc/$TARGET/*/cc1* |
pankso@416 | 345 ${TARGET}-strip -s $PREFIX/$TARGET/lib/gcc/$TARGET/*/lto* |
pankso@416 | 346 sleep 1 && status |
pankso@416 | 347 echo -n "Stripping : binaries" |
pankso@371 | 348 for bin in $PREFIX/bin/${TARGET}-* |
pankso@371 | 349 do |
pankso@371 | 350 [ "$bin" == "$PREFIX/bin/${TARGET}-strip" ] && continue |
pankso@371 | 351 if [ -x "$bin" ]; then |
pankso@371 | 352 ${TARGET}-strip -s $bin 2>/dev/null |
pankso@371 | 353 fi |
pankso@371 | 354 done && status |
pankso@416 | 355 echo -n "Tools size : " && du -sh $PREFIX | awk '{print $1}' ;; |
pankso@366 | 356 gen-rootfs) |
pankso@366 | 357 # |
pankso@366 | 358 # TESTING |
pankso@366 | 359 # |
pankso@366 | 360 # Create a bootable rootfs ? dd for an HD image ? |
pankso@366 | 361 init_compile |
pankso@366 | 362 rootfs=/tmp/cross/rootfs |
pankso@366 | 363 tarball="rootfs.tar.bz2" |
pankso@366 | 364 rm -rf $rootfs && mkdir -p $rootfs |
pankso@366 | 365 cd /tmp/cross |
pankso@366 | 366 echo -n "Installing SliTaz base files..." |
pankso@366 | 367 tar xzf $SRC/slitaz-base-files-5.2.tar.gz |
pankso@366 | 368 cp -a slitaz-base-files-*/rootfs/* $rootfs |
pankso@366 | 369 status |
pankso@366 | 370 echo -n "Installing Busybox..." |
pankso@366 | 371 cp -a $source/busybox-$BUSYBOX_VERSION/_install/* $rootfs |
pankso@366 | 372 status |
pankso@366 | 373 echo -n "Creating tarball: $tarball" |
pankso@366 | 374 tar cjf $tarball rootfs |
pankso@366 | 375 status |
pankso@366 | 376 echo -n "Moving rootfs to: $WORK" |
pankso@366 | 377 mv $tarball $WORK |
pankso@366 | 378 status |
pankso@366 | 379 du -sh $WORK/$tarball |
pankso@366 | 380 rm -rf /tmp/cross ;; |
pankso@416 | 381 gen-prebuilt) |
pankso@416 | 382 # |
pankso@416 | 383 # TESTING |
pankso@416 | 384 # |
pankso@416 | 385 # Create a prebuilt cross toolchain tarball (or package ?) |
pankso@416 | 386 init_compile |
pankso@416 | 387 cd /usr/cross |
pankso@416 | 388 tarball="slitaz-cross-$ARCH-toolchain.tar.bz2" |
pankso@416 | 389 echo -n "Creating prebuilt $ARCH toolchain tarball..." |
pankso@416 | 390 tar cjf $tarball $ARCH |
pankso@416 | 391 status |
pankso@416 | 392 mv -f $tarball $WORK |
pankso@416 | 393 #echo "Tarball size: $(du -sh $WORK/$tarball | awk '{print $1}')" |
pankso@416 | 394 du -sh $WORK/$tarball ;; |
pankso@361 | 395 *) |
pankso@361 | 396 usage ;; |
pankso@361 | 397 esac |
pankso@361 | 398 |