diff options
Diffstat (limited to 'build_files/build_environment/prepare_release_env.sh')
-rwxr-xr-x | build_files/build_environment/prepare_release_env.sh | 1555 |
1 files changed, 1555 insertions, 0 deletions
diff --git a/build_files/build_environment/prepare_release_env.sh b/build_files/build_environment/prepare_release_env.sh new file mode 100755 index 00000000000..9889feadcd2 --- /dev/null +++ b/build_files/build_environment/prepare_release_env.sh @@ -0,0 +1,1555 @@ +#!/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" + +OPENSSL_V="0.9.8o" +OPENSSL_FV="0.9.8o-4squeeze13" + +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 + + if [ ! -d "$SOURCES_PATH/backport/openssl" ]; then + INFO "Downloading openssl" + mkdir -p "$SOURCES_PATH/backport/openssl" + wget -c $DEBIAN_MIRROR/pool/main/o/openssl/openssl_$OPENSSL_FV.debian.tar.gz \ + $DEBIAN_MIRROR/pool/main/o/openssl/openssl_$OPENSSL_FV.dsc \ + $DEBIAN_MIRROR/pool/main/o/openssl/openssl_$OPENSSL_V.orig.tar.gz \ + -P "$SOURCES_PATH/backport/openssl" + 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 + + # Backport OpenSSL + if [ ! -f $CHROOT_PATH/usr/lib/libssl_pic.a ]; then + INFO "Backporting OpenSSL" + O="$P/openssl/openssl-$OPENSSL_V" + + pkg="libssl-dev_0.9.8o-4squeeze13_amd64.deb libssl0.9.8_0.9.8o-4squeeze13_amd64.deb openssl_0.9.8o-4squeeze13_amd64.deb" + + if [ ! -d "$CHROOT_PATH/$O" ]; then + INFO "Unpacking OpenSSL" + $RUN dpkg-source -x "$P/openssl/openssl_$OPENSSL_FV.dsc" "$O" + 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/openssl/$x" ]; then + ok=false + break; + fi + done + + if ! $ok; then + INFO "Compiling OpenSSL" + sed -ie 's/#\s*mv debian\/tmp\/usr\/lib\/libcrypto.a debian\/tmp\/usr\/lib\/libcrypto_pic.a/ mv debian\/tmp\/usr\/lib\/libcrypto.a debian\/tmp\/usr\/lib\/libcrypto_pic.a/' "$CHROOT_PATH/$O/debian/rules" + sed -ie 's/#\s*mv debian\/tmp\/usr\/lib\/libssl.a debian\/tmp\/usr\/lib\/libssl_pic.a/ mv debian\/tmp\/usr\/lib\/libssl.a debian\/tmp\/usr\/lib\/libssl_pic.a/' "$CHROOT_PATH/$O/debian/rules" + cat << EOF > $CHROOT_PATH/$O/debian/libssl-dev.files +usr/lib/libssl.so +usr/lib/libcrypto.so +usr/lib/libssl.a +usr/lib/libcrypto.a +usr/lib/libssl_pic.a +usr/lib/libcrypto_pic.a +usr/lib/pkgconfig +usr/include +usr/share/man/man3 +EOF + $RUN sh -c "cd '$O' && dpkg-buildpackage -rfakeroot -j$THREADS" + fi + + inst="" + for x in `echo "$pkg"`; do + inst="$inst $P/openssl/$x" + done + + INFO "Installing OpenSSL" + $RUN dpkg -i $inst + + echo "openssl hold" | $RUN dpkg --set-selections + echo "libssl-dev hold" | $RUN dpkg --set-selections + echo "libssl0.9.8 hold" | $RUN dpkg --set-selections + + INFO "Cleaning OpenSSL" + $RUN sh -c "cd '$O' && 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 + + sed -ie "s/libraries = \['ssl', 'crypto'\]/libraries = ['ssl_pic', 'crypto_pic', 'z']/" "$P/Python-$PYTHON_V/setup.py" + + $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 bc + + 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 |