cookutils annotate cross @ rev 905
cook: got separate {pre;post}_{install;remove} functions for every package; tweak copy(); lighttpd/index.cgi: fix links with '+' in activity log.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Sat May 27 16:23:38 2017 +0300 (2017-05-27) |
parents | 3f0ca4492ec7 |
children |
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 # |
al@728 | 5 # Copyright 2012-2015 (C) SliTaz GNU/Linux - BSD License |
pankso@361 | 6 # Author: Christophe Lincoln <pankso@slitaz.org> |
pankso@361 | 7 # |
al@728 | 8 |
pankso@361 | 9 . /lib/libtaz.sh |
pankso@370 | 10 |
pankso@370 | 11 [ -f "/etc/slitaz/cross.conf" ] && . /etc/slitaz/cross.conf |
pankso@370 | 12 [ -f "cross.conf" ] && . ./cross.conf |
pankso@361 | 13 |
al@728 | 14 |
pankso@374 | 15 # Handle --config=/path/to/cross.conf |
al@728 | 16 |
pankso@374 | 17 [ "$config" ] && . $config |
al@728 | 18 source="$WORK/source" |
al@728 | 19 tools="$WORK/tools" |
al@728 | 20 sysroot="$WORK/sysroot" |
al@728 | 21 logdir="$WORK/log" |
al@728 | 22 |
pankso@374 | 23 |
pankso@649 | 24 # Cross-tools tarballs |
al@728 | 25 |
pankso@649 | 26 binutils_tarball="binutils-$BINUTILS_VERSION.tar.bz2" |
pankso@649 | 27 linux_tarball="linux-$LINUX_VERSION.tar.xz" |
pankso@649 | 28 glibc_tarball="glibc-$GLIBC_VERSION.tar.bz2" |
pankso@649 | 29 eglibc_tarball="eglibc-$EGLIBC_VERSION.tar.bz2" |
pankso@649 | 30 gcc_tarball="gcc-$GCC_VERSION.tar.bz2" |
pankso@654 | 31 libtool_tarball="libtool-$LIBTOOL_VERSION.tar.gz" |
pankso@649 | 32 |
al@728 | 33 |
pankso@649 | 34 # Cross-tools URLs |
al@728 | 35 |
pankso@649 | 36 binutils_wget="http://ftp.gnu.org/gnu/binutils/$binutils_tarball" |
pankso@649 | 37 linux_wget="http://www.kernel.org/pub/linux/kernel/v3.x/$linux_tarball" |
pankso@649 | 38 glibc_wget="http://ftp.gnu.org/gnu/libc/$glibc_tarball" |
pankso@681 | 39 eglibc_wget="http://mirror.slitaz.org/arm/src/$eglibc_tarball" |
pankso@681 | 40 eglibc_svn="svn://svn.eglibc.org/branches/eglibc-2_14" |
pankso@649 | 41 gcc_wget="http://ftp.gnu.org/gnu/gcc/gcc-$GCC_VERSION/$gcc_tarball" |
pankso@654 | 42 libtool_wget="ftp://sunsite.cnlab-switch.ch/mirror/gnu/libtool/$libtool_tarball" |
pankso@649 | 43 |
al@728 | 44 |
pankso@361 | 45 # Help and usage. |
al@728 | 46 |
pankso@361 | 47 usage() { |
al@728 | 48 cat <<EOT |
pankso@361 | 49 |
pankso@361 | 50 Usage: $(basename $0) command --option |
pankso@361 | 51 |
pankso@361 | 52 Commands: |
paul@495 | 53 howto Man[like] page and howto |
paul@382 | 54 info Display cross-tools info |
pankso@361 | 55 testsuite Execute a small testsuite |
pankso@654 | 56 [arch]-setup Setup build host environment |
pankso@361 | 57 download Download necessary sources |
pankso@654 | 58 show-log Show a package compile log |
pankso@361 | 59 binutils Compile Binutils |
pankso@421 | 60 linux-headers Install Kernel headers |
pankso@361 | 61 gcc-static Compile GCC static |
pankso@654 | 62 glibc Compile GNU Glibc library |
pankso@654 | 63 eglibc Compile EGlibc libc library |
pankso@361 | 64 gcc-final Compile final GCC |
pankso@361 | 65 compile Compile everything at once |
pankso@654 | 66 libtool Cross GNU Libtool (test in receipt LIBTOOL=) |
pankso@889 | 67 libhack Fix libxx.la files with libdir='/usr/lib' |
pankso@419 | 68 clean Clean-up build environment |
pankso@441 | 69 clean-tools Clean: $tools |
paul@455 | 70 gen-prebuilt Create a prebuilt toolchain archive |
pankso@361 | 71 |
pankso@361 | 72 EOT |
pankso@361 | 73 } |
pankso@361 | 74 |
al@728 | 75 |
pankso@420 | 76 # Prebuilt README |
al@728 | 77 |
pankso@420 | 78 prebuilt_readme() { |
al@728 | 79 echo -n 'Creating toolchain README...' |
al@728 | 80 cat >> $package/README <<EOT |
pankso@420 | 81 |
pankso@420 | 82 SliTaz Prebuilt $ARCH cross toolchain |
pankso@420 | 83 ================================================================================ |
pankso@420 | 84 Move this $ARCH cross compilation toolchain to /usr/cross then add tools |
pankso@420 | 85 to your PATH environment and test the toolchain: |
pankso@420 | 86 |
pankso@441 | 87 # mv $ARCH /cross |
pankso@441 | 88 # export PATH=\$PATH:/cross/$ARCH/tools/bin |
pankso@420 | 89 |
pankso@420 | 90 # echo 'int main() { return 0; }' > test.c |
pankso@420 | 91 # $TARGET-gcc -v -o test.out test.c |
pankso@420 | 92 # readelf -h test.out |
pankso@420 | 93 |
pankso@420 | 94 ================================================================================ |
pankso@420 | 95 |
pankso@420 | 96 EOT |
pankso@420 | 97 status |
pankso@420 | 98 } |
pankso@420 | 99 |
al@728 | 100 |
pankso@361 | 101 # Make sure we have all directories. |
al@728 | 102 |
pankso@361 | 103 init_compile() { |
pankso@441 | 104 unset CFLAGS CXXFLAGS |
pankso@361 | 105 export LC_ALL=POSIX LANG=POSIX |
pankso@441 | 106 export PATH=$PATH:$tools/bin |
pankso@400 | 107 export CROSS_COMPILE=${TARGET}- |
pankso@441 | 108 mkdir -p $source $logdir $sysroot $tools |
pankso@441 | 109 echo "Tools prefix : --prefix=$tools " |
pankso@441 | 110 echo "Target sysroot : --with-sysroot=$sysroot" |
pankso@361 | 111 cd $source |
pankso@361 | 112 } |
pankso@361 | 113 |
al@728 | 114 |
pankso@651 | 115 # Some arch may need custom CFLAGS to build Glibc/Eglibc |
al@728 | 116 |
pankso@651 | 117 init_cflags() { |
pankso@651 | 118 case "$ARCH" in |
pankso@653 | 119 arm|armv6) export CFLAGS="-O2 -march=armv6" ;; |
al@728 | 120 armv6hf) export CFLAGS="-O2 -march=armv6j" ;; |
al@728 | 121 armv7) export CFLAGS="-Os -march=armv7-a" ;; |
pankso@651 | 122 esac |
pankso@651 | 123 } |
pankso@651 | 124 |
al@728 | 125 |
pankso@361 | 126 # Get source if not yet in $SRC. |
al@728 | 127 |
pankso@361 | 128 download_src() { |
al@728 | 129 mkdir -p $SRC; cd $SRC |
pankso@649 | 130 [ -f "$binutils_tarball" ] || wget $binutils_wget |
al@728 | 131 [ -f "$linux_tarball" ] || wget --no-check-certificate $linux_wget |
al@728 | 132 [ -f "$glibc_tarball" ] || wget $glibc_wget |
al@728 | 133 [ -f "$eglibc_tarball" ] || wget $eglibc_wget |
al@728 | 134 [ -f "$gcc_tarball" ] || wget $gcc_wget |
al@728 | 135 [ -f "$libtool_tarball" ] || wget $libtool_wget |
pankso@403 | 136 } |
pankso@403 | 137 |
al@728 | 138 |
pankso@361 | 139 # 1. Binutils |
al@728 | 140 |
pankso@361 | 141 binutils() { |
pankso@408 | 142 init_compile |
pankso@411 | 143 rm -rf binutils-$BINUTILS_VERSION |
pankso@649 | 144 echo "Extracting: $binutils_tarball" |
al@728 | 145 tar -xjf $SRC/$binutils_tarball |
pankso@421 | 146 echo "Configure: $BINUTILS_ARGS" |
pankso@361 | 147 cd binutils-$BINUTILS_VERSION |
pankso@361 | 148 ./configure \ |
pankso@441 | 149 --prefix=$tools \ |
pankso@361 | 150 --target=$TARGET \ |
pankso@440 | 151 --enable-plugins \ |
pankso@440 | 152 --enable-threads \ |
pankso@361 | 153 --enable-targets=$BUILD_SYSTEM \ |
pankso@441 | 154 --with-sysroot=$sysroot \ |
pankso@442 | 155 $BINUTILS_ARGS && |
pankso@361 | 156 make || exit 1 |
pankso@361 | 157 make install |
pankso@421 | 158 echo "cross: binutils compiled on: $(date)" |
pankso@361 | 159 } |
pankso@361 | 160 |
al@728 | 161 |
paul@455 | 162 # 2. Kernel headers could use CROSS_COMPILE but gcc is not yet built. |
al@728 | 163 |
pankso@421 | 164 linux_headers() { |
pankso@421 | 165 init_compile |
pankso@451 | 166 if [ ! -d "linux-$LINUX_VERSION" ]; then |
pankso@649 | 167 echo "Extracting: $linux_tarball" |
al@728 | 168 tar -xJf $SRC/$linux_tarball |
pankso@451 | 169 fi |
pankso@649 | 170 case "$ARCH" in |
al@728 | 171 armv6hf) KARCH='arm' ;; |
al@728 | 172 *) KARCH="$ARCH" ;; |
pankso@649 | 173 esac |
pankso@451 | 174 rm -rf linux-headers |
pankso@421 | 175 cd linux-$LINUX_VERSION |
pankso@649 | 176 make CROSS_COMPILE="" mrproper |
pankso@649 | 177 make ARCH=$KARCH headers_check |
pankso@649 | 178 make ARCH=$KARCH headers_install \ |
pankso@450 | 179 INSTALL_HDR_PATH=$source/linux-headers |
pankso@453 | 180 rm $source/linux-headers/include/.*install* |
pankso@450 | 181 echo "Copying headers to: $sysroot/usr" |
pankso@681 | 182 mkdir -p $sysroot/usr |
pankso@450 | 183 cp -a $source/linux-headers/* $sysroot/usr |
pankso@421 | 184 } |
pankso@421 | 185 |
al@728 | 186 |
pankso@447 | 187 # 2.1 Glibc headers needed to compile x86_64 gcc-static. |
al@728 | 188 |
pankso@447 | 189 glibc_headers() { |
pankso@447 | 190 init_compile |
pankso@649 | 191 echo "Extracting: $glibc_tarball" |
al@728 | 192 tar -xjf $SRC/$glibc_tarball |
pankso@447 | 193 rm -rf glibc-headers |
al@728 | 194 mkdir glibc-headers; cd glibc-headers |
pankso@450 | 195 libc_cv_forced_unwind=yes \ |
pankso@450 | 196 libc_cv_c_cleanup=yes \ |
pankso@447 | 197 ../glibc-$GLIBC_VERSION/configure \ |
pankso@447 | 198 --prefix=/usr \ |
pankso@447 | 199 --host=$TARGET \ |
pankso@447 | 200 --with-headers=$sysroot/usr/include \ |
pankso@447 | 201 --without-cvs \ |
pankso@447 | 202 --disable-sanity-checks \ |
pankso@447 | 203 --enable-kernel=2.6.32 && |
pankso@447 | 204 make -k install-headers install_root=$sysroot |
pankso@448 | 205 # Fixes |
pankso@448 | 206 mkdir -p $sysroot/usr/include/gnu |
pankso@448 | 207 touch $sysroot/usr/include/gnu/stubs.h |
al@728 | 208 |
paul@879 | 209 # Fix error: bits/stdio_lim.h not found |
erjo@680 | 210 #cp bits/stdio_lim.h $sysroot/usr/include/bits |
erjo@680 | 211 cp /usr/include/bits/stdio_lim.h $sysroot/usr/include/bits |
pankso@447 | 212 } |
pankso@447 | 213 |
al@728 | 214 |
pankso@421 | 215 # 3. GCC static (first pass) |
al@728 | 216 |
pankso@361 | 217 gcc_static() { |
pankso@408 | 218 init_compile |
pankso@649 | 219 echo "Extracting: $gcc_tarball" |
al@728 | 220 tar -xjf $SRC/$gcc_tarball |
pankso@421 | 221 echo "Configure: $GCC_STATIC_ARGS" |
pankso@361 | 222 rm -rf gcc-static |
al@728 | 223 mkdir gcc-static; cd gcc-static |
pankso@361 | 224 ../gcc-$GCC_VERSION/configure \ |
pankso@441 | 225 --prefix=$tools \ |
pankso@441 | 226 --libexec=$tools/lib \ |
pankso@361 | 227 --target=$TARGET \ |
pankso@361 | 228 --disable-shared \ |
pankso@361 | 229 --disable-threads \ |
pankso@441 | 230 --disable-libgomp \ |
pankso@441 | 231 --disable-libmudflap \ |
pankso@441 | 232 --disable-libssp \ |
pankso@361 | 233 --without-headers \ |
pankso@361 | 234 --with-newlib \ |
pankso@441 | 235 --with-sysroot=$sysroot \ |
pankso@442 | 236 $GCC_STATIC_ARGS && |
pankso@361 | 237 make all-gcc all-target-libgcc || exit 1 |
pankso@361 | 238 make install-gcc install-target-libgcc |
pankso@421 | 239 echo "cross: gcc-static compiled on: $(date)" |
pankso@403 | 240 } |
pankso@403 | 241 |
al@728 | 242 |
pankso@651 | 243 # 4. GNU Glibc: TODO Improve ARM support |
al@728 | 244 |
pankso@361 | 245 glibc() { |
pankso@408 | 246 init_compile |
pankso@649 | 247 echo "Extracting: $glibc_tarball" |
al@728 | 248 tar -xjf $SRC/$glibc_tarball |
pankso@421 | 249 echo "Configure: $GLIBC_ARGS" |
pankso@400 | 250 # Some arch may need glibc-ports and custom CFLAGS |
pankso@403 | 251 case "$ARCH" in |
pankso@650 | 252 arm*) |
al@728 | 253 export CFLAGS='-march=armv6 -O2' |
pankso@362 | 254 [ -f "$SRC/glibc-ports-$GLIBC_VERSION.tar.bz2" ] || wget \ |
pankso@362 | 255 http://ftp.gnu.org/gnu/libc/glibc-ports-$GLIBC_VERSION.tar.bz2 \ |
pankso@362 | 256 -O $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 || exit 1 |
pankso@361 | 257 echo "Extracting: glibc-ports-$GLIBC_VERSION.tar.bz2" |
pankso@361 | 258 rm -rf glibc-$GLIBC_VERSION/ports |
al@728 | 259 tar -xjf $SRC/glibc-ports-$GLIBC_VERSION.tar.bz2 |
pankso@449 | 260 mv glibc-ports-$GLIBC_VERSION glibc-$GLIBC_VERSION/ports |
al@728 | 261 libexec='/usr/lib/glibc' ;; |
pankso@418 | 262 x86_64) |
pankso@653 | 263 #export CFLAGS="-02 -march=generic -pipe" |
al@728 | 264 ccflags='-m64' |
al@728 | 265 libexec='/usr/lib64/glibc' ;; |
pankso@361 | 266 esac |
pankso@441 | 267 # Disable linking to libgcc_eh |
pankso@441 | 268 cd glibc-$GLIBC_VERSION |
pankso@441 | 269 cp Makeconfig Makeconfig.orig |
pankso@441 | 270 sed -e 's/-lgcc_eh//g' Makeconfig.orig > Makeconfig |
pankso@441 | 271 cd .. |
pankso@421 | 272 echo "CFLAGS: $CFLAGS" |
pankso@441 | 273 rm -rf glibc-build |
al@728 | 274 mkdir -p glibc-build; cd glibc-build |
pankso@365 | 275 BUILD_CC="gcc" \ |
pankso@418 | 276 CC="${TARGET}-gcc $ccflags" \ |
pankso@441 | 277 AR="${TARGET}-ar" \ |
pankso@441 | 278 RANLIB="${TARGET}-ranlib" \ |
pankso@361 | 279 libc_cv_forced_unwind=yes \ |
pankso@361 | 280 libc_cv_c_cleanup=yes \ |
pankso@361 | 281 ../glibc-$GLIBC_VERSION/configure \ |
pankso@441 | 282 --prefix=/usr \ |
pankso@449 | 283 --libexec=$libexec \ |
pankso@361 | 284 --host=$TARGET \ |
pankso@441 | 285 --with-headers=$sysroot/usr/include \ |
pankso@441 | 286 --with-binutils=$tools/bin \ |
pankso@425 | 287 --enable-kernel=2.6.32 \ |
pankso@442 | 288 $GLIBC_ARGS && |
pankso@361 | 289 make || exit 1 |
pankso@441 | 290 make install_root=$sysroot install |
pankso@454 | 291 # Symlink lib64 to lib |
pankso@454 | 292 case "$ARCH" in |
pankso@454 | 293 x86_64) |
pankso@454 | 294 rm -f $sysroot/lib $sysroot/usr/lib |
al@728 | 295 cd $sysroot; ln -s lib64 lib |
al@728 | 296 cd usr; ln -s lib64 lib ;; |
pankso@454 | 297 esac |
pankso@421 | 298 echo "cross: glibc compiled on: $(date)" |
pankso@361 | 299 } |
pankso@361 | 300 |
al@728 | 301 |
pankso@649 | 302 # 4. eglibc: always use --prefix=/usr |
al@728 | 303 |
pankso@441 | 304 eglibc() { |
pankso@441 | 305 init_compile |
pankso@651 | 306 init_cflags |
pankso@441 | 307 rm -rf eglibc-build eglibc-$EGLIBC_VERSION |
pankso@681 | 308 if [ ! -f "$SRC/$eglibc_tarball" ]; then |
pankso@681 | 309 echo "Missing: $SRC/$eglibc_tarball" |
pankso@681 | 310 exit 1 |
pankso@681 | 311 fi |
pankso@649 | 312 echo "Extracting: $eglibc_tarball" |
al@728 | 313 tar -xjf $SRC/$eglibc_tarball || exit 1 |
pankso@650 | 314 case "$ARCH" in |
pankso@650 | 315 arm*) |
pankso@441 | 316 if [ ! -d "$source/eglibc-ports-$EGLIBC_VERSION" ]; then |
pankso@681 | 317 echo "Cloning $eglibc_svn/ports" |
pankso@681 | 318 svn co $eglibc_svn/ports eglibc-ports-$EGLIBC_VERSION >/dev/null |
pankso@441 | 319 fi |
pankso@449 | 320 cp -a eglibc-ports-$EGLIBC_VERSION eglibc-$EGLIBC_VERSION/ports |
al@728 | 321 libexec='/usr/lib/eglibc' ;; |
pankso@441 | 322 x86_64) |
pankso@449 | 323 #export CFLAGS="-march=nocona -O2 -pipe" |
al@728 | 324 ccflags='-m64' |
al@728 | 325 libexec='/usr/lib64/eglibc' ;; |
pankso@441 | 326 esac |
pankso@441 | 327 # Disable linking to libgcc_eh |
pankso@441 | 328 cd eglibc-$EGLIBC_VERSION |
pankso@441 | 329 cp Makeconfig Makeconfig.orig |
pankso@441 | 330 sed -e 's/-lgcc_eh//g' Makeconfig.orig > Makeconfig |
pankso@441 | 331 cd .. |
pankso@651 | 332 echo "CFLAGS: $CFLAGS" |
al@728 | 333 mkdir -p eglibc-build; cd eglibc-build |
pankso@441 | 334 # config.cache |
al@728 | 335 cat > config.cache <<EOT |
pankso@441 | 336 libc_cv_forced_unwind=yes |
pankso@441 | 337 libc_cv_c_cleanup=yes |
pankso@441 | 338 libc_cv_gnu89_inline=yes |
pankso@441 | 339 EOT |
al@728 | 340 BUILD_CC='gcc' \ |
pankso@441 | 341 CC="${TARGET}-gcc $ccflags" \ |
pankso@441 | 342 AR="${TARGET}-ar" \ |
pankso@441 | 343 RANLIB="${TARGET}-ranlib" \ |
pankso@441 | 344 ../eglibc-$EGLIBC_VERSION/configure \ |
pankso@441 | 345 --prefix=/usr \ |
pankso@449 | 346 --libexec=$libexec \ |
pankso@441 | 347 --host=$TARGET \ |
pankso@441 | 348 --with-headers=$sysroot/usr/include \ |
pankso@441 | 349 --with-binutils=$tools/bin \ |
pankso@441 | 350 --enable-kernel=2.6.32 \ |
pankso@441 | 351 --with-__thread \ |
pankso@441 | 352 --without-gd \ |
pankso@441 | 353 --without-cvs \ |
pankso@441 | 354 --cache-file=config.cache \ |
pankso@442 | 355 $EGLIBC_ARGS && |
pankso@441 | 356 make || exit 1 |
pankso@681 | 357 make install_root=$sysroot install || exit 1 |
pankso@681 | 358 # Sep files for packaging |
pankso@681 | 359 make install_root=$source/eglibc-install install || exit 1 |
pankso@641 | 360 echo "cross: eglibc compiled on: $(date)" |
pankso@441 | 361 } |
pankso@441 | 362 |
al@728 | 363 |
pankso@361 | 364 # 5. GCC final |
al@728 | 365 |
pankso@361 | 366 gcc_final() { |
pankso@408 | 367 init_compile |
pankso@361 | 368 if [ ! -d "gcc-$GCC_VERSION" ]; then |
pankso@649 | 369 echo "Extracting: $gcc_tarball" |
al@728 | 370 tar -xjf $SRC/$gcc_tarball |
pankso@361 | 371 fi |
pankso@421 | 372 echo "Configure: $GCC_FINAL_ARGS" |
pankso@441 | 373 rm -rf gcc-build |
al@728 | 374 mkdir -p gcc-build; cd gcc-build |
pankso@441 | 375 AR=ar \ |
pankso@361 | 376 ../gcc-$GCC_VERSION/configure \ |
pankso@441 | 377 --prefix=$tools \ |
pankso@441 | 378 --libexec=$tools/lib \ |
pankso@361 | 379 --target=$TARGET \ |
pankso@361 | 380 --enable-shared \ |
pankso@361 | 381 --enable-c99 \ |
pankso@361 | 382 --enable-long-long \ |
pankso@361 | 383 --enable-__cxa_atexit \ |
pankso@440 | 384 --with-system-zlib \ |
pankso@440 | 385 --enable-plugin \ |
pankso@440 | 386 --disable-multilib \ |
pankso@440 | 387 --disable-libssp \ |
pankso@441 | 388 --disable-checking \ |
pankso@441 | 389 --disable-werror \ |
pankso@400 | 390 --with-pkgversion="SliTaz" \ |
pankso@648 | 391 --with-bugurl="http://bugs.slitaz.org/" \ |
pankso@442 | 392 --with-sysroot=$sysroot \ |
pankso@442 | 393 $GCC_FINAL_ARGS && |
pankso@441 | 394 make AS_FOR_TARGET="${TARGET}-as" \ |
pankso@441 | 395 LD_FOR_TARGET="${TARGET}-ld" || exit 1 |
pankso@441 | 396 make install |
pankso@421 | 397 echo "cross: GCC final compiled on: $(date)" |
pankso@361 | 398 } |
pankso@361 | 399 |
al@728 | 400 |
pankso@654 | 401 # A cross libtool should avoid some shared libs path/format bugs |
al@728 | 402 |
pankso@654 | 403 cross_libtool() { |
pankso@654 | 404 init_compile |
pankso@654 | 405 [ "$clean" ] && rm -rf libtool-${LIBTOOL_VERSION} |
pankso@654 | 406 if [ ! -d "libtool-$LIBTOOL_VERSION" ]; then |
pankso@654 | 407 echo "Extracting: $libtool_tarball" |
al@728 | 408 tar -xzf $SRC/$libtool_tarball |
pankso@654 | 409 fi |
pankso@654 | 410 cd libtool-${LIBTOOL_VERSION} |
pankso@654 | 411 ./configure \ |
pankso@654 | 412 --prefix=$tools \ |
pankso@654 | 413 --host=${TARGET} \ |
pankso@654 | 414 --program-prefix=${TARGET}- && |
pankso@654 | 415 make || exit 1 |
pankso@654 | 416 make install |
pankso@654 | 417 echo "cross: Cross libtool compiled on: $(date)" |
pankso@654 | 418 } |
pankso@654 | 419 |
al@728 | 420 |
pankso@361 | 421 # |
pankso@361 | 422 # Commands |
pankso@361 | 423 # |
pankso@361 | 424 |
pankso@361 | 425 case "$1" in |
pankso@361 | 426 howto|man) |
al@728 | 427 doc='/usr/share/doc/cookutils/cross.txt' |
pankso@361 | 428 [ -f "$doc" ] && less -E $doc ;; |
al@728 | 429 |
pankso@361 | 430 info) |
pankso@361 | 431 init_compile |
pankso@651 | 432 init_cflags |
pankso@361 | 433 CC=${TARGET}-gcc |
al@728 | 434 echo -e '\nCross Toolchain information'; separator |
pankso@374 | 435 [ "$config" ] && echo "Config file : $config" |
al@728 | 436 cat <<EOT |
pankso@374 | 437 Target arch : $ARCH |
pankso@374 | 438 C Compiler : $CC |
pankso@651 | 439 CFLAGS : $CFLAGS |
pankso@374 | 440 Build directory : $WORK |
pankso@441 | 441 Tools prefix : $tools/bin |
pankso@441 | 442 Arch sysroot : $sysroot |
pankso@361 | 443 EOT |
al@728 | 444 separator; newline |
al@728 | 445 echo 'GCC version'; separator |
pankso@441 | 446 if [ -x "$tools/bin/$CC" ]; then |
pankso@374 | 447 $CC -v |
pankso@374 | 448 else |
al@728 | 449 echo 'No C compiler. To build a toolchain run: cross compile' |
pankso@441 | 450 echo "Missing: $tools/bin/$CC" |
pankso@374 | 451 fi |
al@728 | 452 separator; newline ;; |
al@728 | 453 |
pankso@361 | 454 testsuite) |
pankso@361 | 455 init_compile |
pankso@361 | 456 echo "[COMPILING] $TARGET-gcc -v -Wall -o test.out test.c" \ |
pankso@361 | 457 | tee $logdir/testsuite.log |
pankso@361 | 458 echo 'int main() { return 0; }' > test.c |
pankso@361 | 459 $TARGET-gcc -v -Wall -o test.out test.c 2>&1 | tee -a $logdir/testsuite.log |
pankso@361 | 460 if [ -x /usr/bin/file ]; then |
pankso@361 | 461 echo -e "\n[CHECKING] file test.out" | tee -a $logdir/testsuite.log |
pankso@361 | 462 file test.out | tee -a $logdir/testsuite.log |
pankso@361 | 463 fi |
pankso@361 | 464 echo -e "\n[CHECKING] readelf -h test.out" | tee -a $logdir/testsuite.log |
pankso@361 | 465 readelf -h test.out | tee -a $logdir/testsuite.log ;; |
al@728 | 466 |
pankso@649 | 467 *setup) |
al@728 | 468 data='/usr/share/cross' |
pankso@649 | 469 arch=${1%-setup} |
al@728 | 470 [ "$arch" == 'setup' ] && arch="arm" |
al@728 | 471 |
al@728 | 472 newline; echo 'Checking: build system packages' |
pankso@421 | 473 for pkg in slitaz-toolchain mpfr mpfr-dev gmp gmp-dev mpc-library \ |
pankso@421 | 474 gawk autoconf; do |
pankso@361 | 475 if [ ! -d "/var/lib/tazpkg/installed/$pkg" ]; then |
pankso@361 | 476 echo "Missing packages: $pkg" |
pankso@421 | 477 if [ -x /usr/sbin/spk-add ]; then |
pankso@421 | 478 spk-add $pkg |
pankso@421 | 479 else |
pankso@421 | 480 tazpkg -gi $pkg |
pankso@421 | 481 fi |
pankso@361 | 482 fi |
pankso@421 | 483 done |
pankso@649 | 484 echo "Getting $arch cross.conf" |
pankso@649 | 485 cp -f ${data}/cross-${arch}.conf /etc/slitaz/cross.conf |
pankso@649 | 486 cook ${arch}-setup |
pankso@649 | 487 newline ;; |
al@728 | 488 |
pankso@361 | 489 download) |
pankso@361 | 490 download_src ;; |
al@728 | 491 |
pankso@361 | 492 show-log) |
pankso@361 | 493 pkg=$2 |
pankso@371 | 494 log=$logdir/$pkg.log |
pankso@371 | 495 if [ ! -f "$log" ]; then |
al@728 | 496 echo "No log file found for: $pkg" |
al@728 | 497 exit 1 |
pankso@371 | 498 fi |
pankso@371 | 499 less -E $log ;; |
al@728 | 500 |
pankso@361 | 501 binutils) |
pankso@412 | 502 rm -f $logdir/binutils.log |
pankso@361 | 503 binutils 2>&1 | tee $logdir/binutils.log ;; |
al@728 | 504 |
pankso@447 | 505 linux-headers) |
pankso@447 | 506 linux_headers 2>&1 | tee $logdir/linux-headers.log ;; |
al@728 | 507 |
pankso@447 | 508 glibc-headers) |
pankso@447 | 509 glibc_headers 2>&1 | tee $logdir/glibc-headers.log ;; |
al@728 | 510 |
pankso@403 | 511 gcc-static) |
pankso@403 | 512 gcc_static 2>&1 | tee $logdir/gcc-static.log ;; |
al@728 | 513 |
pankso@361 | 514 glibc) |
pankso@361 | 515 glibc 2>&1 | tee $logdir/glibc.log ;; |
al@728 | 516 |
pankso@441 | 517 eglibc) |
pankso@441 | 518 eglibc 2>&1 | tee $logdir/eglibc.log ;; |
al@728 | 519 |
pankso@361 | 520 gcc-final) |
pankso@361 | 521 gcc_final 2>&1 | tee $logdir/gcc-final.log ;; |
al@728 | 522 |
pankso@361 | 523 compile) |
pankso@400 | 524 # Compile the full toolchain. |
pankso@400 | 525 time=$(date +%s) |
pankso@361 | 526 init_compile |
pankso@361 | 527 echo "Compile start: $(date)" | tee $logdir/compile.log |
pankso@361 | 528 download_src |
pankso@361 | 529 binutils 2>&1 | tee $logdir/binutils.log |
pankso@447 | 530 case "$ARCH" in |
pankso@447 | 531 x86_64) glibc_headers 2>&1 | tee $logdir/glibc-headers.log ;; |
pankso@447 | 532 esac |
pankso@652 | 533 linux_headers 2>&1 | tee $logdir/linux-headers.log |
pankso@403 | 534 gcc_static 2>&1 | tee $logdir/gcc-static.log |
pankso@441 | 535 case "$ARCH" in |
al@728 | 536 arm*) eglibc 2>&1 | tee $logdir/eglibc.log ;; |
pankso@441 | 537 x86_64) glibc 2>&1 | tee $logdir/glibc.log ;; |
pankso@441 | 538 esac |
pankso@361 | 539 gcc_final 2>&1 | tee $logdir/gcc-final.log |
al@728 | 540 newline |
pankso@365 | 541 echo "Compile end : $(date)" | tee -a $logdir/compile.log |
pankso@400 | 542 time=$(($(date +%s) - $time)) |
pankso@400 | 543 sec=$time |
pankso@400 | 544 div=$(( ($time + 30) / 60)) |
pankso@400 | 545 [ "$div" != 0 ] && min="~ ${div}m" |
pankso@401 | 546 echo "Build time : ${sec}s $min" | tee -a $logdir/compile.log |
pankso@361 | 547 echo "" ;; |
al@728 | 548 |
pankso@654 | 549 libtool) |
pankso@654 | 550 cross_libtool 2>&1 | tee $logdir/libtool.log ;; |
al@728 | 551 |
pankso@655 | 552 libhack) |
pankso@655 | 553 # Some libxx.la files have libdir='/usr/lib' and make packages |
paul@684 | 554 # cross compilation fail. Some receipts may have got hacked to force |
paul@684 | 555 # use of libs in sysroot but 'cross libhack' should be preferred. |
pankso@655 | 556 echo "Libdir: $sysroot/usr/lib" |
al@728 | 557 for la in $(fgrep -l libdir= $sysroot/usr/lib/*.la 2>/dev/null); do |
pankso@655 | 558 if fgrep -q "libdir='/usr/lib'" ${la}; then |
pankso@655 | 559 echo "Cross fixing: $(basename $la)" |
pankso@655 | 560 sed -i s"#libdir=.*#libdir='/cross/$ARCH/sysroot/usr/lib'#" ${la} |
pankso@655 | 561 fi |
pankso@655 | 562 done ;; |
al@728 | 563 |
pankso@416 | 564 clean) |
al@728 | 565 echo -n 'Removing all source files...' |
al@728 | 566 rm -rf $WORK/source; status |
pankso@441 | 567 [ "$log" ] && rm -f $WORK/log/*.log ;; |
al@728 | 568 |
pankso@371 | 569 clean-tools) |
pankso@371 | 570 # Remove crap :-) |
pankso@371 | 571 init_compile |
pankso@441 | 572 echo "Cleaning : $tools ($(du -sh $tools | awk '{print $1}'))" |
al@728 | 573 for file in share/info share/man share/local; do |
pankso@440 | 574 echo -n "Removing : $file" |
al@728 | 575 rm -rf $tools/$file; status |
pankso@371 | 576 done |
pankso@419 | 577 echo -n "Stripping : shared libs and binaries" |
al@728 | 578 find $tools/bin -type f -exec strip -s '{}' 2>/dev/null \; |
al@728 | 579 find $tools/lib -name cc1* -exec strip -s '{}' 2>/dev/null \; |
al@728 | 580 find $tools/lib -name lto* -exec strip -s '{}' 2>/dev/null \; |
pankso@444 | 581 find $sysroot -name "*.so*" -exec ${TARGET}-strip -s '{}' 2>/dev/null \; |
al@728 | 582 sleep 1; status |
al@728 | 583 echo -n "Tools size : "; du -sh $tools | awk '{print $1}' ;; |
al@728 | 584 |
pankso@416 | 585 gen-prebuilt) |
pankso@420 | 586 # Create a prebuilt cross toolchain tarball. |
pankso@416 | 587 init_compile |
pankso@420 | 588 date=$(date "+%Y%m%d") |
pankso@443 | 589 package="slitaz-$ARCH-toolchain-$date" |
pankso@419 | 590 tarball="$package.tar.bz2" |
pankso@441 | 591 cd /cross |
pankso@443 | 592 mkdir -p $package/$ARCH || exit 1 |
al@728 | 593 newline |
pankso@419 | 594 echo -n "Copying $ARCH to: $package" |
pankso@443 | 595 cp -a $ARCH/tools $package/$ARCH |
pankso@443 | 596 cp -a $ARCH/sysroot $package/$ARCH |
pankso@419 | 597 status |
pankso@420 | 598 prebuilt_readme |
pankso@416 | 599 echo -n "Creating prebuilt $ARCH toolchain tarball..." |
al@728 | 600 tar -cjf $tarball $package |
pankso@416 | 601 status |
pankso@419 | 602 rm -rf $package |
pankso@441 | 603 size=$(du -sh $tarball | awk '{print $1}') |
pankso@441 | 604 echo "Tarball path: $(pwd)/$tarball" |
pankso@419 | 605 echo "Tarball size: $size" |
al@728 | 606 newline ;; |
al@728 | 607 |
pankso@361 | 608 *) |
pankso@361 | 609 usage ;; |
pankso@361 | 610 esac |
pankso@361 | 611 |