view mini-native.sh @ 374:ed4caa451355

Adjust busybox defconfig to remove options that don't build under knoppix 5.1.1 (inotifyd, 2.4 module support) and yank options we don't want anyway because another package must provide them (patch, /bin/sh). (Pondered moving to a miniconfig, but this is still "almost defconfig" and the patch makes it easier to see what actually mattered to us.)
author Rob Landley <rob@landley.net>
date Sat, 02 Aug 2008 11:54:05 -0500
parents 2c5b02b47c8e
children f0ceae67ebd0
line wrap: on
line source

#!/bin/bash

# Get lots of predefined environment variables and shell functions.

source include.sh

rm -rf "${NATIVE}"

if [ -z "${BUILD_SHORT}" ]
then
  TOOLS="${NATIVE}/tools"

  # Tell the wrapper script where to find the dynamic linker.
  export UCLIBC_DYNAMIC_LINKER=/tools/lib/ld-uClibc.so.0
  export UCLIBC_RPATH=/tools/lib
else
  TOOLS="${NATIVE}"
fi
mkdir -p "${TOOLS}/bin" || dienow

# Purple.  And why not?
echo -e "\e[35m"

# Build and install Linux kernel.

setupfor linux
# Install Linux kernel headers (for use by uClibc).
make headers_install -j "$CPUS" ARCH="${KARCH}" INSTALL_HDR_PATH="${TOOLS}" &&
# build bootable kernel for target
make ARCH="${KARCH}" allnoconfig KCONFIG_ALLCONFIG="${WORK}/miniconfig-linux" &&
make -j $CPUS ARCH="${KARCH}" CROSS_COMPILE="${ARCH}-" &&
cp "${KERNEL_PATH}" "${WORK}/zImage-${ARCH}" &&
cd ..

cleanup linux

# Build and install uClibc.  (We could just copy the one from the compiler
# toolchain, but this is cleaner.)

setupfor uClibc
make allnoconfig KCONFIG_ALLCONFIG="${WORK}/miniconfig-uClibc" &&
# Can't use -j here, build is unstable.
make CROSS="${ARCH}-" KERNEL_HEADERS="${TOOLS}/include" PREFIX="${TOOLS}/" \
        RUNTIME_PREFIX=/ DEVEL_PREFIX=/ UCLIBC_LDSO_NAME=ld-uClibc \
        all install_runtime install_dev utils &&
# utils_install wants to put stuff in usr/bin instead of bin.
install -m 755 utils/{readelf,ldd,ldconfig} "${TOOLS}/bin" &&
cd ..

cleanup uClibc

# Build and install toybox

setupfor toybox

make defconfig &&
#make install_flat PREFIX="${TOOLS}"/bin CROSS="${ARCH}-" &&
#rm "${TOOLS}"/bin/sh &&  # Bash won't install if this exists.
make CROSS="${ARCH}-" &&
cp toybox "$TOOLS/bin" &&
ln -s toybox "$TOOLS/bin/patch" &&
ln -s toybox "$TOOLS/bin/oneit" &&
cd ..

cleanup toybox

# Build and install busybox

setupfor busybox
#make allnoconfig KCONFIG_ALLCONFIG="${SOURCES}/config-busybox" .config &&
make defconfig &&
make -j $CPUS CROSS_COMPILE="${ARCH}-" &&
make busybox.links &&
cp busybox "${TOOLS}/bin"
[ $? -ne 0 ] && dienow
for i in $(sed 's@.*/@@' busybox.links)
do
  ln -s busybox "${TOOLS}/bin/$i" # || dienow
done
cd ..

cleanup busybox

if [ ! -z "${BUILD_SHORT}" ]
then
  # If you want to use tinycc, you need to keep the headers but don't need gcc.
  [ "$BUILD_SHORT" != "headers" ] && rm -rf "${TOOLS}"/include
else

# Build and install native binutils

setupfor binutils build-binutils
CC="${ARCH}-gcc" AR="${ARCH}-ar" "${CURSRC}/configure" --prefix="${TOOLS}" \
  --build="${CROSS_HOST}" --host="${CROSS_TARGET}" --target="${CROSS_TARGET}" \
  --disable-nls --disable-shared --disable-multilib --program-prefix= \
  $BINUTILS_FLAGS &&
make -j $CPUS configure-host &&
make -j $CPUS &&
make -j $CPUS install &&
cd .. &&
mkdir -p "${TOOLS}/include" &&
cp binutils/include/libiberty.h "${TOOLS}/include"

cleanup binutils build-binutils

# Build and install native gcc, with c++ support this time.

