cookutils annotate cross @ rev 363

cross: typo
author Christophe Lincoln <pankso@slitaz.org>
date Wed May 09 22:41:21 2012 +0200 (2012-05-09)
parents e60f4a6df297
children dc114cbd0d56
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@361 9 . cross.conf || exit 1
pankso@361 10
pankso@361 11 # Help and usage.
pankso@361 12 usage() {
pankso@361 13 cat << EOT
pankso@361 14
pankso@361 15 Usage: $(basename $0) command --option
pankso@361 16
pankso@361 17 Commands:
pankso@361 18 howto Man alike and howto
pankso@361 19 info Dispaly cross-tools info
pankso@361 20 testsuite Execute a small testsuite
pankso@361 21 check-env Check build host tools
pankso@361 22 download Download necessary sources
pankso@361 23 clean Clean-up environment
pankso@361 24 show-log Show a compile log
pankso@361 25 binutils Compile Binutils
pankso@361 26 gcc-static Compile GCC static
pankso@361 27 linux-headers Install Kernel headers
pankso@361 28 glibc Compile GNU Glibc
pankso@361 29 gcc-final Compile final GCC
pankso@361 30 busybox Cross compile Busybox
pankso@361 31 compile Compile everything at once
pankso@361 32
pankso@361 33 EOT
pankso@361 34 }
pankso@361 35
pankso@361 36 # Make sure we have all directories.
pankso@361 37 init_compile() {
pankso@361 38 export LC_ALL=POSIX LANG=POSIX
pankso@361 39 export PATH=$PATH:$PREFIX/bin
pankso@361 40 export CROSS_COMPILE=$TARGET-
pankso@361 41 source=$WORK/source
pankso@361 42 logdir=$WORK/log
pankso@361 43 mkdir -p $source $logdir $install
pankso@361 44 cd $source
pankso@361 45 }
pankso@361 46
pankso@361 47 # Get source if not yet in $SRC.
pankso@361 48 download_src() {
pankso@361 49 mkdir -p $SRC && cd $SRC
pankso@361 50 [ -f "binutils-$BINUTILS_VERSION.tar.bz2" ] || wget $BINUTILS_WGET
pankso@361 51 [ -f "linux-$LINUX_VERSION.tar.bz2" ] || wget $LINUX_WGET
pankso@361 52 [ -f "glibc-$GLIBC_VERSION.tar.bz2" ] || wget $GLIBC_WGET
pankso@361 53 [ -f "gcc-$GCC_VERSION.tar.bz2" ] || wget $GCC_WGET
pankso@361 54 [ -f "busybox-$BUSYBOX_VERSION.tar.bz2" ] || wget $BUSYBOX_WGET
pankso@361 55 }
pankso@361 56
pankso@361 57 # 1. Binutils
pankso@361 58 binutils() {
pankso@361 59 echo "Extracting: binutils-$BINUTILS_VERSION.tar.bz2"
pankso@361 60 tar xjf $SRC/binutils-$BINUTILS_VERSION.tar.bz2
pankso@361 61 # Peer arch options --disable-werror
pankso@361 62 case $ARCH in
pankso@361 63 arm) archopts="" ;;
pankso@361 64 x86_64) archopts="" ;;
pankso@361 65 esac
pankso@361 66 cd binutils-$BINUTILS_VERSION
pankso@361 67 ./configure \
pankso@361 68 --prefix=$PREFIX \
pankso@361 69 --target=$TARGET \
pankso@361 70 --enable-targets=$BUILD_SYSTEM \
pankso@361 71 --enable-shared $archopts
pankso@361 72 make || exit 1
pankso@361 73 make install
pankso@361 74 }
pankso@361 75
pankso@361 76 # 2. Kernel headers
pankso@361 77 linux_headers() {
pankso@361 78 echo "Extracting: linux-$LINUX_VERSION.tar.bz2"
pankso@361 79 tar xjf $SRC/linux-$LINUX_VERSION.tar.bz2
pankso@361 80 cd linux-$LINUX_VERSION
pankso@361 81 make mrproper
pankso@361 82 make ARCH=$ARCH headers_check
pankso@361 83 make ARCH=$ARCH headers_install \
pankso@361 84 INSTALL_HDR_PATH=$PREFIX
pankso@361 85 }
pankso@361 86
pankso@361 87 # 3. GCC static (first pass)
pankso@361 88 gcc_static() {
pankso@361 89 echo "Extracting: gcc-$GCC_VERSION.tar.bz2"
pankso@361 90 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2
pankso@361 91 # Peer arch options
pankso@361 92 case $ARCH in
pankso@361 93 arm) archopts="" ;;
pankso@361 94 x86_64) archopts="" ;;
pankso@361 95 esac
pankso@361 96 rm -rf gcc-static
pankso@361 97 mkdir gcc-static && cd gcc-static
pankso@361 98 ../gcc-$GCC_VERSION/configure \
pankso@361 99 --prefix=$PREFIX \
pankso@361 100 --target=$TARGET \
pankso@361 101 --disable-shared \
pankso@361 102 --disable-threads \
pankso@361 103 --without-headers \
pankso@361 104 --with-newlib \
pankso@361 105 --enable-languages=c
pankso@361 106 make all-gcc all-target-libgcc || exit 1
pankso@361 107 make install-gcc install-target-libgcc
pankso@361 108 cd $PREFIX/lib/gcc/$TARGET/$GCC_VERSION
pankso@361 109 ln -s libgcc.a libgcc_eh.a
pankso@361 110 }
pankso@361 111
pankso@361 112 # 4. GNU Glibc
pankso@361 113 glibc() {
pankso@361 114 echo "Extracting: glibc-$GLIBC_VERSION.tar.bz2"
pankso@361 115 tar xjf $SRC/glibc-$GLIBC_VERSION.tar.bz2
pankso@361 116 [ "$continue" ] || rm -rf glibc-build
pankso@361 117 # Peer arch options
pankso@361 118 case $ARCH in
pankso@361 119 arm)
pankso@361 120 archopts=""
pankso@362 121 [ -f "$SRC/glibc-ports-$GLIBC_VERSION.tar.bz2" ] || wget \
pankso@362 122 http://ftp.gnu.org/gnu/libc/glibc-ports-$GLIBC_VERSION.tar.bz2 \
pankso@362 123 -O $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 || exit 1
pankso@361 124 echo "Extracting: glibc-ports-$GLIBC_VERSION.tar.bz2"
pankso@361 125 rm -rf glibc-$GLIBC_VERSION/ports
pankso@361 126 tar xjf $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2
pankso@361 127 mv glibc-ports-$GLIBC_VERSION glibc-$GLIBC_VERSION/ports ;;
pankso@361 128 x86_64)
pankso@361 129 archopts="" ;;
pankso@361 130 esac
pankso@361 131 mkdir -p glibc-build && cd glibc-build
pankso@361 132 BUILD_CC="gcc"
pankso@361 133 CC="$PREFIX/bin/$TARGET-gcc" \
pankso@361 134 libc_cv_forced_unwind=yes \
pankso@361 135 libc_cv_c_cleanup=yes \
pankso@361 136 ../glibc-$GLIBC_VERSION/configure \
pankso@361 137 --prefix=$PREFIX \
pankso@361 138 --host=$TARGET \
pankso@361 139 --with-headers=$PREFIX/include \
pankso@361 140 --with-binutils=$PREFIX/bin \
pankso@361 141 --enable-add-ons
pankso@361 142 make || exit 1
pankso@361 143 make install
pankso@361 144 cd $PREFIX/$TARGET
pankso@361 145 rm -rf lib include
pankso@361 146 ln -s ../lib lib
pankso@361 147 ln -s ../include include
pankso@361 148 }
pankso@361 149
pankso@361 150 # 5. GCC final
pankso@361 151 gcc_final() {
pankso@361 152 if [ ! -d "gcc-$GCC_VERSION" ]; then
pankso@361 153 echo "Extracting: gcc-$GCC_VERSION.tar.bz2"
pankso@361 154 tar xjf $SRC/gcc-$GCC_VERSION.tar.bz2
pankso@361 155 fi
pankso@361 156 # Peer arch options
pankso@361 157 case $ARCH in
pankso@361 158 arm) archopts="" ;;
pankso@361 159 x86_64) archopts="" ;;
pankso@361 160 esac
pankso@361 161 rm -rf gcc-build
pankso@361 162 mkdir gcc-build && cd gcc-build
pankso@361 163 ../gcc-$GCC_VERSION/configure \
pankso@361 164 --prefix=$PREFIX \
pankso@361 165 --target=$TARGET \
pankso@361 166 --enable-shared \
pankso@361 167 --enable-languages=c,c++ \
pankso@361 168 --enable-c99 \
pankso@361 169 --enable-long-long \
pankso@361 170 --enable-__cxa_atexit \
pankso@361 171 --with-pkgversion="SliTaz"
pankso@361 172 make || exit 1
pankso@361 173 make install
pankso@361 174 }
pankso@361 175
pankso@361 176 # Build Busybox to we can create prebuild tiny rootfs image and boot
pankso@361 177 # from NFS ?
pankso@361 178 cross_busybox() {
pankso@361 179 echo "Extracting: busybox-$BUSYBOX_VERSION.tar.bz2"
pankso@361 180 tar xjf $SRC/busybox-$BUSYBOX_VERSION.tar.bz2
pankso@361 181 cd busybox-$BUSYBOX_VERSION
pankso@361 182 # CROSS_COMPILE is exported via init_compile, but be sure.
pankso@361 183 make CROSS_COMPILE=$TARGET- defconfig
pankso@361 184 make CROSS_COMPILE=$TARGET- || exit 1
pankso@361 185 make CROSS_COMPILE=$TARGET- install
pankso@361 186 chmod 4755 _install/bin/busybox
pankso@361 187 readelf -h _install/bin/busybox
pankso@361 188 }
pankso@361 189
pankso@361 190 #
pankso@361 191 # Commands
pankso@361 192 #
pankso@361 193
pankso@361 194 case "$1" in
pankso@361 195 howto|man)
pankso@361 196 doc=/usr/share/doc/cookutils/cross.txt
pankso@361 197 [ -f "$doc" ] && less -E $doc ;;
pankso@361 198 info)
pankso@361 199 init_compile
pankso@361 200 CC=${TARGET}-gcc
pankso@361 201 echo -e "\nCross Toolchain iformation" && separator
pankso@361 202 cat << EOT
pankso@361 203 Target arch : $ARCH
pankso@361 204 C Compiler : $CC
pankso@361 205 Additonal path: /usr/cross/$ARCH/bin
pankso@361 206 EOT
pankso@361 207 separator && echo ""
pankso@361 208 echo "GCC version" && separator
pankso@361 209 $CC -v
pankso@361 210 separator && echo "" ;;
pankso@361 211 testsuite)
pankso@361 212 init_compile
pankso@361 213 echo "[COMPILING] $TARGET-gcc -v -Wall -o test.out test.c" \
pankso@361 214 | tee $logdir/testsuite.log
pankso@361 215 echo 'int main() { return 0; }' > test.c
pankso@361 216 $TARGET-gcc -v -Wall -o test.out test.c 2>&1 | tee -a $logdir/testsuite.log
pankso@361 217 if [ -x /usr/bin/file ]; then
pankso@361 218 echo -e "\n[CHECKING] file test.out" | tee -a $logdir/testsuite.log
pankso@361 219 file test.out | tee -a $logdir/testsuite.log
pankso@361 220 fi
pankso@361 221 echo -e "\n[CHECKING] readelf -h test.out" | tee -a $logdir/testsuite.log
pankso@361 222 readelf -h test.out | tee -a $logdir/testsuite.log ;;
pankso@361 223 check-host)
pankso@361 224 for pkg in mpfr mpfr-dev gmp gmp-dev mpc-library gawk autoconf
pankso@361 225 do
pankso@361 226 if [ ! -d "/var/lib/tazpkg/installed/$pkg" ]; then
pankso@361 227 echo "Missing packages: $pkg"
pankso@361 228 [ "$install" ] && tazpkg -gi $pkg
pankso@361 229 fi
pankso@361 230 done ;;
pankso@361 231 download)
pankso@361 232 download_src ;;
pankso@361 233 clean)
pankso@361 234 echo -n "Remove all source files..."
pankso@361 235 rm -rf $WORK/source/* && status
pankso@361 236 [ "$log" ] && rm -f $WORK/log/*.log
pankso@361 237 echo "To clean chroot: rm -rf $PREFIX" ;;
pankso@361 238 show-log)
pankso@361 239 pkg=$2
pankso@361 240 less -E $logdir/$pkg.log ;;
pankso@361 241 binutils)
pankso@361 242 init_compile
pankso@361 243 rm -f $logdir/binutils.log
pankso@361 244 binutils 2>&1 | tee $logdir/binutils.log ;;
pankso@361 245 linux-headers)
pankso@361 246 init_compile
pankso@363 247 linux_headers 2>&1 | tee $logdir/linux-headers.log ;;
pankso@361 248 gcc-static)
pankso@361 249 init_compile
pankso@361 250 gcc_static 2>&1 | tee $logdir/gcc-static.log ;;
pankso@361 251 glibc)
pankso@361 252 init_compile
pankso@361 253 glibc 2>&1 | tee $logdir/glibc.log ;;
pankso@361 254 gcc-final)
pankso@361 255 init_compile
pankso@361 256 gcc_final 2>&1 | tee $logdir/gcc-final.log ;;
pankso@361 257 busybox)
pankso@361 258 init_compile
pankso@361 259 cross_busybox 2>&1 | tee $logdir/busybox.log ;;
pankso@361 260 compile)
pankso@361 261 init_compile
pankso@361 262 echo "Compile start: $(date)" | tee $logdir/compile.log
pankso@361 263 download_src
pankso@361 264 binutils 2>&1 | tee $logdir/binutils.log
pankso@361 265 linux_headers 2>&1 | tee $logdir/linux-headers.log
pankso@361 266 gcc_static 2>&1 | tee $logdir/gcc-static.log
pankso@361 267 glibc 2>&1 | tee $logdir/glibc.log
pankso@361 268 gcc_final 2>&1 | tee $logdir/gcc-final.log
pankso@361 269 echo ""
pankso@361 270 echo "Compile end: $(date)" | tee -a $logdir/compile.log
pankso@361 271 echo "" ;;
pankso@361 272 *)
pankso@361 273 usage ;;
pankso@361 274 esac
pankso@361 275