Script to configure release build environment
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 5 Nov 2012 09:58:05 +0000 (09:58 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 5 Nov 2012 09:58:05 +0000 (09:58 +0000)
This script was used to initialize build environment currently used
for glibc-2.11 builds.

It's supposed to be used on debian-based distros.

Usage is described in the top comment of the script.

It is highly recommended to use this script in the virtual machine
to prevent possible conflicts with your own configuration.

TODO:
- Add OSL configuration
- Script requires manual copying of some scripts still (see comments
  at the top of the script)

I would prefer this script be edited only in cases when it's really
needed, meaning i wouldn't be fan of changes like "just use latest
version of library XXX". It's not so safe to do such changes and it's
easy to upgrade libraries after environment was set up.

build_files/build_environment/prepare_release_env.sh [new file with mode: 0755]

diff --git a/build_files/build_environment/prepare_release_env.sh b/build_files/build_environment/prepare_release_env.sh
new file mode 100755 (executable)
index 0000000..0bad150
--- /dev/null
@@ -0,0 +1,1483 @@
+#!/bin/sh
+
+#
+# This script will prepare build environment with the same settings as release environment
+#
+# It will install two chroot environments:
+#   - /home/buildbot_squeeze_i686
+#   - /home/buildbot_squeeze_x86_64
+# which are used for 32bit and 64bit
+#
+# This sctipt will also create folder /home/sources where all dependent libraries sources are
+# downloading and compiling.
+#
+# Release builder scripts are stored in /home/sources/release-builder
+# See build_all.sh script for usage details
+#
+# This script was tested on debian squeeze and wheezy, should work on ubuntu as well
+# It wouldn't work on other distros
+#
+# TODO:
+# - It's still required manual copying of build configuration files to /home/sources/release-builder/config
+# - OSL is not set up yet
+#
+
+set -e
+
+NO_COLOR='\033[0m'
+EWHITE='\033[1;37m'
+ERED='\033[1;31m'
+
+CONFIRM="--i-really-do-know-what-im-doing"
+
+ERROR() {
+  echo ${ERED}${@}${NO_COLOR}
+}
+
+INFO() {
+  echo ${EWHITE}${@}${NO_COLOR}
+}
+
+if [ $# != 1 ]; then
+  ERROR "Usage: $0 $CONFIRM"
+  exit 1
+fi
+
+if [ "$1" != "$CONFIRM" ]; then
+  ERROR "Usage: $0 $CONFIRM"
+  exit 1
+fi
+
+DEBIAN_BRANCH="squeeze"
+DEBIAN_MIRROR="http://ftp.de.debian.org/debian"
+USER_ID=1000
+
+# For now it's always /home, so we can setup schroot to map /sources to the same
+# path at both host and chroot systems (which is currently needed for release building script)
+ENV_PATH="/home"
+
+AMD64_PATH="$ENV_PATH/buildbot_${DEBIAN_BRANCH}_x86_64"
+I686_PATH="$ENV_PATH/buildbot_${DEBIAN_BRANCH}_i686"
+SOURCES_PATH="$ENV_PATH/sources"
+
+THREADS=`cat /proc/cpuinfo | grep cores | uniq | sed -e "s/.*: *\(.*\)/\\1/"`
+
+# Force vpx be installed from the backports
+VPX_V="1.0.0-2~bpo60+1"
+
+BINUTILS_V="2.22"
+BINUTILS_FV="2.22-7.1"
+
+GCC_V="4.7_4.7.1"
+GCC_FV="4.7_4.7.1-7"
+
+OPENAL_V="1.14"
+
+DPKG_V="1.16.8"
+
+DEBHELPER_V="9"
+DEBHELPER_FV="9.20120909"
+
+JEMALLOC_V="3.1.0"
+SPNAV_V="0.2.2"
+FFMPEG_V="1.0"
+BOOST_V="1_51_0"
+PYTHON_V="3.3.0"
+PYTHIN_V_SHORT="3.3"
+OIIO_V="1.0.9"
+OCIO_V="1.0.7"
+MESA_V="8.0.5"
+
+CUDA_V="4.2.9"
+CUDA_DISTR="ubuntu10.04"
+CUDA_32="cudatoolkit_${CUDA_V}_linux_32_${CUDA_DISTR}.run"
+CUDA_64="cudatoolkit_${CUDA_V}_linux_64_${CUDA_DISTR}.run"
+
+INSTALL_RELEASE_BUILDER() {
+  SOURCES_PATH=$1
+
+  RB=$SOURCES_PATH/release-builder
+  if [ ! -d $RB ]; then
+    INFO "Installing release building scripts"
+
+    mkdir -p $RB
+
+    cat << EOF > $RB/Readme.txt
+This directory contains scrips needed for automated release archive preparation
+
+config/: storage of scons configs for different platforms
+
+build_all.sh: script asks version to add to archive name and revision to compile,
+              when script finished, there'll be 32 and 64 bit archives in current directory
+              better to run this script from this directory
+
+do_build_all.sh: uses environment variables set by build_all.sh script (or other scripts)
+                 and launches compilation inside chroot environments
+
+chroot_compile.py: runs compilation process with giver parameters in chroots
+compile.py: script runs inside chroot environment and prepares archive
+
+blender-buildenv.tar.bz2: archive, received from Ken Hughes when i've been preparing
+                          new environment to make it as close to old one as it's possible
+
+Hope all this would help you.
+
+-Sergey-
+EOF
+  
+    cat << EOF > $RB/build_all.sh
+#!/bin/sh
+
+echo -n "version: "
+read version
+echo -n "svn revision (blank to latest, 0 to keep unchanged): "
+read revision
+
+export version
+export revision
+
+d=\`dirname \${0}\`
+\${d}/do_build_all.sh
+EOF
+    chmod +x $RB/build_all.sh
+
+    cat << EOF > $RB/build_all-test.sh
+#!/bin/sh
+
+d=\`dirname \${0}\`
+\${d}/do_build_all.sh
+EOF
+    chmod +x $RB/build_all-test.sh
+
+    cat << EOF > $RB/chroot-compile.py
+#!/usr/bin/env python
+
+import sys
+import os
+import platform
+
+from optparse import OptionParser
+
+# This could be passed through options, but does we actually need this?
+bl_source = '/home/sources/blender'
+build_dir = '/home/sources/blender-build/'
+install_dir = '/home/sources/blender-install/'
+with_player = True
+
+# Default config
+curr_arch = platform.architecture()[0]
+def_arch = 'x86_64' if curr_arch == '64bit' else 'i686'
+builder_dir = os.path.dirname(os.path.realpath(__file__))
+
+# XXX: bad thing!
+# builder_dir = builder_dir.replace("sources-new", "sources")
+
+def_cores = 1
+if hasattr(os, 'sysconf'):
+    if 'SC_NPROCESSORS_ONLN' in os.sysconf_names:
+        def_cores = os.sysconf('SC_NPROCESSORS_ONLN')
+
+# Per-architecture chroot name
+chroots = { 'i686': 'buildbot_squeeze_i686',
+            'x86_64': 'buildbot_squeeze_x86_64'}
+
+# Parse command line
+op = OptionParser()
+op.add_option('--tag', default = None)
+op.add_option('--branch', default = None)
+op.add_option('--arch', default = def_arch)
+op.add_option('--cores', default = def_cores)
+op.add_option('--bl-version', default = 'UNDEFINED')
+op.add_option('--no-clean', default = False)
+(opts, args) = op.parse_args()
+
+if opts.arch not in chroots:
+    print('Error: No configured machine gound to build ' + 
+          '{0} version' . format(opts.arch))
+    sys.exit(1)
+
+chroot = chroots[opts.arch]
+
+if opts.tag:
+    bl_source = '/home/sources/blender-tags/' + opts.tag
+elif opts.branch:
+    bl_source = '/home/sources/blender-branches/' + opts.branch
+
+if not os.path.isdir(bl_source):
+    print('Uname to find directory with sources: ' + bl_source)
+    sys.exit(1)
+
+print('Building {0} version, machine is {1}' . format(opts.bl_version, opts.arch))
+
+# Assume builder directory is binded to the same location in
+# chroot environments
+compiler = os.path.join(builder_dir, 'compile.py')
+
+cmd = 'schroot -c %s -d /home/sources/release-builder --' % (chroot)
+cmd += ' python %s' % (compiler)
+cmd += ' --bl-version=%s' % (opts.bl_version)
+cmd += ' --bl-source=%s' % (bl_source)
+cmd += ' --arch=%s' % (opts.arch)
+cmd += ' --build-dir=%s' % (build_dir)
+cmd += ' --install-dir=%s' % (install_dir)
+
+if opts.no_clean:
+    cmd += ' --no-clean=1'
+
+if with_player:
+    cmd += ' --with-player=1'
+
+#if opts.branch:
+#    cmd += ' --use-new-ffmpeg=1'
+
+result = os.system(cmd)
+if result != 0:
+    print('compiler script exited with errcode: %s' % (result))
+    sys.exit(1)
+EOF
+    chmod +x $RB/chroot-compile.py
+
+    cat << EOF > $RB/compile.py
+#!/usr/bin/env python
+
+import platform
+import sys
+import os
+import shutil
+
+from optparse import OptionParser
+
+# Default config
+curr_arch = platform.architecture()[0]
+def_arch = 'x86_64' if curr_arch == '64bit' else 'i686'
+builder_dir = os.path.dirname(os.path.realpath(__file__))
+
+def_cores = 1
+if hasattr(os, 'sysconf'):
+    if 'SC_NPROCESSORS_ONLN' in os.sysconf_names:
+        def_cores = os.sysconf('SC_NPROCESSORS_ONLN')
+
+# Parse command line
+op = OptionParser()
+op.add_option('--arch', default = def_arch)
+op.add_option('--cores', default = def_cores)
+op.add_option('--no-clean', default = False)
+op.add_option('--bl-version', default = 'UNKNOWN')
+op.add_option('--bl-source', default = '')
+op.add_option('--config-dir', default = '')
+op.add_option('--build-dir', default = '')
+op.add_option('--install-dir', default = '')
+op.add_option('--with-player', default = False)
+#op.add_option('--use-new-ffmpeg', default = False)
+(opts, args) = op.parse_args()
+
+if opts.config_dir == '':
+    opts.config_dir = os.path.join(builder_dir, 'config')
+
+# Initial directory checking (could be problems with permissions)
+if not os.path.isdir(opts.bl_source):
+    print('Blender\'s source tree not found: %s' % (opts.bl_source))
+    sys.exit(1)
+
+if not os.path.isdir(opts.config_dir):
+    print('Directory with configuration files not found: %s' % (opts.config_dir))
+    sys.exit(1)
+
+if not os.path.isdir(os.path.dirname(opts.build_dir)):
+    print('Build directory can\'t be reached: %s' % (opts.build_dir))
+    sys.exit(1)
+
+if not os.path.isdir(os.path.dirname(opts.install_dir)):
+    print('Install directory can\'t be reached: %s' % (opts.install_dir))
+    sys.exit(1)
+
+# Detect glibc version
+libc = [name for name in os.listdir('/lib') if 'libc.so.' in name]
+if len(libc) == 0:
+    print('Could not find "/lib/libc.so.*": cannot determine glibc version')
+    sys.exit(-1)
+
+if len(libc) > 1:
+    print('warning: found more than one "/lib/libc.so.*": '+
+          'using %s' % (libc[0]))
+
+glibc = 'glibc' + os.readlink('/lib/' + libc[0])[5:][:-3].replace('.', '')
+glibc = glibc[:8]
+
+# Full name for archive
+full_name = 'blender-%s-linux-%s-%s' % (opts.bl_version, glibc, opts.arch)
+build_dir = os.path.join(opts.build_dir, full_name)
+install_dir = os.path.join(opts.install_dir, full_name)
+scons = os.path.join(opts.bl_source, 'scons', 'scons.py')
+scons_cmd = 'python %s -C %s' % (scons, opts.bl_source)
+config = os.path.join(opts.config_dir, 'user-config-' + glibc + '-' + opts.arch + '.py')
+
+if not os.path.isfile(config):
+    print('Configuration file not found: %s' % (config))
+    sys.exit(1)
+
+# Clean build directory
+if not opts.no_clean:
+    print('Cleaning up build directory...')
+    os.system('%s BF_BUILDDIR=%s clean ' % (scons_cmd, build_dir))
+
+# Clean install directory
+if os.path.isdir(install_dir):
+    shutil.rmtree(install_dir)
+
+flags = ""
+
+# Switch to newer libraries if needed
+#if opts.use_new_ffmpeg:
+#    print("Using new ffmpeg-0.8.1")
+#    flags += " BF_FFMPEG='/home/sources/staticlibs/ffmpeg-0.8'"
+
+# Build blenderplayer first
+# (to be sure all stuff needed for blender would copied automatically)
+if opts.with_player:
+    player_config = os.path.join(opts.config_dir,
+        'user-config-player-' + glibc + '-' + opts.arch + '.py')
+
+    if not os.path.isfile(player_config):
+        print('Player configuration file not found: %s' % (player_config))
+        sys.exit(1)
+
+    cmd  = '%s -j %d blenderplayer ' % (scons_cmd, opts.cores + 1)
+    cmd += ' BF_BUILDDIR=%s' % (build_dir + '-player')
+    cmd += ' BF_INSTALLDIR=%s' % (install_dir)
+    cmd += ' BF_CONFIG=%s' % (player_config)
+    cmd += flags
+
+    result = os.system(cmd)
+    if result != 0:
+        print('Compilation failed, exit code is %d' % (result))
+        sys.exit(-1)
+
+# Build blender itself
+cmd  = '%s -j %d  blender ' % (scons_cmd, opts.cores + 1)
+cmd += ' BF_BUILDDIR=%s' % (build_dir)
+cmd += ' BF_INSTALLDIR=%s' % (install_dir)
+cmd += ' BF_CONFIG=%s' % (config)
+cmd += flags
+
+result = os.system(cmd)
+if result != 0:
+    print('Compilation failed, exit code is %d' % (result))
+    sys.exit(-1)
+
+blender = os.path.join(install_dir, 'blender')
+blenderplayer = blender + 'player'
+
+if not os.path.exists(blender):
+    print('scons completed successfully but blender executable missing')
+    sys.exit(1)
+
+if opts.with_player and not os.path.exists(blenderplayer):
+    print('scons completed successfully but blenderplayer executable missing')
+    sys.exit(1)
+
+# compile python modules
+#result = os.system('%s --background --python %s/source/tools/compile_scripts.py' % (blender, opts.bl_source))
+#if result != 0:
+#    print('Python modules compilation failed, exit code is %d' % (result))
+#    sys.exit(-1)
+
+print('build successful')
+
+os.system('strip -s %s %s' % (blender, blenderplayer))
+
+# Copy all texts needed for release
+release_texts = os.path.join(opts.bl_source, 'release', 'text', '*')
+release_txt = os.path.join(install_dir, 'release_%s.txt' % (opts.bl_version))
+
+os.system('cp -r %s %s' % (release_texts, install_dir))
+
+if os.path.exists(release_txt):
+    print 'RELEASE TEXT FOUND'
+else:
+    print 'WARNING! RELEASE TEXT NOT FOUND!'
+
+# TODO: copy plugins data when ready
+
+# Add software gl libraries and scripts
+mesa_arch = None
+
+if opts.arch == 'x86_64':
+    mesa_arch = 'mesalibs64.tar.bz2'
+elif opts.arch == 'i686':
+    mesa_arch = 'mesalibs32.tar.bz2'
+
+if mesa_arch is not None:
+    mesalibs = os.path.join(builder_dir, 'extra', mesa_arch)
+    software_gl = os.path.join(builder_dir, 'extra', 'blender-softwaregl')
+
+    os.system('tar -xpf %s -C %s' % (mesalibs, install_dir))
+    os.system('cp %s %s' % (software_gl, install_dir))
+    os.system('chmod 755 %s' % (os.path.join(install_dir, 'blender-softwaregl')))
+
+# Pack release archive
+print("Building Dynamic Tarball")
+os.system('tar -C %s -cjf %s.tar.bz2 %s ' % (opts.install_dir,
+                                             full_name, full_name))
+
+print('Done.')
+EOF
+    chmod +x $RB/compile.py
+
+    cat << EOF > $RB/do_build_al.sh
+#!/bin/sh
+
+SOURCES="/home/sources"
+
+#opts="--cores=1 "
+opts=""
+
+if [ "x\${tag}" != "x" ]; then
+  echo "Getting tagged source tree..."
+  d="\${SOURCES}/blender-tags/\${tag}"
+  opts="\${opts} --tag=\${tag}"
+  if [ ! -d \${d} ]; then
+    svn co https://svn.blender.org/svnroot/bf-blender/tags/\${tag}/blender/@\${revision}  \${d}
+  else
+    svn up -r \${revision} \${d}
+  fi
+elif [ "x\${branch}" != "x" ]; then
+  echo "Getting branched source tree..."
+  d="\${SOURCES}/blender-branches/\${branch}"
+  opts="\${opts} --branch=\${branch}"
+  if [ ! -d \${d} ]; then
+    if [ "x\${revision}" != "x" ]; then
+      svn co https://svn.blender.org/svnroot/bf-blender/branches/\${branch}/@\${revision}  \${d}
+    else
+      svn co https://svn.blender.org/svnroot/bf-blender/branches/\${branch}/  \${d}
+    fi
+  else
+    if [ "x\${revision}" != "x" ]; then
+      svn up -r \${revision} \${d}
+    else
+      svn up \${d}
+    fi
+  fi
+else
+  if [ "x\${revision}" != "x" ]; then
+    if [ "x\${revision}" != "x0" ]; then
+      svn up -r \${revision} \${SOURCES}/blender
+    else
+      svn up \${SOURCES}/blender
+    fi
+  fi
+fi
+
+if [ "x\${tag}" != "x" ]; then
+  b="\${SOURCES}/blender-tags/\${tag}"
+elif [ "x\${branch}" != "x" ]; then
+  b="\${SOURCES}/blender-branches/\${branch}"
+else
+  b="\${SOURCES}/blender"
+fi
+
+if [ "x\${addons_revision}" != "x" ]; then
+  d="\${b}/release/scripts/addons"
+
+  if [ "x\${addons_revision}" != "x0" ]; then
+    svn up -r \${addons_revision} \${d}
+  else
+    svn up \${d}
+  fi
+fi
+
+if [ "x\${locale_revision}" != "x" ]; then
+  d="\${b}/release/datafiles/locale"
+
+  if [ "x\${locale_revision}" != "x0" ]; then
+    svn up -r \${locale_revision} \${d}
+  else
+    svn up \${d}
+  fi
+fi
+
+if [ -z "\$version" ]; then
+  version=r\`/usr/bin/svnversion \$SOURCES/blender\`
+fi
+
+cd extra
+./update-libs.sh
+cd ..
+
+python chroot-compile.py \${opts} --arch=x86_64 --bl-version \${version}  # --no-clean=1
+python chroot-compile.py \${opts} --arch=i686 --bl-version \${version}  # --no-clean=1
+EOF
+    chmod +x $RB/do_build_al.sh
+
+    mkdir -p $RB/extra
+
+    cat << EOF > $RB/extra/blender-softwaregl
+#!/bin/sh
+
+BF_DIST_BIN=\`dirname "\$0"\`
+BF_PROGRAM="blender" # BF_PROGRAM=\`basename "\$0"\`-bin
+exitcode=0
+
+LD_LIBRARY_PATH=\${BF_DIST_BIN}/lib:\${LD_LIBRARY_PATH}
+
+if [ -n "\$LD_LIBRARYN32_PATH" ]; then
+    LD_LIBRARYN32_PATH=\${BF_DIST_BIN}/lib:\${LD_LIBRARYN32_PATH}
+fi
+if [ -n "\$LD_LIBRARYN64_PATH" ]; then
+    LD_LIBRARYN64_PATH=\${BF_DIST_BIN}/lib:\${LD_LIBRARYN64_PATH}
+fi
+if [ -n "\$LD_LIBRARY_PATH_64" ]; then
+    LD_LIBRARY_PATH_64=\${BF_DIST_BIN}/lib:\${LD_LIBRARY_PATH_64}
+fi
+
+# Workaround for half-transparent windows when compiz is enabled
+XLIB_SKIP_ARGB_VISUALS=1
+
+export LD_LIBRARY_PATH LD_LIBRARYN32_PATH LD_LIBRARYN64_PATH LD_LIBRARY_PATH_64 LD_PRELOAD XLIB_SKIP_ARGB_VISUALS
+
+"\$BF_DIST_BIN/\$BF_PROGRAM" \${1+"\$@"}
+exitcode=\$?
+exit \$exitcode
+EOF
+    chmod +x $RB/extra/blender-softwaregl
+
+    cat << EOF > $RB/extra/do_update-libs.sh
+#!/bin/sh
+
+BITS=\$1
+V="\`readlink /opt/lib/mesa | sed -r 's/mesa-//'\`"
+TMP=\`mktemp -d\`
+N="mesalibs\$1-\$V"
+
+if [ ! -f \$N.tar.bz2 ]; then
+  mkdir -p \$TMP/lib
+  cp -P /opt/lib/mesa/lib/libGL* \$TMP/lib
+  strip -s \$TMP/lib/*
+  tar -C \$TMP -cf \$N.tar lib
+  bzip2 \$N.tar
+
+  rm -f mesalibs\$BITS.tar,bz2
+  ln -s \$N.tar.bz2 mesalibs\$BITS.tar.bz2
+fi
+
+rm -rf \$TMP
+EOF
+    chmod +x $RB/extra/do_update-libs.sh
+
+    cat << EOF > $RB/extra/update-libs.sh
+#!/bin/sh
+
+P="/home/sources/release-builder/extra"
+CHROOT_PREFIX="buildbot_squeeze_"
+CHROOT32="\${CHROOT_PREFIX}i686"
+CHROOT64="\${CHROOT_PREFIX}x86_64"
+RUN32="schroot -c \$CHROOT32 -d \$P"
+RUN64="schroot -c \$CHROOT64 -d \$P"
+
+\$RUN64 ./do_update-libs.sh 64
+\$RUN32 ./do_update-libs.sh 32
+EOF
+    chmod +x $RB/extra/update-libs.sh
+
+    mkdir -p $RB/config
+    cp $SOURCES_PATH/blender/build_files/buildbot/config/* $RB/config
+
+  fi
+}
+
+INSTALL_SOURCES() {
+  SOURCES_PATH=$1
+
+  if [ ! -d "$SOURCES_PATH" ]; then
+    INFO "Creating sources directory"
+    mkdir -p "$SOURCES_PATH"
+  fi
+
+  if [ ! -d "$SOURCES_PATH/backport/binutils" ]; then
+    INFO "Downloading binutils"
+    mkdir -p "$SOURCES_PATH/backport/binutils"
+    wget -c $DEBIAN_MIRROR/pool/main/b/binutils/binutils_$BINUTILS_FV.diff.gz \
+            $DEBIAN_MIRROR/pool/main/b/binutils/binutils_$BINUTILS_FV.dsc \
+            $DEBIAN_MIRROR/pool/main/b/binutils/binutils_$BINUTILS_V.orig.tar.gz \
+        -P "$SOURCES_PATH/backport/binutils"
+  fi
+
+  if [ ! -d "$SOURCES_PATH/backport/gcc-4.7" ]; then
+    INFO "Downloading gcc-4.7"
+    mkdir -p "$SOURCES_PATH/backport/gcc-4.7"
+    wget -c $DEBIAN_MIRROR/pool/main/g/gcc-4.7/gcc-$GCC_FV.diff.gz \
+            $DEBIAN_MIRROR/pool/main/g/gcc-4.7/gcc-$GCC_FV.dsc \
+            $DEBIAN_MIRROR/pool/main/g/gcc-4.7/gcc-$GCC_V.orig.tar.gz \
+        -P "$SOURCES_PATH/backport/gcc-4.7"
+  fi
+
+  # JeMalloc
+  J="$SOURCES_PATH/packages/jemalloc-$JEMALLOC_V"
+  if [ ! -d "$J" ]; then
+    INFO "Downloading jemalloc-$JEMALLOC_V"
+    wget -c http://www.canonware.com/download/jemalloc/jemalloc-$JEMALLOC_V.tar.bz2 -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$J.tar.bz2"
+    cat << EOF > "$J/0config.sh"
+#!/bin/sh
+
+./configure CC="gcc-4.7 -Wl,--as-needed" CXX="g++-4.7 -Wl,--as-needed" LDFLAGS="-pthread -static-libgcc" --prefix=/opt/lib/jemalloc-$JEMALLOC_V
+EOF
+    chmod +x "$J/0config.sh"
+  fi
+
+  # Spnav
+  S="$SOURCES_PATH/packages/libspnav-$SPNAV_V"
+  if [ ! -d "$S" ]; then
+    wget -c http://downloads.sourceforge.net/project/spacenav/spacenav%20library%20%28SDK%29/libspnav%200.2.2/libspnav-$SPNAV_V.tar.gz \
+        -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$S.tar.gz"
+    cat << EOF > "$S/0config.sh"
+#!/bin/sh
+
+./configure --prefix=/opt/lib/libspnav-$SPNAV_V
+EOF
+    chmod +x "$S/0config.sh"
+  fi
+
+  # FFmpeg
+  F="$SOURCES_PATH/packages/ffmpeg-$FFMPEG_V"
+  if [ ! -d "$F" ]; then
+    INFO "Downloading FFmpeg-$FFMPEG_V"
+    wget -c http://ffmpeg.org/releases/ffmpeg-$FFMPEG_V.tar.bz2 -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$F.tar.bz2"
+    cat << EOF > "$F/0config.sh"
+#!/bin/sh
+
+./configure \\
+    --cc="/usr/bin/gcc-4.7 -Wl,--as-needed" \\
+    --extra-ldflags="-pthread -static-libgcc" \\
+    --prefix=/opt/lib/ffmpeg-$FFMPEG_V \\
+    --enable-static \\
+    --enable-avfilter \\
+    --disable-vdpau \\
+    --disable-bzlib \\
+    --disable-libgsm \\
+    --enable-libschroedinger \\
+    --disable-libspeex \\
+    --enable-libtheora \\
+    --enable-libvorbis \\
+    --enable-pthreads \\
+    --enable-zlib \\
+    --enable-libvpx \\
+    --enable-stripping \\
+    --enable-runtime-cpudetect  \\
+    --disable-vaapi \\
+    --enable-libopenjpeg \\
+    --disable-libfaac \\
+    --disable-nonfree \\
+    --enable-gpl \\
+    --disable-postproc \\
+    --disable-x11grab \\
+    --enable-libmp3lame \\
+    --disable-librtmp \\
+    --enable-libx264 \\
+    --enable-libxvid \\
+    --disable-libopencore-amrnb \\
+    --disable-libopencore-amrwb \\
+    --disable-libdc1394 \\
+    --disable-version3 \\
+    --disable-outdev=sdl \\
+    --disable-outdev=alsa \\
+    --disable-indev=sdl \\
+    --disable-indev=alsa \\
+    --disable-indev=jack \\
+    --disable-indev=lavfi
+
+#    --enable-debug
+#    --disable-optimizations
+#    --disable-ffplay
+EOF
+    chmod +x "$F/0config.sh"
+  fi
+
+  # Boost
+  B="$SOURCES_PATH/packages/boost_$BOOST_V"
+  if [ ! -d "$B" ]; then
+    INFO "Downloading Boost-$BOOST_V"
+    b_d=`echo "$BOOST_V" | sed -r 's/_/./g'`
+    wget -c http://sourceforge.net/projects/boost/files/boost/$b_d/boost_$BOOST_V.tar.bz2/download -O "$B.tar.bz2"
+    tar -C "$SOURCES_PATH/packages" -xf "$B.tar.bz2"
+  fi
+
+  # Python
+  P="$SOURCES_PATH/packages/Python-$PYTHON_V"
+  if [ ! -d "$P" ]; then
+    INFO "Downloading Python-$PYTHON_V"
+    wget -c http://python.org/ftp/python/$PYTHON_V/Python-$PYTHON_V.tar.bz2 -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$P.tar.bz2"
+    cat << EOF > "$P/0config.sh"
+#!/bin/sh
+
+# NOTE: this sounds strange, but make sure /dev/shm/ is writable by your user,
+#        otherwise syncronization primitives wouldn't be included into python
+if [[ "`stat -c '%a' /dev/shm/`" != "777" ]]; then
+  echo "Error checking syncronization primitives"
+  exit 1
+fi
+
+./configure --prefix=/opt/lib/python-$PYTHON_V \\
+  --enable-ipv6 \\
+  --enable-loadable-sqlite-extensions \\
+  --with-dbmliborder=bdb \\
+  --with-wide-unicode \\
+  --with-computed-gotos \\
+  --with-pymalloc
+EOF
+    chmod +x "$P/0config.sh"
+  fi
+
+
+  # OpenImageIO
+  O="$SOURCES_PATH/packages/OpenImageIO-$OIIO_V"
+  if [ ! -d "$O" ]; then
+    INFO "Downloading OpenImageIO-$OIIO_V"
+    wget -c https://github.com/OpenImageIO/oiio/tarball/Release-$OIIO_V -O "$O.tar.gz"
+    tar -C "$SOURCES_PATH/packages" -xf "$O.tar.gz"
+    mv $SOURCES_PATH/packages/OpenImageIO-oiio* $O
+    mkdir $O/build
+    cat << EOF > "$O/build/prepare.sh"
+#!/bin/sh
+
+if file /bin/cp | grep -q '32-bit'; then
+  cflags="-fPIC -m32 -march=i686"
+else
+  cflags="-fPIC"
+fi
+
+cmake \\
+    -D CMAKE_BUILD_TYPE=Release \\
+    -D CMAKE_PREFIX_PATH=/opt/lib/oiio-$OIIO_V \\
+    -D CMAKE_INSTALL_PREFIX=/opt/lib/oiio-$OIIO_V \\
+    -D BUILDSTATIC=ON \\
+    -D USE_JASPER=OFF \\
+    -D CMAKE_CXX_FLAGS:STRING="\${cflags}" \\
+    -D CMAKE_C_FLAGS:STRING="\${cflags}" \\
+    -D CMAKE_EXE_LINKER_FLAGS='-lgcc_s -lgcc' \\
+    -D BOOST_ROOT=/opt/lib/boost \\
+    ../src
+EOF
+    chmod +x "$O/build/prepare.sh"
+  fi
+
+  # OpenColorIO
+  O="$SOURCES_PATH/packages/OpenColorIO-$OCIO_V"
+  if [ ! -d "$O" ]; then
+    INFO "Downloading OpenColorIO-$OCIO_V"
+    wget -c http://github.com/imageworks/OpenColorIO/tarball/v$OCIO_V -O "$O.tar.gz"
+    tar -C "$SOURCES_PATH/packages" -xf "$O.tar.gz"
+    mv $SOURCES_PATH/packages/imageworks-OpenColorIO* $O
+    mkdir $O/build
+    cat << EOF > "$O/build/prepare.sh"
+#!/bin/sh
+
+if file /bin/cp | grep -q '32-bit'; then
+  cflags="-fPIC -m32 -march=i686"
+else
+  cflags="-fPIC"
+fi
+
+cmake \\
+  -D CMAKE_BUILD_TYPE=Release \\
+  -D CMAKE_PREFIX_PATH=/opt/lib/ocio-1.0.7 \\
+  -D CMAKE_INSTALL_PREFIX=/opt/lib/ocio-1.0.7 \\
+  -D BUILDSTATIC=ON \\
+  -D CMAKE_CXX_FLAGS:STRING="\${cflags}" \\
+  -D CMAKE_C_FLAGS:STRING="\${cflags}" \\
+  -D CMAKE_EXE_LINKER_FLAGS='-lgcc_s -lgcc' \\
+  ..
+EOF
+
+    chmod +x "$O/build/prepare.sh"
+  fi
+
+  # Mesa
+  M="$SOURCES_PATH/packages/Mesa-$MESA_V"
+  if [ ! -d "$M" ]; then
+    INFO "Downloading Mesa-$MESA_V"
+    wget -c ftp://ftp.freedesktop.org/pub/mesa/$MESA_V/MesaLib-$MESA_V.tar.bz2 -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$SOURCES_PATH/packages/MesaLib-$MESA_V.tar.bz2"
+    cat << EOF > "$M/0config.sh"
+#!/bin/sh
+
+OPTS="--with-driver=xlib \\
+  --disable-driglx-direct \\
+  --disable-egl \\
+  --enable-gallium-gbm=no \\
+  --enable-gallium-egl=no \\
+  --enable-gallium-llvm=no \\
+  --with-gallium-drivers=swrast \\
+  --with-dri-drivers=swrast \\
+  --prefix=/opt/lib/mesa-$MESA_V"
+
+if file /bin/cp | grep -q '32-bit'; then
+  ./configure CC="gcc-4.7 -Wl,--as-needed" CXX="g++-4.7 -Wl,--as-needed" LDFLAGS="-pthread -static-libgcc" \${OPTS} --enable-32-bit #--build=i486-linux-gnu
+else
+  ./configure CC="gcc-4.7 -Wl,--as-needed" CXX="g++-4.7 -Wl,--as-needed" LDFLAGS="-pthread -static-libgcc" \${OPTS}
+fi
+
+EOF
+    chmod +x "$M/0config.sh"
+  fi
+
+  # OpenAL
+  O="$SOURCES_PATH/packages/openal-soft-$OPENAL_V"
+  if [ ! -d "$O" ]; then
+    INFO "Downloading OpenAL-$OPENAL_V"
+    wget -c http://kcat.strangesoft.net/openal-releases/openal-soft-$OPENAL_V.tar.bz2 -P "$SOURCES_PATH/packages"
+    tar -C "$SOURCES_PATH/packages" -xf "$SOURCES_PATH/packages/openal-soft-$OPENAL_V.tar.bz2"
+    cat << EOF > "$O/build-openal.sh"
+#!/bin/sh
+
+DEB_CMAKE_OPTIONS="-DCMAKE_VERBOSE_MAKEFILE=ON \\
+    -DCMAKE_INSTALL_PREFIX=/opt/lib/openal-$OPENAL_V \\
+    -DCMAKE_BUILD_TYPE:String=Release \\
+    -DALSOFT_CONFIG=ON \\
+    -DLIBTYPE=STATIC .. "
+
+BUILD_TREE=./build-tree
+
+rm -rf "\${BUILD_TREE}"
+mkdir -p "\${BUILD_TREE}"
+cd "\${BUILD_TREE}"
+
+sh -c "cmake \`echo \$DEB_CMAKE_OPTIONS\`"
+make -j$THREADS
+make install
+EOF
+    chmod +x "$O/build-openal.sh"
+  fi
+
+  # OpenCollada
+  O="$SOURCES_PATH/packages/opencollada"
+  if [ ! -d "$O" ]; then
+    INFO "Checking out OpenCollada sources"
+    svn co http://opencollada.googlecode.com/svn/trunk $O
+
+    cat << EOF > "$O/build_all.sh"
+#!/bin/sh
+
+scons RELEASE=0 NOVALIDATION=1 XMLPARSER=libxmlnative PCRENATIVE=1 SHAREDLIB=0 -j ${THREADS} --clean
+scons RELEASE=1 NOVALIDATION=1 XMLPARSER=libxmlnative PCRENATIVE=1 SHAREDLIB=0 -j ${THREADS} --clean
+
+scons RELEASE=0 NOVALIDATION=1 XMLPARSER=libxmlnative PCRENATIVE=1 SHAREDLIB=0 -j ${THREADS}
+scons RELEASE=1 NOVALIDATION=1 XMLPARSER=libxmlnative PCRENATIVE=1 SHAREDLIB=0 -j ${THREADS}
+EOF
+
+    cat << EOF > "$O/prepare_lib-libxml.sh"
+#!/bin/bash
+
+src="./COLLADAStreamWriter/include
+./COLLADABaseUtils/include
+./COLLADABaseUtils/include/Math
+./COLLADAFramework/include
+./GeneratedSaxParser/include
+./COLLADASaxFrameworkLoader/include
+./COLLADASaxFrameworkLoader/include/generated14
+./COLLADASaxFrameworkLoader/include/generated15"
+
+if [ -z \$1 ]; then
+  arch="x86_64"
+else
+  arch=\$1
+fi
+
+libs="./GeneratedSaxParser/lib/posix/\${arch}/releaselibxml/libGeneratedSaxParser.a
+./Externals/MathMLSolver/lib/posix/\${arch}/release/libMathMLSolver.a
+./COLLADABaseUtils/lib/posix/\${arch}/release/libOpenCOLLADABaseUtils.a
+./COLLADAFramework/lib/posix/\${arch}/release/libOpenCOLLADAFramework.a
+./COLLADASaxFrameworkLoader/lib/posix/\${arch}/releaselibxmlNovalidation/libOpenCOLLADASaxFrameworkLoader.a
+./COLLADAStreamWriter/lib/posix/\${arch}/release/libOpenCOLLADAStreamWriter.a
+./Externals/UTF/lib/posix/\${arch}/release/libUTF.a
+./common/libBuffer/lib/posix/\${arch}/release/libbuffer.a
+./common/libftoa/lib/posix/\${arch}/release/libftoa.a"
+
+#./Externals/pcre/lib/posix/\${arch}/release/libpcre.a
+#./Externals/LibXML/lib/posix/\${arch}/release/libxml.a
+
+debug_libs="./GeneratedSaxParser/lib/posix/\${arch}/debuglibxml/libGeneratedSaxParser.a
+./Externals/MathMLSolver/lib/posix/\${arch}/debug/libMathMLSolver.a
+./COLLADABaseUtils/lib/posix/\${arch}/debug/libOpenCOLLADABaseUtils.a
+./COLLADAFramework/lib/posix/\${arch}/debug/libOpenCOLLADAFramework.a
+./COLLADASaxFrameworkLoader/lib/posix/\${arch}/debuglibxmlNovalidation/libOpenCOLLADASaxFrameworkLoader.a
+./COLLADAStreamWriter/lib/posix/\${arch}/debug/libOpenCOLLADAStreamWriter.a
+./Externals/UTF/lib/posix/\${arch}/debug/libUTF.a
+./common/libBuffer/lib/posix/\${arch}/debug/libbuffer.a
+./common/libftoa/lib/posix/\${arch}/debug/libftoa.a"
+
+#./Externals/pcre/lib/posix/\${arch}/debug/libpcre.a
+#./Externals/LibXML/lib/posix/\${arch}/debug/libxml.a
+
+d="opencollada-libxml"
+rm -rf \${d}
+mkdir -p \${d}/include
+
+for i in \${src}; do
+  mkdir -p \${d}/include/\${i}
+  cp \${i}/*.h \${d}/include/\${i}
+done
+
+mkdir \${d}/lib
+for i in \${libs}; do
+  echo "" > /dev/null
+  cp \${i} \${d}/lib
+done
+
+for i in \${debug_libs}; do
+  f=\`basename \${i}\`
+  o=\${f/\\.a/_d.a}
+  cp \${i} \${d}/lib/\${o}
+done
+
+rm -rf /opt/lib/opencollada
+mv \${d} /opt/lib/opencollada
+chown -R root:staff /opt/lib/opencollada
+EOF
+
+    chmod +x "$O/build_all.sh"
+    chmod +x "$O/prepare_lib-libxml.sh"
+  fi
+
+  # Blender
+  B="$SOURCES_PATH/blender"
+  if [ ! -d "$B" ]; then
+    INFO "Checking out Blender sources"
+    svn co https://svn.blender.org/svnroot/bf-blender/trunk/blender $B
+  fi
+
+  # CUDA Toolkit
+  C=$SOURCES_PATH/cudatoolkit
+  if [ ! -f "$C/$CUDA_32" ]; then
+    INFO "Downloading CUDA 32bit toolkit"
+    mkdir -p $C
+    wget -c http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/$CUDA_32 -P $C
+  fi
+
+  if [ ! -f "$C/$CUDA_64" ]; then
+    INFO "Downloading CUDA 64bit toolkit"
+    mkdir -p $C
+    wget -c http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/$CUDA_64 -P $C
+  fi
+
+  if [ ! -f $SOURCES_PATH/Readme.txt ]; then
+
+    cat << EOF > $SOURCES_PATH/Readme.txt
+This directory contains different things needed for Blender builds
+
+blender/: directory with blender's svnsnapshot
+
+blender-build/, blender-install/: build and install directories for
+                                  automated release creation
+
+buildbot-i686-slave/,
+buildbot-x86_64-slave/: buildbot slave environments for automated builds
+                        (maybe it'll be better to move them to /home?)
+
+staticlibs/: set of static libs. Mostly needed to make static linking prioretized
+             under dynamic linking
+
+release-builder/: all stuff needed for release archives preparation
+
+Hope all this would help you.
+
+-Sergey-
+EOF
+  fi
+
+  INSTALL_RELEASE_BUILDER $SOURCES_PATH
+}
+
+DO_BACKPORT() {
+  CHROOT_ARCH=$1
+  CHROOT_PATH=$2
+
+  RUN="chroot $CHROOT_PATH"
+  P="/home/sources/backport"
+
+  # Backport fresh binutils
+  if [ `$RUN dpkg-query -W -f='${Version}\n' binutils | grep -c $BINUTILS_V` -eq "0" ]; then
+    INFO "Backporting binutils"
+    B="$P/binutils/binutils-$BINUTILS_V"
+    pkg="$P/binutils/binutils_${BINUTILS_FV}_amd64.deb"
+
+    if [ ! -d "$CHROOT_PATH/$B" ]; then
+      INFO "Unpacking binutils"
+      $RUN dpkg-source -x "$P/binutils/binutils_$BINUTILS_FV.dsc" "$B"
+    fi
+
+    if [ "$CHROOT_ARCH" = "i386" ]; then
+      pkg=`echo "$pkg" | sed -r 's/amd64/i386/g'`
+    fi
+
+    if [ ! -f "$CHROOT_PATH/$pkg" ]; then
+      INFO "Compiling binutils"
+      sed -ie 's/with_check := yes/with_check := no/' "$CHROOT_PATH/$B/debian/rules"
+      $RUN sh -c "cd '$B' && dpkg-buildpackage -rfakeroot -j$THREADS"
+    fi
+
+    INFO "Installing binutils"
+    $RUN dpkg -i "$pkg"
+
+    INFO "Cleaning binutils"
+    $RUN sh -c "cd '$B' && fakeroot debian/rules clean"
+  fi
+
+  # Install fresh gcc
+  if [ `$RUN dpkg-query -W -f='${Status}\n' gcc-4.7 2> /dev/null | grep -c installed` -eq "0" ]; then
+    INFO "Backporting gcc-4.7"
+    G="$P/gcc-4.7/gcc-$GCC_V"
+
+    pkg="cpp-4.7_4.7.1-7_amd64.deb  gcc-4.7-base_4.7.1-7_amd64.deb \
+          libstdc++6-4.7-dev_4.7.1-7_amd64.deb libstdc++6_4.7.1-7_amd64.deb libgcc1_4.7.1-7_amd64.deb \
+          libgomp1_4.7.1-7_amd64.deb libitm1_4.7.1-7_amd64.deb libquadmath0_4.7.1-7_amd64.deb \
+          gcc-4.7_4.7.1-7_amd64.deb g++-4.7_4.7.1-7_amd64.deb"
+
+    if [ ! -d "$CHROOT_PATH/$G" ]; then
+      INFO "Unpacking gcc-4.7"
+      $RUN dpkg-source -x "$P/gcc-4.7/gcc-$GCC_FV.dsc" "$G"
+    fi
+
+    if [ "$CHROOT_ARCH" = "i386" ]; then
+      pkg=`echo "$pkg" | sed -r 's/amd64/i386/g'`
+    fi
+
+    ok=true
+    for x in `echo "$pkg"`; do
+      if [ ! -f "$CHROOT_PATH/$P/gcc-4.7/$x" ]; then
+        ok=false
+        break;
+      fi
+    done
+
+    if ! $ok; then
+      INFO "Compiling gcc-4.7"
+      sed -ie 's/#with_check := disabled by hand/with_check := disabled by hand/' "$CHROOT_PATH/$G/debian/rules.defs"
+      sed -ie 's/dpkg-dev (>= 1.16.0~ubuntu4)/dpkg-dev (>= 1.15.8)/' "$CHROOT_PATH/$G/debian/control"
+      sed -ie 's/doxygen (>= 1.7.2)/doxygen (>= 1.7.1)/' "$CHROOT_PATH/$G/debian/control"
+      sed -ie 's/libmpfr-dev (>= 3.0.0-9~)/libmpfr-dev (>= 3.0.0)/' "$CHROOT_PATH/$G/debian/control"
+      sed -ie 's/libc6-dev (>= 2.13-5)/libc6-dev (>= 2.11.3)/' "$CHROOT_PATH/$G/debian/control"
+      sed -ie 's/libgmp-dev (>= 2:5.0.1~)/libgmp3-dev (>= 2:4.3.2)/' "$CHROOT_PATH/$G/debian/control"
+      $RUN sh -c "cd '$G' && dpkg-buildpackage -rfakeroot"
+    fi
+
+    inst=""
+    for x in `echo "$pkg"`; do
+      inst="$inst $P/gcc-4.7/$x"
+    done
+
+    INFO "Installing gcc-4.7"
+    $RUN dpkg -i $inst
+
+    INFO "Cleaning gcc-4.7"
+    $RUN sh -c "cd '$G' && fakeroot debian/rules clean"
+  fi
+}
+
+DO_COMPILE() {
+  CHROOT_ARCH=$1
+  CHROOT_PATH=$2
+
+  RUN="chroot $CHROOT_PATH"
+  P="/home/sources/packages"
+  L="$CHROOT_PATH/opt/lib"
+
+  # JeMalloc
+  if [ ! -d "$L/jemalloc-$JEMALLOC_V" ]; then
+    INFO "Copmiling jemalloc-$JEMALLOC_V"
+    $RUN sh -c "cd '$P/jemalloc-$JEMALLOC_V' && ./0config.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/jemalloc"
+    ln -s "jemalloc-$JEMALLOC_V" "$L/jemalloc"
+  fi
+
+  # libspnav
+  if [ ! -d "$L/libspnav-$SPNAV_V" ]; then
+    INFO "Copmiling libspnav-$SPNAV_V"
+    mkdir -p "$L/libspnav-$SPNAV_V/lib"
+    mkdir -p "$L/libspnav-$SPNAV_V/include"
+    $RUN sh -c "cd '$P/libspnav-$SPNAV_V' && ./0config.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/libspnav"
+    ln -s "libspnav-$SPNAV_V" "$L/libspnav"
+  fi
+
+  # FFmpeg
+  if [ ! -d "$L/ffmpeg-$FFMPEG_V" ]; then
+    INFO "Copmiling ffmpeg-$FFMPEG_V"
+    $RUN sh -c "cd '$P/ffmpeg-$FFMPEG_V' && ./0config.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/ffmpeg"
+    ln -s "ffmpeg-$FFMPEG_V" "$L/ffmpeg"
+  fi
+
+  # Boost
+  V=`echo $BOOST_V | sed -r 's/_/./g'`
+  if [ ! -d "$L/boost-$V" ]; then
+    INFO "Copmiling boost-$V"
+    $RUN sh -c "cd '$P/boost_$BOOST_V' && ./bootstrap.sh && ./b2 --clean && ./b2 install --prefix='/opt/lib/boost-$V' && ./b2 --clean"
+
+    rm -f "$L/boost"
+    ln -s "boost-$V" "$L/boost"
+  fi
+
+  # OCIO
+  if [ ! -d "$L/ocio-$OCIO_V" ]; then
+    INFO "Copmiling ocio-$OCIO_V"
+    $RUN sh -c "cd '$P/OpenColorIO-$OCIO_V/build' && ./prepare.sh && make clean && make -j$THREADS && make install && make clean"
+
+    # Force linking against sttaic libs
+    rm -f $L/ocio-$OCIO_V/lib/*.so*
+
+    # Additional depencencies
+    cp $CHROOT_PATH/$P/OpenColorIO-$OCIO_V/build/ext/dist/lib/libtinyxml.a $L/ocio-$OCIO_V/lib
+    cp $CHROOT_PATH/$P/OpenColorIO-$OCIO_V/build/ext/dist/lib/libyaml-cpp.a $L/ocio-$OCIO_V/lib
+
+    rm -f "$L/ocio"
+    ln -s "ocio-$OCIO_V" "$L/ocio"
+  fi
+
+  # OIIO
+  if [ ! -d "$L/oiio-$OIIO_V" ]; then
+    INFO "Copmiling oiio-$OIIO_V"
+    $RUN sh -c "cd '$P/OpenImageIO-$OIIO_V/build' && ./prepare.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/oiio"
+    ln -s "oiio-$OIIO_V" "$L/oiio"
+  fi
+
+  # Python
+  if [ ! -d "$L/python-$PYTHON_V" ]; then
+    INFO "Copmiling Python-$PYTHON_V"
+
+    cat << EOF > $CHROOT_PATH/$P/Python-$PYTHON_V/Modules/Setup.local
+_md5 md5module.c
+
+_sha1 sha1module.c
+_sha256 sha256module.c
+_sha512 sha512module.c
+EOF
+
+    $RUN sh -c "cd '$P/Python-$PYTHON_V' && ./0config.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/python-$PYTHIN_V_SHORT"
+    ln -s "python-$PYTHON_V" "$L/python-$PYTHIN_V_SHORT"
+  fi
+
+  # Mesa
+  if [ ! -d "$L/mesa-$MESA_V" ]; then
+    INFO "Copmiling Mesa-$MESA_V"
+
+    $RUN sh -c "cd '$P/Mesa-$MESA_V' && ./0config.sh && make clean && make -j$THREADS && make install && make clean"
+
+    rm -f "$L/mesa"
+    ln -s "mesa-$MESA_V" "$L/mesa"
+  fi
+
+  # OpenAL
+  if [ ! -d "$L/openal-$OPENAL_V" ]; then
+    INFO "Copmiling openal-$OPENAL_V"
+
+    $RUN sh -c "cd '$P/openal-soft-$OPENAL_V' && ./build-openal.sh"
+
+    rm -f "$L/openal"
+    ln -s "openal-$OPENAL_V" "$L/openal"
+  fi
+
+  # OpenCollada
+  if [ ! -d "$L/opencollada" ]; then
+    INFO "Copmiling opencollada"
+
+    cat << EOF > "$CHROOT_PATH/$P/opencollada/collada.patch"
+Index: common/libBuffer/include/CommonBuffer.h
+===================================================================
+--- common/libBuffer/include/CommonBuffer.h    (revision 876)
++++ common/libBuffer/include/CommonBuffer.h    (working copy)
+@@ -12,6 +12,7 @@
+ #define __COMMON_BUFFER_H__
+ #include "CommonIBufferFlusher.h"
++#include "COLLADABUPlatform.h"
+ namespace Common
+ {
+Index: common/libBuffer/src/CommonLogFileBufferFlusher.cpp
+===================================================================
+--- common/libBuffer/src/CommonLogFileBufferFlusher.cpp        (revision 876)
++++ common/libBuffer/src/CommonLogFileBufferFlusher.cpp        (working copy)
+@@ -10,6 +10,34 @@
+ #include "CommonLogFileBufferFlusher.h"
++#include <stdio.h>
++#include <errno.h>
++
++#ifndef _WIN32
++FILE *_wfopen(const wchar_t *path, const char *mode)
++{
++      const wchar_t *src = path;
++      char *path_mbs;
++      int n;
++      FILE *file;
++
++      n = (int)wcsrtombs(NULL, &src, 0, NULL);
++
++      if (n < 0)
++              return NULL;
++
++      path_mbs = (char *)malloc(n + 1);
++      wcsrtombs(path_mbs, &path, n, NULL);
++      path_mbs[n] = 0;
++
++      file = fopen(path_mbs, mode);
++
++      free(path_mbs);
++
++      return file;
++}
++#endif
++
+ namespace Common
+ {
+       //--------------------------------------------------------------------
+@@ -35,7 +63,7 @@
+ #ifdef _WIN32
+               mError = (int)_wfopen_s( &stream, fileName, L"wb" );
+ #else
+-              stream = _wfopen( fileName, L"wb" );
++              stream = _wfopen( fileName, "wb" );
+               mError = stream ? 0 : errno;
+ #endif
+               if ( !mError )
+@@ -65,7 +93,7 @@
+ #else
+               if ( mUseWideFileName )
+               {
+-                      stream = _wfopen( mWideFileName.c_str(), L"a" );
++                      stream = _wfopen( mWideFileName.c_str(), "a" );
+               }
+               else
+               {
+Index: common/libBuffer/SConscript
+===================================================================
+--- common/libBuffer/SConscript        (revision 876)
++++ common/libBuffer/SConscript        (working copy)
+@@ -11,7 +11,7 @@
+ targetPath = outputDir + libName
+-incDirs = ['include/', '../libftoa/include']
++incDirs = ['include/', '../libftoa/include', '../../COLLADABaseUtils/include/', '../../Externals/UTF/include']
+ src = []
+EOF
+
+    # We're building in a chroot, architecture of host system would be used by scons
+    collada_arch="x86_64"
+
+    $RUN sh -c "cd '$P/opencollada' && svn revert . -R && cat collada.patch | patch -p0 && ./build_all.sh && ./prepare_lib-libxml.sh  $collada_arch"
+  fi
+}
+
+ADD_REPO() {
+  CHROOT_PATH=$1
+  DESC=$2
+  REPO=$3
+  C="$CHROOT_PATH/etc/apt/sources.list"
+  RUN="chroot $CHROOT_PATH"
+
+  if [ `cat "$C" | grep -c "$REPO"` -eq "0" ]; then
+    INFO "Adding repo $DESC"
+    echo "" >> $C
+    echo "deb $REPO" >> $C
+    echo "deb-src $REPO" >> $C
+
+    INFO "Updating packages list"
+    $RUN apt-get update
+  fi
+}
+
+INSTALL_CHROOT() {
+  CHROOT_ARCH=$1
+  CHROOT_PATH=$2
+
+  RUN="chroot $CHROOT_PATH"
+
+  # Install fresh debian to a chroot
+  if [ ! -d "$CHROOT_PATH" ]; then
+
+    INFO "Installing Debian ${DEBIAN_BRANCH} to ${CHROOT_PATH}"
+    debootstrap --arch "${CHROOT_ARCH}" "${DEBIAN_BRANCH}" "${CHROOT_PATH}" "${DEBIAN_MIRROR}"
+  fi
+
+  # Configure users and groups
+
+  if [ `cat ${CHROOT_PATH}/etc/group | grep -c developers` -eq "0" ]; then
+    INFO "Creating gorup 'developers'"
+    $RUN groupadd -g 7001 developers
+  fi
+
+  if [ `mount | grep -c "$CHROOT_PATH/dev"` -eq "0" ]; then
+    INFO "Mounting devices from host system to chroot"
+
+    mount -t proc none $CHROOT_PATH/proc
+    mount -t auto -o bind /dev $CHROOT_PATH/dev
+    mount -t devpts -o mode=0620 none $CHROOT_PATH/dev/pts
+  fi
+
+  # Configure apt and install packages
+
+  if [ ! -f ${CHROOT_PATH}/etc/apt/apt.conf ]; then
+    INFO "Setting up apt to not use recommended packages (saves disk space)"
+
+    cat << EOF > "${CHROOT_PATH}/etc/apt/apt.conf"
+APT {
+  Default-Release "${DEBIAN_BRANCH}";
+  Install-Recommends "0";
+};
+EOF
+  fi
+
+  ADD_REPO $CHROOT_PATH "mirror.yandex.ru" "http://mirror.yandex.ru/debian-multimedia/ squeeze main non-free"
+  ADD_REPO $CHROOT_PATH "backports.debian.org" "http://backports.debian.org/debian-backports squeeze-backports main non-free"
+
+  $RUN apt-get upgrade
+
+  $RUN apt-get install -y --force-yes deb-multimedia-keyring libx264-dev libxvidcore4-dev libmp3lame-dev
+
+  if [ `$RUN dpkg-query -W -f='${Status}\n' locales | grep -c not-installed` -eq "1" ]; then
+    INFO "Configuring locales"
+    $RUN apt-get install -y locales
+    $RUN localedef -i en_US -f UTF-8 en_US.UTF-8
+  fi
+
+  INFO "Installing packages from repository"
+  $RUN apt-get install -y mc gcc g++ cmake python dpkg-dev build-essential autoconf bison \
+      flex gettext texinfo dejagnu quilt file lsb-release zlib1g-dev fakeroot debhelper \
+      g++-multilib  libtool autoconf2.64 automake  gawk lzma patchutils gperf sharutils \
+      libcloog-ppl-dev libmpc-dev libmpfr-dev libgmp3-dev autogen realpath chrpath doxygen \
+      graphviz gsfonts-x11 texlive-latex-base libelfg0-dev libx11-dev yasm libopenjpeg-dev \
+      libschroedinger-dev libtheora-dev libvorbis-dev libvpx-dev=$VPX_V \
+      libopenexr-dev libpng-dev libjpeg-dev libtiff-dev python-dev libbz2-dev libreadline-dev \
+      libsqlite3-dev liblzma-dev libncurses5-dev xutils-dev libxext-dev python-libxml2 \
+      libglu1-mesa-dev libfftw3-dev libfreetype6-dev libsdl1.2-dev libopenal-dev libjack-dev \
+      libxi-dev portaudio19-dev po4a subversion scons libpcre3-dev libexpat1-dev sudo \
+      expect
+
+  if [ $CHROOT_ARCH = "amd64" ]; then
+    $RUN apt-get install -y libc6-dev-i386 lib32gcc1
+  fi
+
+  # Configure sources directory
+  if [ ! -d "$CHROOT_PATH/home/sources" ]; then
+    INFO "Creating sources directory"
+    $RUN mkdir "/home/sources"
+    $RUN chmod 775 /home/sources
+    $RUN chown root:developers /home/sources
+  fi
+
+  # Bind directory from host system
+  if [ ! -d "$CHROOT_PATH/home/sources/backport" ]; then
+    INFO "Binding sources directory from host system to chroot"
+    mount -o bind "$SOURCES_PATH" "$CHROOT_PATH/home/sources"
+  fi
+
+  if [ "`$RUN getent passwd $USER_ID`" = "" ]; then
+    INFO "Adding default user to chroot"
+    login=`getent passwd $USER_ID | cut -d : -f 1`
+    $RUN useradd -d "/home/$login" -G developers,sudo -m -u $USER_ID "$login"
+  fi
+
+  # Backport packages
+  DO_BACKPORT "$CHROOT_ARCH" "$CHROOT_PATH"
+
+  # Set default compiler to gcc-4.7
+  if [ `readlink "$CHROOT_PATH/usr/bin/gcc"` != "gcc-4.7" ]; then
+    INFO "Setting gcc-4.7 as default compiler"
+    rm -f $CHROOT_PATH/usr/bin/gcc
+    rm -f $CHROOT_PATH/usr/bin/g++
+    ln -s gcc-4.7 $CHROOT_PATH/usr/bin/gcc
+    ln -s g++-4.7 $CHROOT_PATH/usr/bin/g++
+  fi
+
+  # Compile packages
+  DO_COMPILE "$CHROOT_ARCH" "$CHROOT_PATH"
+
+  # Install CUDA toolkit
+  if [ ! -d "$CHROOT_PATH/usr/local/cuda-$CUDA_V" ]; then
+        INFO "Installing CUDA toolkit"
+
+        if [ "$CHROOT_ARCH" = "amd64" ]; then
+          C="cudatoolkit_${CUDA_V}_linux_64_${CUDA_DISTR}.run"
+        else
+          C="cudatoolkit_${CUDA_V}_linux_32_${CUDA_DISTR}.run"
+        fi
+
+        rm -f $CHROOT_PATH/usr/local/cuda
+
+        chmod +x $CHROOT_PATH//home/sources/cudatoolkit/$C
+
+        $RUN /usr/bin/expect <<EOF
+        spawn /home/sources/cudatoolkit/$C
+        expect "Enter install path"
+        send "\n"
+        expect "Installation Complete"
+EOF
+
+    mv $CHROOT_PATH/usr/local/cuda $CHROOT_PATH/usr/local/cuda-$CUDA_V
+    ln -s cuda-$CUDA_V $CHROOT_PATH/usr/local/cuda
+    sudo ln -s /usr/bin/gcc-4.4 $CHROOT_PATH/usr/local/cuda/bin/gcc
+  fi
+
+  # Change permissions
+  INFO "Changing permissions on sources"
+  login=`$RUN getent passwd $USER_ID | cut -d : -f 1`
+  for x in /home/sources /opt/lib; do
+    $RUN chmod g+w -R $x
+    $RUN chown "$login:developers" -R $x
+  done
+}
+
+if ! which debootstrap > /dev/null 2>&1; then
+  ERROR "debootstrap command not found, can not create chroot environment"
+  ERROR "Use apt-get install debootstrap to install debootstrap"
+  exit 1
+fi
+
+if [ -z "$ENV_PATH" ]; then
+  ERROR "Incorrect environment directory is set"
+  exit 1
+fi
+
+INSTALL_SOURCES "$SOURCES_PATH"
+INSTALL_CHROOT amd64 "$AMD64_PATH"
+INSTALL_CHROOT i386 "$I686_PATH"
+
+INFO "Configurtion of build environment is completed!"
+echo "Add this lines to your /etc/fstab:"
+echo
+
+for x in $I686_PATH $AMD64_PATH; do
+  echo "none           $x/proc         proc      auto              0    0"
+  echo "/dev           $x/dev          auto      bind,auto         0    0"
+  echo "none           $x/dev/pts      devpts    mode=0620,auto    0    0"
+  echo "/home/sources  $x/home/sources auto      bind,auto         0    0"
+  echo
+done
+
+echo "Add this lines to your /etc/schroot/schroot.conf:"
+echo
+login=`getent passwd $USER_ID | cut -d : -f 1`
+
+for x in $I686_PATH $AMD64_PATH; do
+  echo [`basename $x`]
+  echo "description=Linux buildbot environment"
+  echo "directory=$x"
+  echo "users=$login"
+  echo "root-groups=root"
+  echo
+done