#!/bin/bash -ex CROSS_PROJECT="/home/anssi/cross-ppc" CROSS_TRIPLET="powerpc-mandriva-linux-gnu" CROSS_ARCH="ppc" # directory where all the stuff is installed CROSS_PREFIX="$CROSS_PROJECT/prefix" # directory with the read-only toolchain CROSS_TOOLCHAIN_ROOT="$CROSS_PROJECT/toolchain" # directory with the base run-time sysroot (contains libc, etc) CROSS_SYSROOT="$CROSS_TOOLCHAIN_ROOT/$CROSS_TRIPLET/sys-root" # directory where all the builds are done CROSS_BUILDDIR="$CROSS_PROJECT/software/build" # directory where all the installed software are recorded CROSS_DONE="$CROSS_PROJECT/software/done" # directory containing the source tarballs CROSS_TARBALLS="$CROSS_PROJECT/software/tarballs" # qemu command used to run target arch binaries CROSS_QEMU_ARCH="ppc64abi32" CROSS_QEMU_ARCH="$CROSS_ARCH" CROSS_QEMU="qemu-$CROSS_QEMU_ARCH -L $CROSS_SYSROOT" CROSS_OPTFLAGS="-O2 -pipe" CROSS_LDFLAGS="-Wl,-O1" CROSS_MAKEARGS="-j6" call() { local stage="$1" shift if type -p "${CROSS_INSTTYPE}_${stage}"; then ${CROSS_INSTTYPE}_${stage} "$@" else std_${stage} "$@" fi } std_extract() { local tarball="$1" local dir="$2" [ -n "$tarball" ] || return 1 [ -n "$dir" ] || dir="${tarball%.t*z*}" rm -rf "$dir" tar -xf "$CROSS_TARBALLS/$tarball" cd "$dir" } jasper_extract() { local tarball="$1" dir="${tarball%.zip}" rm -rf "$dir" unzip "$CROSS_TARBALLS/$tarball" cd "$dir" } hack_extract() { local tarball="$1" local dir="$2" [ -n "$dir" ] || dir="${tarball%.t*z*}" cd "$dir" } sdl_extract() { hack_extract } std_prepare() { true } mad_prepare() { sed -i "s,-fforce-mem,," configure.ac touch NEWS AUTHORS ChangeLog autoreconf -if } flac_prepare() { sed -i 's,#include ,&\n#include ,' examples/cpp/encode/file/main.cpp } samba_prepare() { cd source3 export samba_cv_CC_NEGATIVE_ENUM_VALUES=yes export samba_cv_HAVE_WRFILE_KEYTAB=yes export smb_krb5_cv_enctype_to_string_takes_krb5_context_arg=no export smb_krb5_cv_enctype_to_string_takes_size_t_arg=yes } krb_prepare() { cd src export krb5_cv_attr_constructor_destructor=yes,yes export ac_cv_func_regcomp=yes export ac_cv_printf_positional=yes } enca_prepare() { export ac_cv_file__dev_random=yes export ac_cv_file__dev_urandom=yes export ac_cv_file__dev_srandom=no export ac_cv_file__dev_arandom=no sed -i 's, ./make_hash, ../make_hash,' tools/Makefile.am autoreconf -fi gcc -o make_hash tools/make_hash.c } ncurses_prepare() { sed -i "s,#include ,&\n#include ," ncurses/curses.priv.h } std_configure() { ./configure --host="$CROSS_TRIPLET" --prefix="$CROSS_PREFIX" "$@" } talloc_configure() { CC="$CROSS_TRIPLET-gcc" ./configure --prefix="$CROSS_PREFIX" --cross-compile --cross-execute="$CROSS_QEMU" } samplerate_configure() { local flags # endian detection in configure fails if echo -e "#ifdef __BIG_ENDIAN__\nTEST$$TEST\n#endif" | $CROSS_TRIPLET-gcc -E - | grep -q TEST$$TEST; then flags="-DCPU_IS_BIG_ENDIAN=1 -DCPU_IS_LITTLE_ENDIAN=0" else flags="-DCPU_IS_BIG_ENDIAN=0 -DCPU_IS_LITTLE_ENDIAN=1" fi export CPPFLAGS="$CPPFLAGS $flags" std_configure sed -i 's,^#define CPU_IS_.*_ENDIAN.*$,/*&*/,' src/config.h } zlib_configure() { CC="$CROSS_TRIPLET-gcc" ./configure --prefix="$CROSS_PREFIX" } openssl_configure() { export MANDIR="$CROSS_PREFIX/share/man" CC="$CROSS_TRIPLET-gcc" ./Configure --prefix="$CROSS_PREFIX" shared linux-$CROSS_ARCH } sdl_configure() { std_configure --disable-esd --disable-video-ps2gs --disable-video-ps3 --disable-video-directfb --enable-video-x11 --disable-x11-shared --enable-video-opengl --disable-osmesa-shared } alsa_configure() { std_configure --disable-python } fontconfig_configure() { std_configure --with-arch="$CROSS_ARCH" --with-freetype-config="$CROSS_PREFIX/bin/freetype-config" --disable-docs } cmake_configure() { mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX:PATH=$CROSS_PREFIX -DCMAKE_C_COMPILER:PATH=$CROSS_TRIPLET-gcc -DCMAKE_CXX_COMPILER:PATH=$CROSS_TRIPLET-g++ -DCMAKE_SYSTEM_NAME="Linux" "$@" } mysql_configure() { mkdir nativebuild cd nativebuild cmake .. -DWITHOUT_SERVER=1 std_make -C extra comp_err cd .. export CPPFLAGS="$CPPFLAGS -I$CROSS_PREFIX/include/ncurses" echo -e "#include \nint find_stack_direction (){ static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction(); } else return (&dummy > addr) ? 1 : -1; } int main () { exit (find_stack_direction() < 0); }" | $CROSS_TRIPLET-gcc -o dirtest -x c - set +e $CROSS_QEMU ./dirtest local rc=$? set -e [ "$rc" = "1" ] || [ "$rc" = "-1" ] || return 1 cmake_configure -DWITHOUT_SERVER=1 -DSTACK_DIRECTION=$rc -DINSTALL_INCLUDEDIR=include/mysql export PATH="$PATH:$PWD/../nativebuild/extra" mkdir sql/share } flac_configure() { std_configure --disable-xmms-plugin } db_configure() { cd dist ./s_config cd ../build_unix ../dist/configure --host="$CROSS_TRIPLET" --prefix="$CROSS_PREFIX" } ldap_configure() { export ac_cv_func_memcmp_working=yes CC="$CROSS_TRIPLET-gcc" std_configure --with-yielding_select=yes } sdlmixer_configure() { std_configure --disable-music-flac --disable-music-mod --disable-music-mp3 } curl_configure() { std_configure --with-random="/dev/urandom" } ncurses_configure() { mkdir ncurses-build cd ncurses-build ../configure --host="$CROSS_TRIPLET" --prefix="$CROSS_PREFIX" mkdir ../ncurses-utf8-build cd ../ncurses-utf8-build ../configure --host="$CROSS_TRIPLET" --prefix="$CROSS_PREFIX" --includedir="$CROSS_PREFIX/include/ncursesw" --enable-widec cd .. } hack_configure() { true } std_make() { make $CROSS_MAKEARGS "$@" } openssl_make() { std_make -j1 } samba_make() { std_make libsmbclient libwbclient } ncurses_make() { std_make -C ncurses-build std_make -C ncurses-utf8-build } std_build() { call prepare call configure call make } boost_build() { true } glew_build() { export GLEW_DEST="$CROSS_PREFIX" export M_ARCH="$CROSS_ARCH" std_make CFLAGS.EXTRA="$CPPFLAGS $CFLAGS" LD="$CROSS_TRIPLET-gcc $LDFLAGS" CC="$CROSS_TRIPLET-gcc $LDFLAGS" } bz2_build() { sed -i "/^all:/s/test//" Makefile std_make CC="$CROSS_TRIPLET-gcc $CFLAGS $LDFLAGS" -f Makefile-libbz2_so std_make CC="$CROSS_TRIPLET-gcc $CFLAGS $LDFLAGS" } std_install() { make install "$@" } boost_install() { mkdir -p "$CROSS_PREFIX/include" cp -af "boost" "$CROSS_PREFIX/include" } mad_install() { std_install mkdir -p "$CROSS_PREFIX/lib/pkgconfig" echo "Name: mad" > $CROSS_PREFIX/lib/pkgconfig/mad.pc echo "Description: mad" >> $CROSS_PREFIX/lib/pkgconfig/mad.pc echo "Version: 0.14.2b" >> $CROSS_PREFIX/lib/pkgconfig/mad.pc echo "Libs: -lmad" >> $CROSS_PREFIX/lib/pkgconfig/mad.pc } glew_install() { std_install STRIP="$CROSS_TRIPLET-strip" INSTALL="install --strip-program=$CROSS_TRIPLET-strip" } bz2_install() { std_install PREFIX="$CROSS_PREFIX" mkdir -p "$CROSS_PREFIX/lib" cp -af libbz2.so.1.0 libbz2.so.1.0.6 "$CROSS_PREFIX/lib" } ldap_install() { std_install STRIP= } samba_install() { make installlibsmbclient installlibwbclient } enca_install() { rm -f "$CROSS_PREFIX/bin/enconv" rm -f "$CROSS_PREFIX/share/man/man1/enconv.1" std_install } ncurses_install() { std_install -C ncurses-build std_install -C ncurses-utf8-build for hdr in curses unctrl eti form menu panel term; do ln -sf ncurses/$hdr.h $CROSS_PREFIX/include/$hdr.h done } gdbm_install() { std_install install-compat BINOWN="$(id -nu)" BINGRP="$(id -ng)" includedir=$CROSS_PREFIX/include/gdbm ln -sf gdbm/gdbm.h $CROSS_PREFIX/include/gdbm.h } dbus_install() { std_install $CROSS_QEMU $PREFIX/bin/dbus-uuidgen --ensure } std_all() { local tarball="$1" local dir="$2" call extract "$tarball" "$dir" call build call install } inst() { CROSS_INSTTYPE="$1" shift local tarball="$1" [ -z "$CROSS_PKG_BUILT" -o -z "$IMPLICIT_DEPENDENCIES" ] && [ -e "$CROSS_DONE/$tarball.done" ] && return 0 || rm -f "$CROSS_DONE/$tarball.done" (call all "$@") touch "$CROSS_DONE/$tarball.done" CROSS_PKG_BUILT=1 } export PATH="$PATH:$CROSS_TOOLCHAIN_ROOT/bin" export CPPFLAGS="-I$CROSS_PREFIX/include" export CFLAGS="$CROSS_OPTFLAGS" export CXXFLAGS="$CFLAGS" export LDFLAGS="-L$CROSS_PREFIX/lib -Wl,-rpath-link,$CROSS_PREFIX/lib $CROSS_LDFLAGS" export PKG_CONFIG_LIBDIR="$CROSS_PREFIX/lib/pkgconfig:$CROSS_PREFIX/share/pkgconfig" CROSS_PKG_BUILT= IMPLICIT_DEPENDENCIES= mkdir -p "$CROSS_DONE" "$CROSS_BUILDDIR" cd "$CROSS_BUILDDIR" inst boost boost_1_45_0.tar.bz2 inst talloc talloc-2.0.5.tar.gz inst std xproto-7.0.20.tar.bz2 inst std xextproto-7.1.2.tar.bz2 inst std xtrans-1.2.6.tar.bz2 inst std xcb-proto-1.6.tar.bz2 inst std libpthread-stubs-0.3.tar.bz2 inst std libXau-1.0.6.tar.bz2 inst std libxcb-1.7.tar.bz2 inst std kbproto-1.0.5.tar.bz2 inst std inputproto-2.0.1.tar.bz2 inst std libX11-1.4.1.tar.bz2 inst std libdrm-2.4.23.tar.bz2 inst std dri2proto-2.3.tar.bz2 inst std glproto-1.4.12.tar.bz2 inst std libXext-1.2.0.tar.bz2 inst std damageproto-1.2.1.tar.bz2 inst std fixesproto-4.1.2.tar.bz2 inst std libXfixes-4.0.5.tar.bz2 inst std libXdamage-1.1.3.tar.bz2 inst std expat-2.0.1.tar.gz inst std libICE-1.0.7.tar.bz2 inst std libSM-1.2.0.tar.bz2 inst std libXt-1.0.9.tar.bz2 inst std MesaLib-7.9.1.tar.bz2 Mesa-7.9.1 inst std libXmu-1.1.0.tar.bz2 inst std libXi-1.4.1.tar.bz2 inst glew glew-1.5.8.tgz inst mad libmad-0.15.1b.tar.gz inst std jpegsrc.v8c.tar.gz jpeg-8c inst samplerate libsamplerate-0.1.7.tar.gz inst std libogg-1.2.2.tar.xz inst std libvorbis-1.3.2.tar.bz2 inst bz2 bzip2-1.0.6.tar.gz inst std lzo-2.04.tar.gz inst zlib zlib-1.2.5.tar.gz inst openssl openssl-1.0.0d.tar.gz inst std wavpack-4.60.1.tar.bz2 inst alsa alsa-lib-1.0.24.1.tar.bz2 inst sdl SDL-1.2.14.tar.gz inst std libmpeg2-0.5.1.tar.gz inst std freetype-2.4.4.tar.bz2 inst fontconfig fontconfig-2.8.0.tar.gz inst std fribidi-0.10.9.tar.gz inst std sqlite-autoconf-3070500.tar.gz inst std libpng-1.2.44.tar.xz inst std pcre-8.12.tar.bz2 inst std libcdio-0.82.tar.bz2 inst std libmodplug-0.8.8.1.tar.gz inst ncurses ncurses-5.7.tar.gz inst mysql mysql-5.5.9.tar.gz inst std faad2-2.7.tar.bz2 inst flac flac-1.2.1.tar.gz inst db db-5.1.19.tar.gz inst ldap openldap-2.4.24.tgz inst krb krb5-1.9.tar.gz inst samba samba-3.5.6.tar.gz inst sdlmixer SDL_mixer-1.2.11.tar.gz inst jasper jasper-1.900.1.zip inst std tiff-3.9.4.tar.gz inst std SDL_image-1.2.10.tar.gz inst enca enca-1.13.tar.bz2 inst std recordproto-1.14.1.tar.bz2 inst std libXtst-1.2.0.tar.bz2 inst curl curl-7.21.3.tar.bz2 inst dbus dbus-1.4.1.tar.gz inst std libmicrohttpd-0.9.7.tar.gz inst std renderproto-0.11.1.tar.bz2 inst std libXrender-0.9.6.tar.bz2 inst std randrproto-1.3.2.tar.bz2 inst std libXrandr-1.3.1.tar.bz2 inst std readline-6.2.tar.gz inst gdbm gdbm-1.8.3.tar.gz exit 0 cd /home/anssi/src/git/xbmc #export MYSQL_CONFIG="$CROSS_PREFIX/bin/mysql_config" export CFLAGS="$CPPFLAGS $CFLAGS" export CXXFLAGS="$CPPFLAGS $CXXFLAGS" ./bootstrap std_configure --with-arch=$CROSS_ARCH make clean std_make