diff options
author | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2012-11-27 05:18:54 +0400 |
---|---|---|
committer | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2012-11-27 05:18:54 +0400 |
commit | ff7c690e4064bbb1d6180668625d7b414000e9ea (patch) | |
tree | 4ac96ca8ed5a4e6a7ab1104d0271aba02266ace6 /build_files/build_environment/install_deps.sh | |
parent | 6b65102c20e9bdafd90f55f60c2a2084d873e809 (diff) | |
parent | 9b32776be349f5e738b449ca1298e65ce1b69d33 (diff) |
Merge w/ trunk: r52086-r52534 (As with last time, the game engine was not merged)soc-2012-swiss_cheese
Diffstat (limited to 'build_files/build_environment/install_deps.sh')
-rwxr-xr-x | build_files/build_environment/install_deps.sh | 1415 |
1 files changed, 1415 insertions, 0 deletions
diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh new file mode 100755 index 00000000000..935f37b53da --- /dev/null +++ b/build_files/build_environment/install_deps.sh @@ -0,0 +1,1415 @@ +#!/bin/bash + +DISTRO="" +SRC="$HOME/src/blender-deps" +INST="/opt/lib" +CWD=$PWD + +# OSL is horror for manual building even +# i would want it to be setteled for manual build first, +# and only then do it automatically +BUILD_OSL=false + +# Try to link everything statically. Use this to produce protable versions of blender. +ALL_STATIC=false + +THREADS=`cat /proc/cpuinfo | grep cores | uniq | sed -e "s/.*: *\(.*\)/\\1/"` +if [ -z "$THREADS" ]; then + THREADS=1 +fi + +COMMON_INFO="Source code of dependencies needed to be compiled will be downloaded and extracted into '$SRC'. +Built libs of dependencies needed to be compiled will be installed into '$INST'. +Please edit \$SRC and/or \$INST variables at the begining of this script if you want to use other paths! + +Number of threads for building: $THREADS. +Building OSL: $BUILD_OSL (edit \$BUILD_OSL var to change this). +All static linking: $ALL_STATIC (edit \$ALL_STATIC var to change this)." + + +PYTHON_VERSION="3.3.0" +PYTHON_VERSION_MIN="3.3" +PYTHON_SOURCE="http://python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.bz2" + +BOOST_VERSION="1.51.0" +_boost_version_nodots=`echo "$BOOST_VERSION" | sed -r 's/\./_/g'` +BOOST_SOURCE="http://sourceforge.net/projects/boost/files/boost/$BOOST_VERSION/boost_$_boost_version_nodots.tar.bz2/download" +BOOST_VERSION_MIN="1.49" + +OCIO_VERSION="1.0.7" +OCIO_SOURCE="https://github.com/imageworks/OpenColorIO/tarball/v$OCIO_VERSION" +OCIO_VERSION_MIN="1.0" + +OIIO_VERSION="1.1.1" +OIIO_SOURCE="https://github.com/OpenImageIO/oiio/tarball/Release-$OIIO_VERSION" +OIIO_VERSION_MIN="1.1" + +LLVM_VERSION="3.1" +LLVM_VERSION_MIN="3.0" +LLVM_VERSION_FOUND="" +LLVM_SOURCE="http://llvm.org/releases/$LLVM_VERSION/llvm-$LLVM_VERSION.src.tar.gz" +LLVM_CLANG_SOURCE="http://llvm.org/releases/$LLVM_VERSION/clang-$LLVM_VERSION.src.tar.gz" + +# OSL needs to be compiled for now! +OSL_VERSION="1.2.0" +OSL_SOURCE="https://github.com/mont29/OpenShadingLanguage/archive/blender-fixes.tar.gz" + +FFMPEG_VERSION="1.0" +FFMPEG_SOURCE="http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" +FFMPEG_VERSION_MIN="0.7.6" +_ffmpeg_list_sep=";" + +# FFMPEG optional libs. +VORBIS_USE=false +VORBIS_DEV="" +SCHRO_USE=false +SCRHO_DEV="" +THEORA_USE=false +THEORA_DEV="" +XVID_USE=false +XVID_DEV="" +X264_USE=false +X264_DEV="" +X264_VERSION_MIN=0.118 +VPX_USE=false +VPX_VERSION_MIN=0.9.7 +VPX_DEV="" +MP3LAME_USE=false +MP3LAME_DEV="" +OPENJPEG_USE=false +OPENJPEG_DEV="" + +# Switch to english language, else some things (like check_package_DEB()) won't work! +LANG_BACK=$LANG +LANG="" +export LANG + +ERROR() { + echo "${@}" +} + +INFO() { + echo "${@}" +} + +# Return 0 if $1 = $2 (i.e. 1.01.0 = 1.1, but 1.1.1 != 1.1), else 1. +# $1 and $2 should be version numbers made of numbers only. +version_eq() { + backIFS=$IFS + IFS='.' + + # Split both version numbers into their numeric elements. + arr1=( $1 ) + arr2=( $2 ) + + ret=1 + + count1=${#arr1[@]} + count2=${#arr2[@]} + if [ $count2 -ge $count1 ]; then + _t=$count1 + count1=$count2 + count2=$_t + arr1=( $2 ) + arr2=( $1 ) + fi + + ret=0 + for (( i=0; $i < $count2; i++ )) + do + if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then + ret=1 + break + fi + done + + for (( i=$count2; $i < $count1; i++ )) + do + if [ $(( 10#${arr1[$i]} )) -ne 0 ]; then + ret=1 + break + fi + done + + IFS=$backIFS + return $ret +} + +# Return 0 if $1 >= $2, else 1. +# $1 and $2 should be version numbers made of numbers only. +version_ge() { + version_eq $1 $2 + if [ $? -eq 1 -a $(echo -e "$1\n$2" | sort --version-sort | head --lines=1) = "$1" ]; then + return 1 + else + return 0 + fi +} + +# Return 0 if $1 is into $2 (e.g. 3.3.2 is into 3.3, but not 3.3.0 or 3.3.5), else 1. +# $1 and $2 should be version numbers made of numbers only. +# $1 should be at least as long as $2! +version_match() { + backIFS=$IFS + IFS='.' + + # Split both version numbers into their numeric elements. + arr1=( $1 ) + arr2=( $2 ) + + ret=1 + + count1=${#arr1[@]} + count2=${#arr2[@]} + if [ $count1 -ge $count2 ]; then + ret=0 + for (( i=0; $i < $count2; i++ )) + do + if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then + ret=1 + break + fi + done + fi + + IFS=$backIFS + return $ret +} + +detect_distro() { + if [ -f /etc/debian_version ]; then + DISTRO="DEB" + elif [ -f /etc/redhat-release ]; then + DISTRO="RPM" + elif [ -f /etc/SuSE-release ]; then + DISTRO="SUSE" + fi +} + +prepare_opt() { + INFO "Ensuring $INST exists and is writable by us" + sudo mkdir -p $INST + sudo chown $USER $INST + sudo chmod 775 $INST +} + +# Check whether the current package needs to be recompiled, based on a dummy file containing a magic number in its name... +magic_compile_check() { + if [ -f $INST/.$1-magiccheck-$2 ]; then + return 0 + else + return 1 + fi +} + +magic_compile_set() { + rm -f $INST/.$1-magiccheck-* + touch $INST/.$1-magiccheck-$2 +} + +compile_Python() { + # To be changed each time we make edits that would modify the compiled result! + py_magic=0 + + _src=$SRC/Python-$PYTHON_VERSION + _inst=$INST/python-$PYTHON_VERSION + + # Clean install if needed! + magic_compile_check python-$PYTHON_VERSION $py_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building Python-$PYTHON_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + mkdir -p $SRC + wget -c $PYTHON_SOURCE -O $_src.tar.bz2 + + INFO "Unpacking Python-$PYTHON_VERSION" + tar -C $SRC -xf $_src.tar.bz2 + fi + + cd $_src + + ./configure --prefix=$_inst --enable-ipv6 \ + --enable-loadable-sqlite-extensions --with-dbmliborder=bdb \ + --with-computed-gotos --with-pymalloc + + make -j$THREADS && make install + make clean + + if [ -d $_inst ]; then + rm -f $INST/python-3.3 + ln -s python-$PYTHON_VERSION $INST/python-3.3 + else + ERROR "Python--$PYTHON_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set python-$PYTHON_VERSION $py_magic + + cd $CWD + else + INFO "Own Python-$PYTHON_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_Boost() { + # To be changed each time we make edits that would modify the compiled result! + boost_magic=7 + + _src=$SRC/boost-$BOOST_VERSION + _inst=$INST/boost-$BOOST_VERSION + + # Clean install if needed! + magic_compile_check boost-$BOOST_VERSION $boost_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building Boost-$BOOST_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + INFO "Downloading Boost-$BOOST_VERSION" + mkdir -p $SRC + wget -c $BOOST_SOURCE -O $_src.tar.bz2 + tar -C $SRC --transform "s,(.*/?)boost_1_[^/]+(.*),\1boost-$BOOST_VERSION\2,x" -xf $_src.tar.bz2 + fi + + cd $_src + if [ ! -f $_src/b2 ]; then + ./bootstrap.sh + fi + ./b2 -j$THREADS -a --with-system --with-filesystem --with-thread --with-regex --with-locale --with-date_time \ + --prefix=$_inst --disable-icu boost.locale.icu=off install + ./b2 --clean + + if [ -d $_inst ]; then + rm -f $INST/boost + ln -s boost-$BOOST_VERSION $INST/boost + else + ERROR "Boost-$BOOST_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set boost-$BOOST_VERSION $boost_magic + + cd $CWD + else + INFO "Own Boost-$BOOST_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_OCIO() { + # To be changed each time we make edits that would modify the compiled result! + ocio_magic=1 + + _src=$SRC/OpenColorIO-$OCIO_VERSION + _inst=$INST/ocio-$OCIO_VERSION + + # Clean install if needed! + magic_compile_check ocio-$OCIO_VERSION $ocio_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building OpenColorIO-$OCIO_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + INFO "Downloading OpenColorIO-$OCIO_VERSION" + mkdir -p $SRC + wget -c $OCIO_SOURCE -O $_src.tar.gz + + INFO "Unpacking OpenColorIO-$OCIO_VERSION" + tar -C $SRC --transform "s,(.*/?)imageworks-OpenColorIO[^/]*(.*),\1OpenColorIO-$OCIO_VERSION\2,x" \ + -xf $_src.tar.gz + fi + + cd $_src + # Always refresh the whole build! + if [ -d build ]; then + rm -rf build + fi + mkdir build + cd build + + 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=$_inst \ + -D CMAKE_INSTALL_PREFIX=$_inst \ + -D CMAKE_CXX_FLAGS="$cflags" \ + -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" \ + -D OCIO_BUILD_APPS=OFF \ + -D OCIO_BUILD_PYGLUE=OFF \ + .. + + make -j$THREADS && make install + + # Force linking against static libs + rm -f $_inst/lib/*.so* + + # Additional depencencies + cp ext/dist/lib/libtinyxml.a $_inst/lib + cp ext/dist/lib/libyaml-cpp.a $_inst/lib + + make clean + + if [ -d $_inst ]; then + rm -f $INST/ocio + ln -s ocio-$OCIO_VERSION $INST/ocio + else + ERROR "OpenColorIO-$OCIO_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set ocio-$OCIO_VERSION $ocio_magic + + cd $CWD + else + INFO "Own OpenColorIO-$OCIO_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_OIIO() { + # To be changed each time we make edits that would modify the compiled result! + oiio_magic=6 + + _src=$SRC/OpenImageIO-$OIIO_VERSION + _inst=$INST/oiio-$OIIO_VERSION + + # Clean install if needed! + magic_compile_check oiio-$OIIO_VERSION $oiio_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building OpenImageIO-$OIIO_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + wget -c $OIIO_SOURCE -O "$_src.tar.gz" + + INFO "Unpacking OpenImageIO-$OIIO_VERSION" + tar -C $SRC --transform "s,(.*/?)OpenImageIO-oiio[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" \ + -xf $_src.tar.gz + + cd $_src + + # XXX Ugly patching hack! + cat << EOF | patch -p1 +diff --git a/src/libutil/SHA1.cpp b/src/libutil/SHA1.cpp +index b9e6c8b..c761185 100644 +--- a/src/libutil/SHA1.cpp ++++ b/src/libutil/SHA1.cpp +@@ -8,9 +8,9 @@ + + // If compiling with MFC, you might want to add #include "StdAfx.h" + ++#include "SHA1.h" + #include "hash.h" + #include "dassert.h" +-#include "SHA1.h" + + #ifdef SHA1_UTILITY_FUNCTIONS + #define SHA1_MAX_FILE_BUFFER 8000 +EOF + + cd $CWD + + fi + + cd $_src + # Always refresh the whole build! + if [ -d build ]; then + rm -rf build + fi + mkdir build + cd build + + cmake_d="-D CMAKE_BUILD_TYPE=Release" + cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst" + cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" + cmake_d="$cmake_d -D BUILDSTATIC=ON" + cmake_d="$cmake_d -D LINKSTATIC=ON" + + if [ -d $INST/boost ]; then + cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON" + if $ALL_STATIC; then + cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON" + fi + fi + + # Looks like we do not need ocio in oiio for now... +# if [ -d $INST/ocio ]; then +# cmake_d="$cmake_d -D OCIO_PATH=$INST/ocio" +# fi + + if file /bin/cp | grep -q '32-bit'; then + cflags="-fPIC -m32 -march=i686" + else + cflags="-fPIC" + fi + + cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ../src + + make -j$THREADS && make install + make clean + + if [ -d $_inst ]; then + rm -f $INST/oiio + ln -s oiio-$OIIO_VERSION $INST/oiio + else + ERROR "OpenImageIO-$OIIO_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set oiio-$OIIO_VERSION $oiio_magic + + cd $CWD + else + INFO "Own OpenImageIO-$OIIO_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_LLVM() { + # To be changed each time we make edits that would modify the compiled result! + llvm_magic=1 + + _src=$SRC/LLVM-$LLVM_VERSION + _inst=$INST/llvm-$LLVM_VERSION + _src_clang=$SRC/CLANG-$LLVM_VERSION + + # Clean install if needed! + magic_compile_check llvm-$LLVM_VERSION $llvm_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + rm -rf $_inst_clang + fi + + if [ ! -d $_inst ]; then + INFO "Building LLVM-$LLVM_VERSION (CLANG included!)" + + prepare_opt + + if [ ! -d $_src -o true ]; then + wget -c $LLVM_SOURCE -O "$_src.tar.gz" + wget -c $LLVM_CLANG_SOURCE -O "$_src_clang.tar.gz" + + INFO "Unpacking LLVM-$LLVM_VERSION" + tar -C $SRC --transform "s,([^/]*/?)llvm-[^/]*(.*),\1LLVM-$LLVM_VERSION\2,x" \ + -xf $_src.tar.gz + INFO "Unpacking CLANG-$LLVM_VERSION to $_src/tools/clang" + tar -C $_src/tools \ + --transform "s,([^/]*/?)clang-[^/]*(.*),\1clang\2,x" \ + -xf $_src_clang.tar.gz + + cd $_src + + # XXX Ugly patching hack! + cat << EOF | patch -p1 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -13,7 +13,7 @@ + set(LLVM_VERSION_MAJOR 3) + set(LLVM_VERSION_MINOR 1) + +-set(PACKAGE_VERSION "\${LLVM_VERSION_MAJOR}.\${LLVM_VERSION_MINOR}svn") ++set(PACKAGE_VERSION "\${LLVM_VERSION_MAJOR}.\${LLVM_VERSION_MINOR}") + + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +EOF + + cd $CWD + + fi + + cd $_src + + # Always refresh the whole build! + if [ -d build ]; then + rm -rf build + fi + mkdir build + cd build + + cmake_d="-D CMAKE_BUILD_TYPE=Release" + cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" + cmake_d="$cmake_d -D LLVM_ENABLE_FFI=ON" + + if [ -d $_FFI_INCLUDE_DIR ]; then + cmake_d="$cmake_d -D FFI_INCLUDE_DIR=$_FFI_INCLUDE_DIR" + fi + + cmake $cmake_d .. + + make -j$THREADS && make install + make clean + + if [ -d $_inst ]; then + rm -f $INST/llvm + ln -s llvm-$LLVM_VERSION $INST/llvm + else + ERROR "LLVM-$LLVM_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set llvm-$LLVM_VERSION $llvm_magic + + cd $CWD + else + INFO "Own LLVM-$LLVM_VERSION (CLANG included) is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_OSL() { + # To be changed each time we make edits that would modify the compiled result! + osl_magic=7 + + _src=$SRC/OpenShadingLanguage-$OSL_VERSION + _inst=$INST/osl-$OSL_VERSION + + # Clean install if needed! + magic_compile_check osl-$OSL_VERSION $osl_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building OpenShadingLanguage-$OSL_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + # XXX Using git on my own repo for now, looks like archives are not updated immediately... :/ +# wget -c $OSL_SOURCE -O "$_src.tar.gz" + +# INFO "Unpacking OpenShadingLanguage-$OSL_VERSION" +# tar -C $SRC --transform "s,(.*/?)OpenShadingLanguage-[^/]*(.*),\1OpenShadingLanguage-$OSL_VERSION\2,x" \ +# -xf $_src.tar.gz + git clone https://github.com/mont29/OpenShadingLanguage.git $_src + cd $_src + git checkout blender-fixes + cd $CWD + fi + + cd $_src + # XXX For now, always update from latest repo... + git pull origin + + # Always refresh the whole build! + if [ -d build ]; then + rm -rf build + fi + mkdir build + cd build + + cmake_d="-D CMAKE_BUILD_TYPE=Release" + cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" + cmake_d="$cmake_d -D BUILDSTATIC=ON" + cmake_d="$cmake_d -D BUILD_TESTING=OFF" + + if [ -d $INST/boost ]; then + cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON" + if $ALL_STATIC; then + cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON" + fi + fi + + if [ -d $INST/oiio ]; then + cmake_d="$cmake_d -D OPENIMAGEIOHOME=$INST/oiio" + fi + + if [ ! -z $LLVM_VERSION_FOUND ]; then + cmake_d="$cmake_d -D LLVM_VERSION=$LLVM_VERSION_FOUND" + if [ -d $INST/llvm ]; then + cmake_d="$cmake_d -D LLVM_DIRECTORY=$INST/llvm" + cmake_d="$cmake_d -D LLVM_STATIC=ON" + fi + fi + + cmake $cmake_d ../src + + make -j$THREADS && make install + make clean + + if [ -d $_inst ]; then + rm -f $INST/osl + ln -s osl-$OSL_VERSION $INST/osl + else + ERROR "OpenShadingLanguage-$OSL_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set osl-$OSL_VERSION $osl_magic + + cd $CWD + else + INFO "Own OpenShadingLanguage-$OSL_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +compile_FFmpeg() { + # To be changed each time we make edits that would modify the compiled result! + ffmpeg_magic=3 + + _src=$SRC/ffmpeg-$FFMPEG_VERSION + _inst=$INST/ffmpeg-$FFMPEG_VERSION + + # Clean install if needed! + magic_compile_check ffmpeg-$FFMPEG_VERSION $ffmpeg_magic + if [ $? -eq 1 ]; then + rm -rf $_inst + fi + + if [ ! -d $_inst ]; then + INFO "Building ffmpeg-$FFMPEG_VERSION" + + prepare_opt + + if [ ! -d $_src ]; then + INFO "Downloading ffmpeg-$FFMPEG_VERSION" + wget -c $FFMPEG_SOURCE -O "$_src.tar.bz2" + + INFO "Unpacking ffmpeg-$FFMPEG_VERSION" + tar -C $SRC -xf $_src.tar.bz2 + fi + + cd $_src + + extra="" + + if $VORBIS_USE; then + extra="$extra --enable-libvorbis" + fi + + if $THEORA_USE; then + extra="$extra --enable-libtheora" + fi + + # XXX At least under Debian, static schro gives problem at blender linking time... :/ + if $SCHRO_USE && ! $ALL_STATIC; then + extra="$extra --enable-libschroedinger" + fi + + if $XVID_USE; then + extra="$extra --enable-libxvid" + fi + + if $X264_USE; then + extra="$extra --enable-libx264" + fi + + if $VPX_USE; then + extra="$extra --enable-libvpx" + fi + + if $MP3LAME_USE; then + extra="$extra --enable-libmp3lame" + fi + + if $OPENJPEG_USE; then + extra="$extra --enable-libopenjpeg" + fi + + ./configure --cc="gcc -Wl,--as-needed" \ + --extra-ldflags="-pthread -static-libgcc" \ + --prefix=$_inst --enable-static \ + --disable-ffplay --disable-ffserver --disable-doc \ + --enable-gray \ + --enable-avfilter --disable-vdpau \ + --disable-bzlib --disable-libgsm --disable-libspeex \ + --enable-pthreads --enable-zlib --enable-stripping --enable-runtime-cpudetect \ + --disable-vaapi --disable-libfaac --disable-nonfree --enable-gpl \ + --disable-postproc --disable-x11grab --disable-librtmp --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 $extra + + make -j$THREADS && make install + make clean + + if [ -d $_inst ]; then + rm -f $INST/ffmpeg + ln -s ffmpeg-$FFMPEG_VERSION $INST/ffmpeg + else + ERROR "FFmpeg-$FFMPEG_VERSION failed to compile, exiting" + exit 1 + fi + + magic_compile_set ffmpeg-$FFMPEG_VERSION $ffmpeg_magic + + cd $CWD + else + INFO "Own ffmpeg-$FFMPEG_VERSION is up to date, nothing to do!" + INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories." + fi +} + +get_package_version_DEB() { + dpkg-query -W -f '${Version}' $1 | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/' +} + +check_package_DEB() { + r=`apt-cache policy $1 | grep -c 'Candidate:'` + + if [ $r -ge 1 ]; then + return 0 + else + return 1 + fi +} + +check_package_version_match_DEB() { + v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'` + + if [ -z "$v" ]; then + return 1 + fi + + version_match $v $2 + return $? +} + +check_package_version_ge_DEB() { + v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'` + + if [ -z "$v" ]; then + return 1 + fi + + version_ge $v $2 + return $? +} + +install_DEB() { + INFO "" + INFO "Installing dependencies for DEB-based distribution" + INFO "$COMMON_INFO" + INFO "" + + sudo apt-get update +# XXX Why in hell? Let's let this stuff to the user's responsability!!! +# sudo apt-get -y upgrade + + # These libs should always be available in debian/ubuntu official repository... + OPENJPEG_DEV="libopenjpeg-dev" + SCHRO_DEV="libschroedinger-dev" + VORBIS_DEV="libvorbis-dev" + THEORA_DEV="libtheora-dev" + + sudo apt-get install -y gawk cmake scons gcc g++ libjpeg-dev libpng-dev libtiff-dev \ + libfreetype6-dev libx11-dev libxi-dev wget libsqlite3-dev libbz2-dev libncurses5-dev \ + libssl-dev liblzma-dev libreadline-dev $OPENJPEG_DEV libopenexr-dev libopenal-dev \ + libglew-dev yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libsdl1.2-dev \ + libfftw3-dev libjack-dev python-dev patch + + OPENJPEG_USE=true + SCHRO_USE=true + VORBIS_USE=true + THEORA_USE=true + + # Grmpf, debian is libxvidcore-dev and ubuntu libxvidcore4-dev! + XVID_DEV="libxvidcore-dev" + check_package_DEB $XVID_DEV + if [ $? -eq 0 ]; then + sudo apt-get install -y $XVID_DEV + XVID_USE=true + else + XVID_DEV="libxvidcore4-dev" + check_package_DEB $XVID_DEV + if [ $? -eq 0 ]; then + sudo apt-get install -y $XVID_DEV + XVID_USE=true + fi + fi + + MP3LAME_DEV="libmp3lame-dev" + check_package_DEB $MP3LAME_DEV + if [ $? -eq 0 ]; then + sudo apt-get install -y $MP3LAME_DEV + MP3LAME_USE=true + fi + + X264_DEV="libx264-dev" + check_package_version_ge_DEB $X264_DEV $X264_VERSION_MIN + if [ $? -eq 0 ]; then + sudo apt-get install -y $X264_DEV + X264_USE=true + fi + + VPX_DEV="libvpx-dev" + check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + sudo apt-get install -y $VPX_DEV + VPX_USE=true + fi + + check_package_DEB libspnav-dev + if [ $? -eq 0 ]; then + sudo apt-get install -y libspnav-dev + fi + + check_package_DEB python3.3-dev + if [ $? -eq 0 ]; then + sudo apt-get install -y python3.3-dev + else + compile_Python + fi + + check_package_version_ge_DEB libboost-dev $BOOST_VERSION_MIN + if [ $? -eq 0 ]; then + sudo apt-get install -y libboost-dev + + boost_version=$(echo `get_package_version_DEB libboost-dev` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/') + + check_package_DEB libboost-locale$boost_version-dev + if [ $? -eq 0 ]; then + sudo apt-get install -y libboost-locale$boost_version-dev libboost-filesystem$boost_version-dev \ + libboost-regex$boost_version-dev libboost-system$boost_version-dev \ + libboost-thread$boost_version-dev + else + compile_Boost + fi + else + compile_Boost + fi + + check_package_version_ge_DEB libopencolorio-dev $OCIO_VERSION_MIN + if [ $? -eq 0 ]; then + sudo apt-get install -y libopencolorio-dev + else + compile_OCIO + fi + + check_package_version_ge_DEB libopenimageio-dev $OIIO_VERSION_MIN + if [ $? -eq 0 ]; then + sudo apt-get install -y libopenimageio-dev + else + compile_OIIO + fi + + if $BUILD_OSL; then + have_llvm=false + + check_package_DEB llvm-$LLVM_VERSION-dev + if [ $? -eq 0 ]; then + sudo apt-get install -y llvm-$LLVM_VERSION-dev + have_llvm=true + LLVM_VERSION_FOUND=$LLVM_VERSION + else + check_package_DEB llvm-$LLVM_VERSION_MIN-dev + if [ $? -eq 0 ]; then + sudo apt-get install -y llvm-$LLVM_VERSION_MIN-dev + have_llvm=true + LLVM_VERSION_FOUND=$LLVM_VERSION_MIN + fi + fi + + if $have_llvm; then + sudo apt-get install -y clang flex bison libtbb-dev git + # No package currently! + compile_OSL + fi + fi + +# XXX Debian features libav packages as ffmpeg, those are not really compatible with blender code currently :/ +# So for now, always build our own ffmpeg. +# check_package_DEB ffmpeg +# if [ $? -eq 0 ]; then +# sudo apt-get install -y ffmpeg +# ffmpeg_version=`get_package_version_DEB ffmpeg` +# INFO "ffmpeg version: $ffmpeg_version" +# if [ ! -z "$ffmpeg_version" ]; then +# if dpkg --compare-versions $ffmpeg_version gt 0.7.2; then +# sudo apt-get install -y libavfilter-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libswscale-dev +# else +# compile_FFmpeg +# fi +# fi +# fi + compile_FFmpeg +} + +get_package_version_RPM() { + yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/' +} + +check_package_RPM() { + r=`yum info $1 | grep -c 'Summary'` + + if [ $r -ge 1 ]; then + return 0 + else + return 1 + fi +} + +check_package_version_match_RPM() { + v=`get_package_version_RPM $1` + + if [ -z "$v" ]; then + return 1 + fi + + version_match $v $2 + return $? +} + +check_package_version_ge_RPM() { + v=`get_package_version_RPM $1` + + if [ -z "$v" ]; then + return 1 + fi + + version_ge $v $2 + return $? +} + +install_RPM() { + INFO "" + INFO "Installing dependencies for RPM-based distribution" + INFO "$COMMON_INFO" + INFO "" + + sudo yum -y update + + # These libs should always be available in debian/ubuntu official repository... + OPENJPEG_DEV="openjpeg-devel" + SCHRO_DEV="schroedinger-devel" + VORBIS_DEV="libvorbis-devel" + THEORA_DEV="libtheora-devel" + + sudo yum -y install gawk gcc gcc-c++ cmake scons libpng-devel libtiff-devel \ + freetype-devel libX11-devel libXi-devel wget libsqlite3x-devel ncurses-devel \ + readline-devel $OPENJPEG_DEV openexr-devel openal-soft-devel \ + glew-devel yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV SDL-devel \ + fftw-devel lame-libs jack-audio-connection-kit-devel libspnav-devel \ + libjpeg-devel patch python-devel + + OPENJPEG_USE=true + SCHRO_USE=true + VORBIS_USE=true + THEORA_USE=true + + X264_DEV="x264-devel" + check_package_version_ge_RPM $X264_DEV $X264_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y $X264_DEV + X264_USE=true + fi + + XVID_DEV="xvidcore-devel" + check_package_RPM $XVID_DEV + if [ $? -eq 0 ]; then + sudo yum install -y $XVID_DEV + XVID_USE=true + fi + + VPX_DEV="libvpx-devel" + check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y $VPX_DEV + VPX_USE=true + fi + + MP3LAME_DEV="lame-devel" + check_package_RPM $MP3LAME_DEV + if [ $? -eq 0 ]; then + sudo yum install -y $MP3LAME_DEV + MP3LAME_USE=true + fi + + check_package_version_match_RPM python3-devel $PYTHON_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y python3-devel + else + compile_Python + fi + + check_package_version_ge_RPM boost-devel $BOOST_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y boost-devel + else + compile_Boost + fi + + check_package_version_ge_RPM OpenColorIO-devel $OCIO_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y OpenColorIO-devel + else + compile_OCIO + fi + + check_package_version_ge_RPM OpenImageIO-devel $OIIO_VERSION_MIN + if [ $? -eq 0 ]; then + sudo yum install -y OpenImageIO-devel + else + compile_OIIO + fi + + if $BUILD_OSL; then + have_llvm=false + + check_package_RPM llvm-$LLVM_VERSION-devel + if [ $? -eq 0 ]; then + sudo yum install -y llvm-$LLVM_VERSION-devel + have_llvm=true + LLVM_VERSION_FOUND=$LLVM_VERSION + else +# check_package_RPM llvm-$LLVM_VERSION_MIN-devel +# if [ $? -eq 0 ]; then +# sudo yum install -y llvm-$LLVM_VERSION_MIN-devel +# have_llvm=true +# LLVM_VERSION_FOUND=$LLVM_VERSION_MIN +# else +# check_package_version_ge_RPM llvm-devel $LLVM_VERSION_MIN +# if [ $? -eq 0 ]; then +# sudo yum install -y llvm-devel +# have_llvm=true +# LLVM_VERSION_FOUND=`get_package_version_RPM llvm-devel` +# fi +# fi + sudo yum install -y libffi-devel + # XXX Stupid fedora puts ffi header into a darn stupid dir! + _FFI_INCLUDE_DIR=`rpm -ql libffi-devel | grep -e ".*/ffi.h" | sed -r 's/(.*)\/ffi.h/\1/'` + compile_LLVM + have_llvm=true + LLVM_VERSION_FOUND=$LLVM_VERSION + fi + + if $have_llvm; then + sudo yum install -y flex bison clang tbb-devel git + # No package currently! + compile_OSL + fi + fi + + # Always for now, not sure which packages should be installed + compile_FFmpeg +} + +get_package_version_SUSE() { + zypper info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/' +} + +check_package_SUSE() { + r=`zypper info $1 | grep -c 'Summary'` + + if [ $r -ge 1 ]; then + return 0 + else + return 1 + fi +} + +check_package_version_match_SUSE() { + v=`get_package_version_SUSE $1` + + if [ -z "$v" ]; then + return 1 + fi + + version_match $v $2 + return $? +} + +check_package_version_ge_SUSE() { + v=`get_package_version_SUSE $1` + + if [ -z "$v" ]; then + return 1 + fi + + version_ge $v $2 + return $? +} + +install_SUSE() { + INFO "" + INFO "Installing dependencies for SuSE-based distribution" + INFO "$COMMON_INFO" + INFO "" + + sudo zypper --non-interactive update --auto-agree-with-licenses + + # These libs should always be available in debian/ubuntu official repository... + OPENJPEG_DEV="openjpeg-devel" + SCHRO_DEV="schroedinger-devel" + VORBIS_DEV="libvorbis-devel" + THEORA_DEV="libtheora-devel" + + sudo zypper --non-interactive install --auto-agree-with-licenses \ + gawk gcc gcc-c++ cmake scons libpng12-devel libtiff-devel \ + freetype-devel libX11-devel libXi-devel wget sqlite3-devel ncurses-devel \ + readline-devel $OPENJPEG_DEV libopenexr-devel openal-soft-devel \ + glew-devel yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libSDL-devel \ + fftw3-devel libjack-devel libspnav-devel \ + libjpeg62-devel patch python-devel + + OPENJPEG_USE=true + SCHRO_USE=true + VORBIS_USE=true + THEORA_USE=true + + X264_DEV="x264-devel" + check_package_version_ge_SUSE $X264_DEV $X264_VERSION_MIN + if [ $? -eq 0 ]; then + sudo zypper --non-interactive install --auto-agree-with-licenses $X264_DEV + X264_USE=true + fi + + XVID_DEV="xvidcore-devel" + check_package_SUSE $XVID_DEV + if [ $? -eq 0 ]; then + sudo zypper --non-interactive install --auto-agree-with-licenses $XVID_DEV + XVID_USE=true + fi + + VPX_DEV="libvpx-devel" + check_package_version_ge_SUSE $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + sudo zypper --non-interactive install --auto-agree-with-licenses $VPX_DEV + VPX_USE=true + fi + + # No mp3 in suse, it seems. + MP3LAME_DEV="lame-devel" + check_package_SUSE $MP3LAME_DEV + if [ $? -eq 0 ]; then + sudo zypper --non-interactive install --auto-agree-with-licenses $MP3LAME_DEV + MP3LAME_USE=true + fi + + check_package_version_match_SUSE python3-devel 3.3. + if [ $? -eq 0 ]; then + sudo zypper --non-interactive install --auto-agree-with-licenses python3-devel + else + compile_Python + fi + + # No boost_locale currently available, so let's build own boost. + compile_Boost + + # No ocio currently available, so let's build own boost. + compile_OCIO + + # No oiio currently available, so let's build own boost. + compile_OIIO + + if $BUILD_OSL; then + have_llvm=false + + # Suse llvm package *_$SUCKS$_* (tm) !!! +# check_package_version_ge_SUSE llvm-devel $LLVM_VERSION_MIN +# if [ $? -eq 0 ]; then +# sudo zypper --non-interactive install --auto-agree-with-licenses llvm-devel +# have_llvm=true +# LLVM_VERSION_FOUND=`get_package_version_SUSE llvm-devel` +# fi + + sudo zypper --non-interactive install --auto-agree-with-licenses libffi47-devel + compile_LLVM + have_llvm=true + LLVM_VERSION_FOUND=$LLVM_VERSION + + if $have_llvm; then + # XXX No tbb lib! + sudo zypper --non-interactive install --auto-agree-with-licenses flex bison git + # No package currently! + compile_OSL + fi + fi + + # No ffmpeg currently available, so let's build own boost. + compile_FFmpeg +} + +print_info_ffmpeglink_DEB() { + if $ALL_STATIC; then + dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }' + else + dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }' + fi +} + +print_info_ffmpeglink_RPM() { + if $ALL_STATIC; then + rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }' + else + rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }' + fi +} + +print_info_ffmpeglink_SUSE() { + if $ALL_STATIC; then + rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }' + else + rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }' + fi +} + +print_info_ffmpeglink() { + # This func must only print a ';'-separated list of libs... + if [ -z "$DISTRO" ]; then + ERROR "Failed to detect distribution type" + exit 1 + fi + + # Create list of packages from which to get libs names... + _packages="" + + if $THEORA_USE; then + _packages="$_packages $THEORA_DEV" + fi + + if $VORBIS_USE; then + _packages="$_packages $VORBIS_DEV" + fi + + if $XVID_USE; then + _packages="$_packages $XVID_DEV" + fi + + if $VPX_USE; then + _packages="$_packages $VPX_DEV" + fi + + if $MP3LAME_USE; then + _packages="$_packages $MP3LAME_DEV" + fi + + if $X264_USE; then + _packages="$_packages $X264_DEV" + fi + + if $OPENJPEG_USE; then + _packages="$_packages $OPENJPEG_DEV" + fi + + # XXX At least under Debian, static schro give problem at blender linking time... :/ + if $SCHRO_USE && ! $ALL_STATIC; then + _packages="$_packages $SCHRO_DEV" + fi + + if [ "$DISTRO" = "DEB" ]; then + print_info_ffmpeglink_DEB + elif [ "$DISTRO" = "RPM" ]; then + print_info_ffmpeglink_RPM + elif [ "$DISTRO" = "SUSE" ]; then + print_info_ffmpeglink_SUSE + # XXX TODO! + else INFO "<Could not determine additional link libraries needed for ffmpeg, replace this by valid list of libs...>" + fi +} + +print_info() { + INFO "" + INFO "If you're using CMake add this to your configuration flags:" + + if $ALL_STATIC; then + INFO " -D WITH_STATIC_LIBS=ON" + fi + + if [ -d $INST/boost ]; then + INFO " -D BOOST_ROOT=$INST/boost" + INFO " -D Boost_NO_SYSTEM_PATHS=ON" + elif $ALL_STATIC; then + INFO " -D Boost_USE_ICU=ON" + fi + + if [ -d $INST/osl ]; then + INFO " -D CYCLES_OSL=$INST/osl" + INFO " -D WITH_CYCLES_OSL=ON" + INFO " -D LLVM_VERSION=$LLVM_VERSION_FOUND" + if [ -d $INST/llvm ]; then + INFO " -D LLVM_DIRECTORY=$INST/llvm" + INFO " -D LLVM_STATIC=ON" + fi + fi + + if [ -d $INST/ffmpeg ]; then + INFO " -D WITH_CODEC_FFMPEG=ON" + INFO " -D FFMPEG=$INST/ffmpeg" + INFO " -D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'" + fi + + INFO "" + INFO "If you're using SCons add this to your user-config:" + + if [ -d $INST/python-3.3 ]; then + INFO "BF_PYTHON = '$INST/python-3.3'" + INFO "BF_PYTHON_ABI_FLAGS = 'm'" + fi + + if [ -d $INST/ocio ]; then + INFO "BF_OCIO = '$INST/ocio'" + fi + + if [ -d $INST/oiio ]; then + INFO "BF_OIIO = '$INST/oiio'" + fi + + if [ -d $INST/boost ]; then + INFO "BF_BOOST = '$INST/boost'" + fi + + if [ -d $INST/ffmpeg ]; then + INFO "BF_FFMPEG = '$INST/ffmpeg'" + _ffmpeg_list_sep=" " + INFO "BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice `print_info_ffmpeglink`'" + fi + + INFO "" + INFO "" + INFO "WARNING: If this script had to build boost into $INST, and you are dynamically linking " + INFO " blender against it, you will have to run those commands as root user:" + INFO "" + INFO " echo \"$INST/boost/lib\" > /etc/ld.so.conf.d/boost.conf" + INFO " ldconfig" + INFO "" +} + +# Detect distributive type used on this machine +detect_distro + +if [ -z "$DISTRO" ]; then + ERROR "Failed to detect distribution type" + exit 1 +elif [ "$DISTRO" = "DEB" ]; then + install_DEB +elif [ "$DISTRO" = "RPM" ]; then + install_RPM +elif [ "$DISTRO" = "SUSE" ]; then + install_SUSE +fi + +print_info + +# Switch back to user language. +LANG=LANG_BACK +export LANG |