setupfor gcc-core build-gcc
setupfor gcc-g++ build-gcc gcc-core
# GCC tries to "help out in the kitchen" by screwing up the linux include
# files.  Cut out those bits with sed and throw them away.
sed -i 's@^STMP_FIX.*@@' "${CURSRC}/gcc/Makefile.in" &&
# GCC has some deep assumptions about the name of the cross-compiler it should
# be using.  These assumptions are wrong, and lots of redundant corrections
# are required to make it stop.
CC="${ARCH}-gcc" GCC_FOR_TARGET="${ARCH}-gcc" CC_FOR_TARGET="${ARCH}-gcc" \
  AR="${ARCH}-ar" AR_FOR_TARGET="${ARCH}-ar" AS="${ARCH}-as" LD="${ARCH}-ld" \
  NM="${ARCH}-nm" NM_FOR_TARGET="${ARCH}-nm" \
  "${CURSRC}/configure" --prefix="${TOOLS}" --disable-multilib \
  --build="${CROSS_HOST}" --host="${CROSS_TARGET}" --target="${CROSS_TARGET}" \
  --enable-long-long --enable-c99 --enable-shared --enable-threads=posix \
  --enable-__cxa_atexit --disable-nls --enable-languages=c,c++ \
  --disable-libstdcxx-pch --program-prefix="" $GCC_FLAGS &&
make -j $CPUS configure-host &&
make -j $CPUS all-gcc &&
make -j $CPUS install-gcc &&
ln -s gcc "${TOOLS}/bin/cc" &&
cd ..

cleanup gcc-core build-gcc

# Move the gcc internal libraries and headers somewhere sane, and
# build and install gcc wrapper script.

mkdir -p "${TOOLS}"/gcc &&
mv "${TOOLS}"/lib/gcc/*/*/include "${TOOLS}"/gcc/include &&
mv "${TOOLS}"/lib/gcc/*/* "${TOOLS}"/gcc/lib &&
mv "${TOOLS}/bin/gcc" "${TOOLS}/bin/gcc-unwrapped" &&
"${ARCH}-gcc" "${SOURCES}"/toys/gcc-uClibc.c -Os -s -o "${TOOLS}/bin/gcc"

cleanup "${TOOLS}"/{lib/gcc,gcc/lib/install-tools}

# Build and install make

setupfor make
CC="${ARCH}-gcc" ./configure --prefix="${TOOLS}" --build="${CROSS_HOST}" \
  --host="${CROSS_TARGET}" &&
make -j $CPUS &&
make -j $CPUS install &&
cd ..

cleanup make

# Build and install bash.  (Yes, this is an old version.  I prefer it.)
# I plan to replace it with toysh anyway.

setupfor bash
# wire around some tests ./configure can't run when cross-compiling.
cat > config.cache << EOF &&
ac_cv_func_setvbuf_reversed=no
bash_cv_sys_named_pipes=yes
bash_cv_have_mbstate_t=yes
bash_cv_getenv_redef=no
EOF
CC="${ARCH}-gcc" RANLIB="${ARCH}-ranlib" ./configure --prefix="${TOOLS}" \
  --build="${CROSS_HOST}" --host="${CROSS_TARGET}" --cache-file=config.cache \
  --without-bash-malloc --disable-readline &&
# note: doesn't work with -j
make &&
make install &&
# Make bash the default shell.
ln -s bash "${TOOLS}/bin/sh" &&
cd ..

cleanup bash

setupfor distcc
./configure --host="${ARCH}" --prefix="${TOOLS}" --with-included-popt &&
make -j $CPUS &&
make -j $CPUS install &&
mkdir -p "${TOOLS}/distcc" &&
ln -s ../bin/distcc "${TOOLS}/distcc/gcc" &&
ln -s ../bin/distcc "${TOOLS}/distcc/cc"
cd ..

cleanup distcc

# Put statically and dynamically linked hello world programs on there for
# test purposes.

"${ARCH}-gcc" "${SOURCES}/toys/hello.c" -Os -s -o "${TOOLS}/bin/hello-dynamic"  &&
"${ARCH}-gcc" "${SOURCES}/toys/hello.c" -Os -s -static -o "${TOOLS}/bin/hello-static"

[ $? -ne 0 ] && dienow

fi

# Copy qemu setup script and so on.

cp -r "${SOURCES}/native/." "${TOOLS}/" || dienow

# Clean up and package the result

"${ARCH}-strip" "${TOOLS}"/{bin/*,sbin/*,libexec/gcc/*/*/*}

cd "${BUILD}"
#echo -n "Creating tools.sqf"
#("${WORK}/mksquashfs" "${NATIVE}/tools" "tools-${ARCH}.sqf" \
#  -noappend -all-root -info || dienow) | dotprogress

echo -n creating mini-native-"${ARCH}".tar.bz2 &&
{ tar cjvf "mini-native-${ARCH}.tar.bz2" "mini-native-${ARCH}" || dienow
} | dotprogress

# Color back to normal
echo -e "\e[0mBuild complete"