cookutils annotate cross @ rev 382

Edit cross files
author Paul Issott <paul@slitaz.org>
date Sat May 12 22:03:46 2012 +0100 (2012-05-12)
parents 9af42268847d
children 45feb8246d3c
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@374 15
pankso@361 16 # Help and usage.
pankso@361 17 usage() {
pankso@361 18 cat << EOT
pankso@361 19
pankso@361 20 Usage: $(basename $0) command --option
pankso@361 21
pankso@361 22 Commands:
pankso@361 23 howto Man alike and howto
paul@382 24 info Display cross-tools info
pankso@361 25 testsuite Execute a small testsuite
pankso@361 26 check-env Check build host tools
pankso@361 27 download Download necessary sources
pankso@371 28 clean Clean-up build environment
pankso@371 29 clean-tools Clean: $PREFIX
pankso@361 30 show-log Show a compile log
pankso@361 31 binutils Compile Binutils
pankso@361 32 gcc-static Compile GCC static
pankso@361 33 linux-headers Install Kernel headers
pankso@361 34 glibc Compile GNU Glibc
pankso@361 35 gcc-final Compile final GCC
pankso@361 36 busybox Cross compile Busybox
pankso@361 37 compile Compile everything at once
pankso@361 38
pankso@361 39 EOT
pankso@361 40 }
pankso@361 41
pankso@361 42 # Make sure we have all directories.
pankso@361 43 init_compile() {
pankso@361 44 export LC_ALL=POSIX LANG=POSIX
pankso@361 45 export PATH=$PATH:$PREFIX/bin
pankso@361 46 export CROSS_COMPILE=$TARGET-
pankso@361 47 source=$WORK/source
pankso@361 48 logdir=$WORK/log
pankso@361 49 mkdir -p $source $logdir $install
pankso@361 50 cd $source
pankso@361 51 }
pankso@361 52
pankso@361 53 # Get source if not yet in $SRC.
pankso@361 54 download_src() {
pankso@361 55 mkdir -p $SRC && cd $SRC
pankso@361 56 [ -f "binutils-$BINUTILS_VERSION.tar.bz2" ] || wget $BINUTILS_WGET
pankso@361 57 [ -f "linux-$LINUX_VERSION.tar.bz2" ] || wget $LINUX_WGET
pankso@361 58 [ -f "glibc-$GLIBC_VERSION.tar.bz2" ] || wget $GLIBC_WGET
pankso@361 59 [ -f "gcc-$GCC_VERSION.tar.bz2" ] || wget $GCC_WGET
pankso@361 60 [ -f "busybox-$BUSYBOX_VERSION.tar.bz2" ] || wget $BUSYBOX_WGET
pankso@361 61 }
pankso@361 62
pankso@361 63 # 1. Binutils
pankso@361 64 binutils() {
pankso@361 65 echo "Extracting: binutils-$BINUTILS_VERSION.tar.bz2"
pankso@361 66 tar xjf $SRC/binutils-$BINUTILS_VERSION.tar.bz2
pankso@361 67 # Peer arch options --disable-werror
pankso@361 68 case $ARCH in
pankso@372 69 arm) archopts="--enable-shared" ;;
pankso@372 70 x86_64) archopts="--disable-multilib" ;;
pankso@361 71 esac
pankso@361 72 cd binutils-$BINUTILS_VERSION
pankso@361 73 ./configure \
pankso@361 74 --prefix=$PREFIX \
pankso@361 75 --target=$TARGET \
pankso@361 76 --enable-targets=$BUILD_SYSTEM \
pankso@372 77 $archopts
pankso@361 78 make || exit 1
pankso@361 79 make install
pankso@361 80 }
pankso@361 81
pankso@361 82 # 2. Kernel headers
pankso@361 83 linux_headers() {
pankso@361 84 echo "Extracting: linux-$LINUX_VERSION.tar.bz2"
pankso@361 85 tar xjf $SRC/linux-$LINUX_VERSION.tar.bz2
pankso@361 86 cd linux-$LINUX_VERSION
pankso@361 87 make mrproper
pankso@361 88 make ARCH=$ARCH headers_check
pankso@361 89 make ARCH=$ARCH headers_install \
pankso@361 90 INSTALL_HDR_PATH=$PREFIX
pankso@361 91 }
pankso@361 92
pankso@361 93 # 3. GCC static (first pass)
pankso@361 94 gcc_static() {
pankso@361 95 echo "Extracting: gcc-$GCC_VERSION.tar.bz2"
pankso@361 96 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2
pankso@361 97 # Peer arch options
pankso@361 98 case $ARCH in
pankso@361 99 arm) archopts="" ;;
pankso@361 100 x86_64) archopts="" ;;
pankso@361 101 esac
pankso@361 102 rm -rf gcc-static
pankso@361 103 mkdir gcc-static && cd gcc-static
pankso@361 104 ../gcc-$GCC_VERSION/configure \
pankso@361 105 --prefix=$PREFIX \
pankso@374 106 --libexec=$PREFIX/lib \
pankso@361 107 --target=$TARGET \
pankso@361 108 --disable-shared \
pankso@361 109 --disable-threads \
pankso@361 110 --without-headers \
pankso@361 111 --with-newlib \
pankso@361 112 --enable-languages=c
pankso@361 113 make all-gcc all-target-libgcc || exit 1
pankso@361 114 make install-gcc install-target-libgcc
pankso@361 115 cd $PREFIX/lib/gcc/$TARGET/$GCC_VERSION
paul@382 116 echo "Creating symlink for static libgcc: libgcc_eh.a"
pankso@366 117 rm -f libgcc_eh.a && ln -s libgcc.a libgcc_eh.a
pankso@361 118 }
pankso@361 119
pankso@361 120 # 4. GNU Glibc
pankso@361 121 glibc() {
pankso@361 122 echo "Extracting: glibc-$GLIBC_VERSION.tar.bz2"
pankso@361 123 tar xjf $SRC/glibc-$GLIBC_VERSION.tar.bz2
pankso@361 124 [ "$continue" ] || rm -rf glibc-build
pankso@361 125 # Peer arch options
pankso@361 126 case $ARCH in
pankso@361 127 arm)
pankso@361 128 archopts=""
pankso@362 129 [ -f "$SRC/glibc-ports-$GLIBC_VERSION.tar.bz2" ] || wget \
pankso@362 130 http://ftp.gnu.org/gnu/libc/glibc-ports-$GLIBC_VERSION.tar.bz2 \
pankso@362 131 -O $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 || exit 1
pankso@361 132 echo "Extracting: glibc-ports-$GLIBC_VERSION.tar.bz2"
pankso@361 133 rm -rf glibc-$GLIBC_VERSION/ports
pankso@361 134 tar xjf $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2
pankso@361 135 mv glibc-ports-$GLIBC_VERSION glibc-$GLIBC_VERSION/ports ;;
pankso@361 136 x86_64)
pankso@361 137 archopts="" ;;
pankso@361 138 esac
pankso@361 139 mkdir -p glibc-build && cd glibc-build
pankso@365 140 BUILD_CC="gcc" \
pankso@361 141 CC="$PREFIX/bin/$TARGET-gcc" \
pankso@361 142 libc_cv_forced_unwind=yes \
pankso@361 143 libc_cv_c_cleanup=yes \
pankso@361 144 ../glibc-$GLIBC_VERSION/configure \
pankso@361 145 --prefix=$PREFIX \
pankso@361 146 --host=$TARGET \
pankso@361 147 --with-headers=$PREFIX/include \
pankso@361 148 --with-binutils=$PREFIX/bin \
pankso@361 149 --enable-add-ons
pankso@361 150 make || exit 1
pankso@361 151 make install
pankso@361 152 cd $PREFIX/$TARGET
pankso@361 153 rm -rf lib include
pankso@361 154 ln -s ../lib lib
pankso@361 155 ln -s ../include include
pankso@361 156 }
pankso@361 157
pankso@361 158 # 5. GCC final
pankso@361 159 gcc_final() {
pankso@361 160 if [ ! -d "gcc-$GCC_VERSION" ]; then
pankso@361 161 echo "Extracting: gcc-$GCC_VERSION.tar.bz2"
pankso@361 162 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2
pankso@361 163 fi
pankso@361 164 # Peer arch options
pankso@361 165 case $ARCH in
pankso@361 166 arm) archopts="" ;;
pankso@361 167 x86_64) archopts="" ;;
pankso@361 168 esac
pankso@361 169 rm -rf gcc-build
pankso@361 170 mkdir gcc-build && cd gcc-build
pankso@361 171 ../gcc-$GCC_VERSION/configure \
pankso@361 172 --prefix=$PREFIX \
pankso@374 173 --libexec=$PREFIX/lib \
pankso@361 174 --target=$TARGET \
pankso@361 175 --enable-shared \
pankso@361 176 --enable-languages=c,c++ \
pankso@361 177 --enable-c99 \
pankso@361 178 --enable-long-long \
pankso@361 179 --enable-__cxa_atexit \
pankso@361 180 --with-pkgversion="SliTaz"
pankso@361 181 make || exit 1
pankso@361 182 make install
pankso@361 183 }
pankso@361 184
paul@382 185 # Build Busybox to we can create prebuilt tiny rootfs image and boot
pankso@361 186 # from NFS ?
pankso@361 187 cross_busybox() {
pankso@361 188 echo "Extracting: busybox-$BUSYBOX_VERSION.tar.bz2"
pankso@361 189 tar xjf $SRC/busybox-$BUSYBOX_VERSION.tar.bz2
pankso@361 190 cd busybox-$BUSYBOX_VERSION
pankso@361 191 # CROSS_COMPILE is exported via init_compile, but be sure.
pankso@361 192 make CROSS_COMPILE=$TARGET- defconfig
pankso@361 193 make CROSS_COMPILE=$TARGET- || exit 1
pankso@361 194 make CROSS_COMPILE=$TARGET- install
pankso@361 195 chmod 4755 _install/bin/busybox
pankso@361 196 readelf -h _install/bin/busybox
pankso@361 197 }
pankso@361 198
pankso@361 199 #
pankso@361 200 # Commands
pankso@361 201 #
pankso@361 202
pankso@361 203 case "$1" in
pankso@361 204 howto|man)
pankso@361 205 doc=/usr/share/doc/cookutils/cross.txt
pankso@361 206 [ -f "$doc" ] && less -E $doc ;;
pankso@361 207 info)
pankso@361 208 init_compile
pankso@361 209 CC=${TARGET}-gcc
paul@382 210 echo -e "\nCross Toolchain information" && separator
pankso@374 211 [ "$config" ] && echo "Config file : $config"
pankso@361 212 cat << EOT
pankso@374 213 Target arch : $ARCH
pankso@374 214 C Compiler : $CC
paul@382 215 Additional path : /usr/cross/$ARCH/bin
pankso@374 216 Build directory : $WORK
pankso@361 217 EOT
pankso@361 218 separator && echo ""
pankso@361 219 echo "GCC version" && separator
pankso@374 220 if [ -x "$PREFIX/$CC" ]; then
pankso@374 221 $CC -v
pankso@374 222 else
pankso@374 223 echo "No C compiler. To build a toolchain run: cross compile"
pankso@374 224 fi
pankso@361 225 separator && echo "" ;;
pankso@361 226 testsuite)
pankso@361 227 init_compile
pankso@361 228 echo "[COMPILING] $TARGET-gcc -v -Wall -o test.out test.c" \
pankso@361 229 | tee $logdir/testsuite.log
pankso@361 230 echo 'int main() { return 0; }' > test.c
pankso@361 231 $TARGET-gcc -v -Wall -o test.out test.c 2>&1 | tee -a $logdir/testsuite.log
pankso@361 232 if [ -x /usr/bin/file ]; then
pankso@361 233 echo -e "\n[CHECKING] file test.out" | tee -a $logdir/testsuite.log
pankso@361 234 file test.out | tee -a $logdir/testsuite.log
pankso@361 235 fi
pankso@361 236 echo -e "\n[CHECKING] readelf -h test.out" | tee -a $logdir/testsuite.log
pankso@361 237 readelf -h test.out | tee -a $logdir/testsuite.log ;;
pankso@365 238 check-env)
pankso@361 239 for pkg in mpfr mpfr-dev gmp gmp-dev mpc-library gawk autoconf
pankso@361 240 do
pankso@361 241 if [ ! -d "/var/lib/tazpkg/installed/$pkg" ]; then
pankso@361 242 echo "Missing packages: $pkg"
pankso@361 243 [ "$install" ] && tazpkg -gi $pkg
pankso@361 244 fi
pankso@361 245 done ;;
pankso@361 246 download)
pankso@361 247 download_src ;;
pankso@361 248 clean)
paul@382 249 echo -n "Removing all source files..."
pankso@361 250 rm -rf $WORK/source/* && status
pankso@361 251 [ "$log" ] && rm -f $WORK/log/*.log
pankso@361 252 echo "To clean chroot: rm -rf $PREFIX" ;;
pankso@361 253 show-log)
pankso@361 254 pkg=$2
pankso@371 255 log=$logdir/$pkg.log
pankso@371 256 if [ ! -f "$log" ]; then
pankso@371 257 echo "No log file found for: $pkg" && exit 1
pankso@371 258 fi
pankso@371 259 less -E $log ;;
pankso@361 260 binutils)
pankso@361 261 init_compile
pankso@361 262 rm -f $logdir/binutils.log
pankso@361 263 binutils 2>&1 | tee $logdir/binutils.log ;;
pankso@361 264 linux-headers)
pankso@361 265 init_compile
pankso@363 266 linux_headers 2>&1 | tee $logdir/linux-headers.log ;;
pankso@361 267 gcc-static)
pankso@361 268 init_compile
pankso@361 269 gcc_static 2>&1 | tee $logdir/gcc-static.log ;;
pankso@361 270 glibc)
pankso@361 271 init_compile
pankso@361 272 glibc 2>&1 | tee $logdir/glibc.log ;;
pankso@361 273 gcc-final)
pankso@361 274 init_compile
pankso@361 275 gcc_final 2>&1 | tee $logdir/gcc-final.log ;;
pankso@361 276 busybox)
pankso@361 277 init_compile
pankso@361 278 cross_busybox 2>&1 | tee $logdir/busybox.log ;;
pankso@361 279 compile)
pankso@361 280 init_compile
pankso@361 281 echo "Compile start: $(date)" | tee $logdir/compile.log
pankso@361 282 download_src
pankso@361 283 binutils 2>&1 | tee $logdir/binutils.log
pankso@361 284 linux_headers 2>&1 | tee $logdir/linux-headers.log
pankso@361 285 gcc_static 2>&1 | tee $logdir/gcc-static.log
pankso@361 286 glibc 2>&1 | tee $logdir/glibc.log
pankso@361 287 gcc_final 2>&1 | tee $logdir/gcc-final.log
pankso@361 288 echo ""
pankso@365 289 echo "Compile end : $(date)" | tee -a $logdir/compile.log
pankso@361 290 echo "" ;;
pankso@371 291 clean-tools)
pankso@371 292 # Remove crap :-)
pankso@371 293 init_compile
pankso@371 294 echo "Cleaning : $PREFIX"
pankso@371 295 for dir in info man locale
pankso@371 296 do
pankso@371 297 echo -n "Removing : $dir"
pankso@371 298 rm -rf $PREFIX/share && status
pankso@371 299 done
pankso@371 300 echo -n "Stripping : binaries"
pankso@371 301 for bin in $PREFIX/bin/${TARGET}-*
pankso@371 302 do
pankso@371 303 [ "$bin" == "$PREFIX/bin/${TARGET}-strip" ] && continue
pankso@371 304 if [ -x "$bin" ]; then
pankso@371 305 ${TARGET}-strip -s $bin 2>/dev/null
pankso@371 306 fi
pankso@371 307 done && status
pankso@371 308 echo -n "Tools size: " && du -sh $PREFIX | awk '{print $1}' ;;
pankso@366 309 gen-rootfs)
pankso@366 310 #
pankso@366 311 # TESTING
pankso@366 312 #
pankso@366 313 # Create a bootable rootfs ? dd for an HD image ?
pankso@366 314 init_compile
pankso@366 315 rootfs=/tmp/cross/rootfs
pankso@366 316 tarball="rootfs.tar.bz2"
pankso@366 317 rm -rf $rootfs && mkdir -p $rootfs
pankso@366 318 cd /tmp/cross
pankso@366 319 echo -n "Installing SliTaz base files..."
pankso@366 320 tar xzf $SRC/slitaz-base-files-5.2.tar.gz
pankso@366 321 cp -a slitaz-base-files-*/rootfs/* $rootfs
pankso@366 322 status
pankso@366 323 echo -n "Installing Busybox..."
pankso@366 324 cp -a $source/busybox-$BUSYBOX_VERSION/_install/* $rootfs
pankso@366 325 status
pankso@366 326 echo -n "Creating tarball: $tarball"
pankso@366 327 tar cjf $tarball rootfs
pankso@366 328 status
pankso@366 329 echo -n "Moving rootfs to: $WORK"
pankso@366 330 mv $tarball $WORK
pankso@366 331 status
pankso@366 332 du -sh $WORK/$tarball
pankso@366 333 rm -rf /tmp/cross ;;
pankso@361 334 *)
pankso@361 335 usage ;;
pankso@361 336 esac
pankso@361 337