a2d68c5bd2317a0b58225205f9eaaea40f804b47
[blender.git] / build_files / build_environment / install_deps.sh
1 #!/bin/bash
2
3 DISTRO=""
4 SRC="$HOME/src/blender-deps"
5 INST="/opt/lib"
6 CWD=$PWD
7
8 # OSL is horror for manual building even
9 # i would want it to be setteled for manual build first,
10 # and only then do it automatically
11 BUILD_OSL=false
12
13 THREADS=`cat /proc/cpuinfo | grep cores | uniq | sed -e "s/.*: *\(.*\)/\\1/"`
14 if [ -z "$THREADS" ]; then
15   THREADS=1
16 fi
17
18 PYTHON_VERSION="3.3.0"
19 PYTHON_VERSION_MIN="3.3"
20 PYTHON_SOURCE="http://python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.bz2"
21
22 BOOST_VERSION="1.51.0"
23 _boost_version_nodots=`echo "$BOOST_VERSION" | sed -r 's/\./_/g'`
24 BOOST_SOURCE="http://sourceforge.net/projects/boost/files/boost/$BOOST_VERSION/boost_$_boost_version_nodots.tar.bz2/download"
25 BOOST_VERSION_MIN="1.49"
26
27 OCIO_VERSION="1.0.7"
28 OCIO_SOURCE="https://github.com/imageworks/OpenColorIO/tarball/v$OCIO_VERSION"
29 OCIO_VERSION_MIN="1.0"
30
31 OIIO_VERSION="1.1.1"
32 OIIO_SOURCE="https://github.com/OpenImageIO/oiio/tarball/Release-$OIIO_VERSION"
33 OIIO_VERSION_MIN="1.1"
34
35 LLVM_VERSION="3.1"
36 LLVM_VERSION_MIN="3.0"
37 LLVM_VERSION_FOUND=""
38
39 # OSL needs to be compiled for now!
40 OSL_VERSION="1.2.0"
41 OSL_SOURCE="https://github.com/mont29/OpenShadingLanguage/archive/blender-fixes.tar.gz"
42
43 FFMPEG_VERSION="1.0"
44 FFMPEG_SOURCE="http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2"
45 FFMPEG_VERSION_MIN="0.7.6"
46 _ffmpeg_list_sep=";"
47
48 # FFMPEG optional libs.
49 VORBIS_USE=false
50 VORBIS_DEV=""
51 SCHRO_USE=false
52 SCRHO_DEV=""
53 THEORA_USE=false
54 THEORA_DEV=""
55 XVID_USE=false
56 XVID_DEV=""
57 X264_USE=false
58 X264_DEV=""
59 X264_VERSION_MIN=0.118
60 VPX_USE=false
61 VPX_VERSION_MIN=0.9.7
62 VPX_DEV=""
63 MP3LAME_USE=false
64 MP3LAME_DEV=""
65 OPENJPEG_USE=false
66 OPENJPEG_DEV=""
67
68 # Switch to english language, else some things (like check_package_DEB()) won't work!
69 LANG_BACK=$LANG
70 LANG=""
71 export LANG
72
73 ERROR() {
74   echo "${@}"
75 }
76
77 INFO() {
78   echo "${@}"
79 }
80
81 # Return 0 if $1 >= $2, else 1.
82 # $1 and $2 should be version numbers made of numbers only.
83 version_ge() {
84   if [ $(echo -e "$1\n$2" | sort --version-sort | head --lines=1) = "$1" ]; then
85     return 1
86   else
87     return 0
88   fi
89 }
90
91 # 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.
92 # $1 and $2 should be version numbers made of numbers only.
93 # $1 should be at least as long as $2!
94 version_match() {
95   backIFS=$IFS
96   IFS='.'
97
98   # Split both version numbers into their numeric elements.
99   arr1=( $1 )
100   arr2=( $2 )
101
102   ret=1
103
104   count1=${#arr1[@]}
105   count2=${#arr2[@]}
106   if [ $count1 -ge $count2 ]; then
107     ret=0
108     for (( i=0; $i < $count2; i++ ))
109     do
110       if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then
111         ret=1
112         break
113       fi
114     done
115   fi
116
117   IFS=$backIFS
118   return $ret
119 }
120
121 detect_distro() {
122   if [ -f /etc/debian_version ]; then
123     DISTRO="DEB"
124   elif [ -f /etc/redhat-release ]; then
125     DISTRO="RPM"
126   elif [ -f /etc/SuSE-release ]; then
127     DISTRO="SUSE"
128   fi
129 }
130
131 prepare_opt() {
132   INFO "Ensuring $INST exists and is writable by us"
133   sudo mkdir -p $INST
134   sudo chown $USER $INST
135   sudo chmod 775 $INST
136 }
137
138 # Check whether the current package needs to be recompiled, based on a dummy file containing a magic number in its name...
139 magic_compile_check() {
140   if [ -f $INST/.$1-magiccheck-$2 ]; then
141     return 0
142   else
143     return 1
144   fi
145 }
146
147 magic_compile_set() {
148   rm -f $INST/.$1-magiccheck-*
149   touch $INST/.$1-magiccheck-$2
150 }
151
152 compile_Python() {
153   # To be changed each time we make edits that would modify the compiled result!
154   py_magic=0
155
156   _src=$SRC/Python-$PYTHON_VERSION
157   _inst=$INST/python-$PYTHON_VERSION
158
159   # Clean install if needed!
160   magic_compile_check python-$PYTHON_VERSION $py_magic
161   if [ $? -eq 1 ]; then
162     rm -rf $_inst
163   fi
164
165   if [ ! -d $_inst ]; then
166     INFO "Building Python-$PYTHON_VERSION"
167
168     prepare_opt
169
170     if [ ! -d $_src ]; then
171       mkdir -p $SRC
172       wget -c $PYTHON_SOURCE -O $_src.tar.bz2
173
174       INFO "Unpacking Python-$PYTHON_VERSION"
175       tar -C $SRC -xf $_src.tar.bz2
176     fi
177
178     cd $_src
179
180     ./configure --prefix=$_inst --enable-ipv6 \
181         --enable-loadable-sqlite-extensions --with-dbmliborder=bdb \
182         --with-computed-gotos --with-pymalloc
183
184     make -j$THREADS && make install
185     make clean
186
187     if [ -d $_inst ]; then
188       rm -f $INST/python-3.3
189       ln -s python-$PYTHON_VERSION $INST/python-3.3
190     else
191       ERROR "Python--$PYTHON_VERSION failed to compile, exiting"
192       exit 1
193     fi
194
195     magic_compile_set python-$PYTHON_VERSION $py_magic
196
197     cd $CWD
198   else
199     INFO "Own Python-$PYTHON_VERSION is up to date, nothing to do!"
200     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
201   fi
202 }
203
204 compile_Boost() {
205   # To be changed each time we make edits that would modify the compiled result!
206   boost_magic=7
207
208   _src=$SRC/boost-$BOOST_VERSION
209   _inst=$INST/boost-$BOOST_VERSION
210
211   # Clean install if needed!
212   magic_compile_check boost-$BOOST_VERSION $boost_magic
213   if [ $? -eq 1 ]; then
214     rm -rf $_inst
215   fi
216
217   if [ ! -d $_inst ]; then
218     INFO "Building Boost-$BOOST_VERSION"
219
220     prepare_opt
221
222     if [ ! -d $_src ]; then
223       INFO "Downloading Boost-$BOOST_VERSION"
224       mkdir -p $SRC
225       wget -c $BOOST_SOURCE -O $_src.tar.bz2
226       tar -C $SRC --transform "s,(.*/?)boost_1_[^/]+(.*),\1boost-$BOOST_VERSION\2,x" -xf $_src.tar.bz2
227     fi
228
229     cd $_src
230     if [ ! -f $_src/b2 ]; then
231       ./bootstrap.sh
232     fi
233     ./b2 -j$THREADS -a --with-system --with-filesystem --with-thread --with-regex --with-locale --with-date_time \
234          --prefix=$_inst --disable-icu boost.locale.icu=off install
235     ./b2 --clean
236
237     if [ -d $_inst ]; then
238       rm -f $INST/boost
239       ln -s boost-$BOOST_VERSION $INST/boost
240     else
241       ERROR "Boost-$BOOST_VERSION failed to compile, exiting"
242       exit 1
243     fi
244
245     magic_compile_set boost-$BOOST_VERSION $boost_magic
246
247     cd $CWD
248   else
249     INFO "Own Boost-$BOOST_VERSION is up to date, nothing to do!"
250     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
251   fi
252 }
253
254 compile_OCIO() {
255   # To be changed each time we make edits that would modify the compiled result!
256   ocio_magic=1
257
258   _src=$SRC/OpenColorIO-$OCIO_VERSION
259   _inst=$INST/ocio-$OCIO_VERSION
260
261   # Clean install if needed!
262   magic_compile_check ocio-$OCIO_VERSION $ocio_magic
263   if [ $? -eq 1 ]; then
264     rm -rf $_inst
265   fi
266
267   if [ ! -d $_inst ]; then
268     INFO "Building OpenColorIO-$OCIO_VERSION"
269
270     prepare_opt
271
272     if [ ! -d $_src ]; then
273       INFO "Downloading OpenColorIO-$OCIO_VERSION"
274       mkdir -p $SRC
275       wget -c $OCIO_SOURCE -O $_src.tar.gz
276
277       INFO "Unpacking OpenColorIO-$OCIO_VERSION"
278       tar -C $SRC --transform "s,(.*/?)imageworks-OpenColorIO[^/]*(.*),\1OpenColorIO-$OCIO_VERSION\2,x" \
279           -xf $_src.tar.gz
280     fi
281
282     cd $_src
283     # Always refresh the whole build!
284     if [ -d build ]; then
285       rm -rf build
286     fi    
287     mkdir build
288     cd build
289
290     if file /bin/cp | grep -q '32-bit'; then
291       cflags="-fPIC -m32 -march=i686"
292     else
293       cflags="-fPIC"
294     fi
295
296     cmake -D CMAKE_BUILD_TYPE=Release \
297           -D CMAKE_PREFIX_PATH=$_inst \
298           -D CMAKE_INSTALL_PREFIX=$_inst \
299           -D CMAKE_CXX_FLAGS="$cflags" \
300           -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" \
301           ..
302
303     make -j$THREADS && make install
304
305     # Force linking against static libs
306     rm -f $_inst/lib/*.so*
307
308     # Additional depencencies
309     cp ext/dist/lib/libtinyxml.a $_inst/lib
310     cp ext/dist/lib/libyaml-cpp.a $_inst/lib
311
312     make clean
313
314     if [ -d $_inst ]; then
315       rm -f $INST/ocio
316       ln -s ocio-$OCIO_VERSION $INST/ocio
317     else
318       ERROR "OpenColorIO-$OCIO_VERSION failed to compile, exiting"
319       exit 1
320     fi
321
322     magic_compile_set ocio-$OCIO_VERSION $ocio_magic
323
324     cd $CWD
325   else
326     INFO "Own OpenColorIO-$OCIO_VERSION is up to date, nothing to do!"
327     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
328   fi
329 }
330
331 compile_OIIO() {
332   # To be changed each time we make edits that would modify the compiled result!
333   oiio_magic=5
334
335   _src=$SRC/OpenImageIO-$OIIO_VERSION
336   _inst=$INST/oiio-$OIIO_VERSION
337
338   # Clean install if needed!
339   magic_compile_check oiio-$OIIO_VERSION $oiio_magic
340   if [ $? -eq 1 ]; then
341     rm -rf $_inst
342   fi
343
344   if [ ! -d $_inst ]; then
345     INFO "Building OpenImageIO-$OIIO_VERSION"
346
347     prepare_opt
348
349     if [ ! -d $_src ]; then
350       wget -c $OIIO_SOURCE -O "$_src.tar.gz"
351
352       INFO "Unpacking OpenImageIO-$OIIO_VERSION"
353       tar -C $SRC --transform "s,(.*/?)OpenImageIO-oiio[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" \
354           -xf $_src.tar.gz
355
356       cd $_src
357
358       # XXX Ugly patching hack!
359       cat << EOF | patch -p1
360 diff --git a/src/libutil/SHA1.cpp b/src/libutil/SHA1.cpp
361 index b9e6c8b..c761185 100644
362 --- a/src/libutil/SHA1.cpp
363 +++ b/src/libutil/SHA1.cpp
364 @@ -8,9 +8,9 @@
365  
366  // If compiling with MFC, you might want to add #include "StdAfx.h"
367  
368 +#include "SHA1.h"
369  #include "hash.h"
370  #include "dassert.h"
371 -#include "SHA1.h"
372  
373  #ifdef SHA1_UTILITY_FUNCTIONS
374  #define SHA1_MAX_FILE_BUFFER 8000
375 EOF
376
377     fi
378
379     cd $_src
380     # Always refresh the whole build!
381     if [ -d build ]; then
382       rm -rf build
383     fi    
384     mkdir build
385     cd build
386
387     cmake_d="-D CMAKE_BUILD_TYPE=Release \
388              -D CMAKE_PREFIX_PATH=$_inst \
389              -D CMAKE_INSTALL_PREFIX=$_inst \
390              -D BUILDSTATIC=ON"
391
392     if [ -d $INST/boost ]; then
393       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON"
394     fi
395
396     # Looks like we do not need ocio in oiio for now...
397 #    if [ -d $INST/ocio ]; then
398 #      cmake_d="$cmake_d -D OCIO_PATH=$INST/ocio"
399 #    fi
400
401     if file /bin/cp | grep -q '32-bit'; then
402       cflags="-fPIC -m32 -march=i686"
403     else
404       cflags="-fPIC"
405     fi
406
407     cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ../src
408
409     make -j$THREADS && make install
410     make clean
411
412     if [ -d $_inst ]; then
413       rm -f $INST/oiio
414       ln -s oiio-$OIIO_VERSION $INST/oiio
415     else
416       ERROR "OpenImageIO-$OIIO_VERSION failed to compile, exiting"
417       exit 1
418     fi
419
420     magic_compile_set oiio-$OIIO_VERSION $oiio_magic
421
422     cd $CWD
423   else
424     INFO "Own OpenImageIO-$OIIO_VERSION is up to date, nothing to do!"
425     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
426   fi
427 }
428
429 compile_OSL() {
430   # To be changed each time we make edits that would modify the compiled result!
431   osl_magic=5
432
433   _src=$SRC/OpenShadingLanguage-$OSL_VERSION
434   _inst=$INST/osl-$OSL_VERSION
435
436   # Clean install if needed!
437   magic_compile_check osl-$OSL_VERSION $osl_magic
438   if [ $? -eq 1 ]; then
439     rm -rf $_inst
440   fi
441
442   if [ ! -d $_inst ]; then
443     INFO "Building OpenShadingLanguage-$OSL_VERSION"
444
445     prepare_opt
446
447     if [ ! -d $_src ]; then
448       # XXX Using git on my own repo for now, looks like archives are not updated immediately... :/
449 #      wget -c $OSL_SOURCE -O "$_src.tar.gz"
450
451 #      INFO "Unpacking OpenShadingLanguage-$OSL_VERSION"
452 #      tar -C $SRC --transform "s,(.*/?)OpenShadingLanguage-[^/]*(.*),\1OpenShadingLanguage-$OSL_VERSION\2,x" \
453 #          -xf $_src.tar.gz
454       git clone https://github.com/mont29/OpenShadingLanguage.git $_src
455       cd $_src
456       git checkout blender-fixes
457       cd $CWD
458     fi
459
460     cd $_src
461     # XXX For now, always update from latest repo...
462     git checkout .
463
464     # Always refresh the whole build!
465     if [ -d build ]; then
466       rm -rf build
467     fi    
468     mkdir build
469     cd build
470
471     cmake_d="-D CMAKE_BUILD_TYPE=Release"
472     cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
473     cmake_d="$cmake_d -D BUILDSTATIC=ON"
474     cmake_d="$cmake_d -D BUILD_TESTING=OFF"
475
476     if [ -d $INST/boost ]; then
477       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost"
478     fi
479
480     if [ -d $INST/oiio ]; then
481       cmake_d="$cmake_d -D OPENIMAGEIOHOME=$INST/oiio"
482     fi
483
484     if [ ! -z $LLVM_VERSION_FOUND ]; then
485       cmake_d="$cmake_d -D LLVM_VERSION=$LLVM_VERSION_FOUND"
486     fi
487
488     cmake $cmake_d ../src
489
490     make -j$THREADS && make install
491     make clean
492
493     if [ -d $_inst ]; then
494       rm -f $INST/osl
495       ln -s osl-$OSL_VERSION $INST/osl
496     else
497       ERROR "OpenShadingLanguage-$OSL_VERSION failed to compile, exiting"
498       exit 1
499     fi
500
501     magic_compile_set osl-$OSL_VERSION $osl_magic
502
503     cd $CWD
504   else
505     INFO "Own OpenShadingLanguage-$OSL_VERSION is up to date, nothing to do!"
506     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
507   fi
508 }
509
510 compile_FFmpeg() {
511   # To be changed each time we make edits that would modify the compiled result!
512   ffmpeg_magic=0
513
514   _src=$SRC/ffmpeg-$FFMPEG_VERSION
515   _inst=$INST/ffmpeg-$FFMPEG_VERSION
516
517   # Clean install if needed!
518   magic_compile_check ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
519   if [ $? -eq 1 ]; then
520     rm -rf $_inst
521   fi
522
523   if [ ! -d $_inst ]; then
524     INFO "Building ffmpeg-$FFMPEG_VERSION"
525
526     prepare_opt
527
528     if [ ! -d $_src ]; then
529       INFO "Downloading ffmpeg-$FFMPEG_VERSION"
530       wget -c $FFMPEG_SOURCE -O "$_src.tar.bz2"
531
532       INFO "Unpacking ffmpeg-$FFMPEG_VERSION"
533       tar -C $SRC -xf $_src.tar.bz2
534     fi
535
536     cd $_src
537
538     extra=""
539
540     if $VORBIS_USE; then
541       extra="$extra --enable-libvorbis"
542     fi
543
544     if $THEORA_USE; then
545       extra="$extra --enable-libtheora"
546     fi
547
548     if $SCHRO_USE; then
549       extra="$extra --enable-libschroedinger"
550     fi
551
552     if $XVID_USE; then
553       extra="$extra --enable-libxvid"
554     fi
555
556     if $X264_USE; then
557       extra="$extra --enable-libx264"
558     fi
559
560     if $VPX_USE; then
561       extra="$extra --enable-libvpx"
562     fi
563
564     if $MP3LAME_USE; then
565       extra="$extra --enable-libmp3lame"
566     fi
567
568     if $OPENJPEG_USE; then
569       extra="$extra --enable-libopenjpeg"
570     fi
571
572     ./configure --cc="gcc -Wl,--as-needed" --extra-ldflags="-pthread -static-libgcc" \
573         --prefix=$_inst --enable-static --enable-avfilter --disable-vdpau \
574         --disable-bzlib --disable-libgsm --disable-libspeex \
575         --enable-pthreads --enable-zlib --enable-stripping --enable-runtime-cpudetect \
576         --disable-vaapi  --disable-libfaac --disable-nonfree --enable-gpl \
577         --disable-postproc --disable-x11grab  --disable-librtmp  --disable-libopencore-amrnb \
578         --disable-libopencore-amrwb --disable-libdc1394 --disable-version3  --disable-outdev=sdl \
579         --disable-outdev=alsa --disable-indev=sdl --disable-indev=alsa --disable-indev=jack \
580         --disable-indev=lavfi $extra
581
582     make -j$THREADS && make install
583     make clean
584
585     if [ -d $_inst ]; then
586       rm -f $INST/ffmpeg
587       ln -s ffmpeg-$FFMPEG_VERSION $INST/ffmpeg
588     else
589       ERROR "FFmpeg-$FFMPEG_VERSION failed to compile, exiting"
590       exit 1
591     fi
592
593     magic_compile_set ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
594
595     cd $CWD
596   else
597     INFO "Own ffmpeg-$FFMPEG_VERSION is up to date, nothing to do!"
598     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
599   fi
600 }
601
602 deb_version() {
603     dpkg-query -W -f '${Version}' $1 | sed -r 's/^([0-9]\.[0-9]+).*/\1/'
604 }
605
606 check_package_DEB() {
607   r=`apt-cache policy $1 | grep -c 'Candidate:'`
608
609   if [ $r -ge 1 ]; then
610     return 0
611   else
612     return 1
613   fi
614 }
615
616 check_package_version_match_DEB() {
617   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'`
618
619   if [ -z "$v" ]; then
620     return 1
621   fi
622
623   version_match $v $2
624   return $?
625 }
626
627 check_package_version_ge_DEB() {
628   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'`
629
630   if [ -z "$v" ]; then
631     return 1
632   fi
633
634   version_ge $v $2
635   return $?
636 }
637
638 install_DEB() {
639   INFO ""
640   INFO "Installing dependencies for DEB-based distribution"
641   INFO "Source code of dependencies needed to be compiled will be downloaded and extracted into $SRC"
642   INFO "Built libs of dependencies needed to be compiled will be installed into $INST"
643   INFO "Please edit \$SRC and/or \$INST variables at the begining of this script if you want to use other paths!"
644   INFO ""
645
646   sudo apt-get update
647 # XXX Why in hell? Let's let this stuff to the user's responsability!!!
648 #  sudo apt-get -y upgrade
649
650   # These libs should always be available in debian/ubuntu official repository...
651   OPENJPEG_DEV="libopenjpeg-dev"
652   SCHRO_DEV="libschroedinger-dev"
653   VORBIS_DEV="libvorbis-dev"
654   THEORA_DEV="libtheora-dev"
655
656   sudo apt-get install -y gawk cmake scons gcc g++ libjpeg-dev libpng-dev libtiff-dev \
657     libfreetype6-dev libx11-dev libxi-dev wget libsqlite3-dev libbz2-dev libncurses5-dev \
658     libssl-dev liblzma-dev libreadline-dev $OPENJPEG_DEV libopenexr-dev libopenal-dev \
659     libglew-dev yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libsdl1.2-dev \
660     libfftw3-dev libjack-dev python-dev patch flex bison libtbb-dev git
661
662   OPENJPEG_USE=true
663   SCHRO_USE=true
664   VORBIS_USE=true
665   THEORA_USE=true
666
667   # Grmpf, debian is libxvidcore-dev and ubuntu libxvidcore4-dev!
668   XVID_DEV="libxvidcore-dev"
669   check_package_DEB $XVID_DEV
670   if [ $? -eq 0 ]; then
671     sudo apt-get install -y $XVID_DEV
672     XVID_USE=true
673   else
674     XVID_DEV="libxvidcore4-dev"
675     check_package_DEB $XVID_DEV
676     if [ $? -eq 0 ]; then
677       sudo apt-get install -y $XVID_DEV
678       XVID_USE=true
679     fi
680   fi
681
682   MP3LAME_DEV="libmp3lame-dev"
683   check_package_DEB $MP3LAME_DEV
684   if [ $? -eq 0 ]; then
685     sudo apt-get install -y $MP3LAME_DEV
686     MP3LAME_USE=true
687   fi
688
689   X264_DEV="libx264-dev"
690   check_package_version_ge_DEB $X264_DEV $X264_VERSION_MIN
691   if [ $? -eq 0 ]; then
692     sudo apt-get install -y $X264_DEV
693     X264_USE=true
694   fi
695
696   VPX_DEV="libvpx-dev"
697   check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN
698   if [ $? -eq 0 ]; then
699     sudo apt-get install -y $VPX_DEV
700     VPX_USE=true
701   fi
702
703   check_package_DEB libspnav-dev
704   if [ $? -eq 0 ]; then
705     sudo apt-get install -y libspnav-dev
706   fi
707
708   check_package_DEB python3.3-dev
709   if [ $? -eq 0 ]; then
710     sudo apt-get install -y python3.3-dev
711   else
712     compile_Python
713   fi
714
715   check_package_version_ge_DEB libboost-dev $BOOST_VERSION_MIN
716   if [ $? -eq 0 ]; then
717     sudo apt-get install -y libboost-dev
718
719     boost_version=`deb_version libboost-dev`
720
721     check_package_DEB libboost-locale$boost_version-dev
722     if [ $? -eq 0 ]; then
723       sudo apt-get install -y libboost-locale$boost_version-dev libboost-filesystem$boost_version-dev \
724                               libboost-regex$boost_version-dev libboost-system$boost_version-dev \
725                               libboost-thread$boost_version-dev
726     else
727       compile_Boost
728     fi
729   else
730     compile_Boost
731   fi
732
733   check_package_version_ge_DEB libopencolorio-dev $OCIO_VERSION_MIN
734   if [ $? -eq 0 ]; then
735     sudo apt-get install -y libopencolorio-dev
736   else
737     compile_OCIO
738   fi
739
740   check_package_version_ge_DEB libopenimageio-dev $OIIO_VERSION_MIN
741   if [ $? -eq 0 ]; then
742     sudo apt-get install -y libopenimageio-dev
743   else
744     compile_OIIO
745   fi
746
747   if $BUILD_OSL; then
748     have_llvm=false
749
750     check_package_DEB llvm-$LLVM_VERSION-dev
751     if [ $? -eq 0 ]; then
752       sudo apt-get install -y llvm-$LLVM_VERSION-dev clang
753       have_llvm=true
754       LLVM_VERSION_FOUND=$LLVM_VERSION
755     else
756       check_package_DEB llvm-$LLVM_VERSION_MIN-dev
757       if [ $? -eq 0 ]; then
758         sudo apt-get install -y llvm-$LLVM_VERSION_MIN-dev clang
759         have_llvm=true
760         LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
761       fi
762     fi
763
764     if $have_llvm; then
765       # No package currently!
766       compile_OSL
767     fi
768   fi
769
770 #  XXX Debian features libav packages as ffmpeg, those are not really compatible with blender code currently :/
771 #      So for now, always build our own ffmpeg.
772 #  check_package_DEB ffmpeg
773 #  if [ $? -eq 0 ]; then
774 #    sudo apt-get install -y ffmpeg
775 #    ffmpeg_version=`deb_version ffmpeg`
776 #    INFO "ffmpeg version: $ffmpeg_version"
777 #    if [ ! -z "$ffmpeg_version" ]; then
778 #      if  dpkg --compare-versions $ffmpeg_version gt 0.7.2; then
779 #        sudo apt-get install -y libavfilter-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libswscale-dev
780 #      else
781 #        compile_FFmpeg
782 #      fi
783 #    fi
784 #  fi
785   compile_FFmpeg
786 }
787
788 check_package_RPM() {
789   r=`yum info $1 | grep -c 'Summary'`
790
791   if [ $r -ge 1 ]; then
792     return 0
793   else
794     return 1
795   fi
796 }
797
798 check_package_version_match_RPM() {
799   v=`yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
800
801   if [ -z "$v" ]; then
802     return 1
803   fi
804
805   version_match $v $2
806   return $?
807 }
808
809 check_package_version_ge_RPM() {
810   v=`yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
811
812   if [ -z "$v" ]; then
813     return 1
814   fi
815
816   version_ge $v $2
817   return $?
818 }
819
820 install_RPM() {
821   INFO ""
822   INFO "Installing dependencies for RPM-based distribution"
823   INFO "Source code of dependencies needed to be compiled will be downloaded and extracted into $SRC"
824   INFO "Built libs of dependencies needed to be compiled will be installed into $INST"
825   INFO "Please edit \$SRC and/or \$INST variables at the begining of this script if you want to use other paths!"
826   INFO ""
827
828   sudo yum -y update
829
830   sudo yum -y install gawk gcc gcc-c++ cmake scons libpng-devel libtiff-devel \
831     freetype-devel libX11-devel libXi-devel wget libsqlite3x-devel ncurses-devel \
832     readline-devel openjpeg-devel openexr-devel openal-soft-devel \
833     glew-devel yasm schroedinger-devel libtheora-devel libvorbis-devel SDL-devel \
834     fftw-devel lame-libs jack-audio-connection-kit-devel libspnav-devel \
835     libjpeg-devel patch python-devel
836
837   OPENJPEG_USE=true
838   SCHRO_USE=true
839
840   check_package_RPM x264-devel
841   if [ $? -eq 0 ]; then
842     sudo yum install -y x264-devel
843     X264_USE=true
844   fi
845
846   check_package_RPM xvidcore-devel
847   if [ $? -eq 0 ]; then
848     sudo yum install -y xvidcore-devel
849     XVID_USE=true
850     XVID_DEV="xvidcore-devel"
851   fi
852
853   check_package_version_ge_RPM libvpx-devel 0.9.7
854   if [ $? -eq 0 ]; then
855     sudo yum install -y libvpx-devel
856     VPX_USE=true
857   fi
858
859   check_package_RPM lame-devel
860   if [ $? -eq 0 ]; then
861     sudo yum install -y lame-devel
862     MP3LAME_USE=true
863   fi
864
865   check_package_version_match_RPM python3-devel 3.3
866   if [ $? -eq 0 ]; then
867     sudo yum install -y python-devel
868   else
869     compile_Python
870   fi
871
872   check_package_RPM boost-devel
873   if [ $? -eq 0 ]; then
874     sudo yum install -y boost-devel
875   else
876     compile_Boost
877   fi
878
879   check_package_RPM OpenColorIO-devel
880   if [ $? -eq 0 ]; then
881     sudo yum install -y OpenColorIO-devel
882   else
883     compile_OCIO
884   fi
885
886   check_package_RPM OpenImageIO-devel
887   if [ $? -eq 0 ]; then
888     sudo yum install -y OpenImageIO-devel
889   else
890     compile_OIIO
891   fi
892
893   # Always for now, not sure which packages should be installed
894   compile_FFmpeg
895 }
896
897 check_package_SUSE() {
898   r=`zypper info $1 | grep -c 'Summary'`
899
900   if [ $r -ge 1 ]; then
901     return 0
902   else
903     return 1
904   fi
905 }
906
907 check_package_version_SUSE() {
908   v=`zypper info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
909
910   # for now major and minor versions only (as if x.y, not x.y.z)
911   r=`echo $v | grep -c $2`
912
913   if [ $r -ge 1 ]; then
914     return 0
915   else
916     return 1
917   fi
918 }
919
920 install_SUSE() {
921   INFO ""
922   INFO "Installing dependencies for SuSE-based distribution"
923   INFO "Source code of dependencies needed to be compiled will be downloaded and extracted into $SRC"
924   INFO "Built libs of dependencies needed to be compiled will be installed into $INST"
925   INFO "Please edit \$SRC and/or \$INST variables at the begining of this script if you want to use other paths!"
926   INFO ""
927
928   sudo zypper --non-interactive update --auto-agree-with-licenses
929
930   sudo zypper --non-interactive install --auto-agree-with-licenses \
931     gcc gcc-c++ libSDL-devel openal-soft-devel libpng12-devel libjpeg62-devel \
932     libtiff-devel OpenEXR-devel yasm libtheora-devel libvorbis-devel cmake \
933     scons patch
934
935   check_package_version_SUSE python3-devel 3.3.
936   if [ $? -eq 0 ]; then
937     sudo zypper --non-interactive install --auto-agree-with-licenses python3-devel
938   else
939     compile_Python
940   fi
941
942   # can not see boost_locale in repo, so let's build own boost
943   compile_Boost
944
945   # this libraries are also missing in the repo
946   compile_OCIO
947   compile_OIIO
948   compile_FFmpeg
949 }
950
951 print_info_ffmpeglink_DEB() {
952   _packages="libtheora-dev"
953
954   if $XVID_USE; then
955     _packages="$_packages $XVID_DEV"
956   fi
957
958   if $VPX_USE; then
959     _packages="$_packages libvpx-dev"
960   fi
961
962   if $MP3LAME_USE; then
963     _packages="$_packages libmp3lame-dev"
964   fi
965
966   if $X264_USE; then
967     _packages="$_packages libx264-dev"
968   fi
969
970   if $OPENJPEG_USE; then
971     _packages="$_packages libopenjpeg-dev"
972   fi
973
974   if $SCHRO_USE; then
975     _packages="$_packages libschroedinger-dev"
976   fi
977
978   dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.so" | awk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
979 }
980
981 print_info_ffmpeglink_RPM() {
982   _packages="libtheora-devel libvorbis-devel"
983
984   if $XVID_USE; then
985     _packages="$_packages $XVID_DEV"
986   fi
987
988   if $VPX_USE; then
989     _packages="$_packages libvpx-devel"
990   fi
991
992   if $MP3LAME_USE; then
993     _packages="$_packages lame-devel"
994   fi
995
996   if $X264_USE; then
997     _packages="$_packages x264-devel"
998   fi
999
1000   if $OPENJPEG_USE; then
1001     _packages="$_packages openjpeg-devel"
1002   fi
1003
1004   if $SCHRO_USE; then
1005     _packages="$_packages schroedinger-devel"
1006   fi
1007
1008   rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | awk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1009 }
1010
1011 print_info_ffmpeglink() {
1012   # This func must only print a ';'-separated list of libs...
1013   if [ -z "$DISTRO" ]; then
1014     ERROR "Failed to detect distribution type"
1015     exit 1
1016   elif [ "$DISTRO" = "DEB" ]; then
1017     print_info_ffmpeglink_DEB
1018   elif [ "$DISTRO" = "RPM" ]; then
1019     print_info_ffmpeglink_RPM
1020   # XXX TODO!
1021   else INFO "<Could not determine additional link libraries needed for ffmpeg, replace this by valid list of libs...>"
1022 #  elif [ "$DISTRO" = "SUSE" ]; then
1023 #    print_info_ffmpeglink_SUSE
1024   fi
1025 }
1026
1027 print_info() {
1028   INFO ""
1029   INFO "If you're using CMake add this to your configuration flags:"
1030
1031   if [ -d $INST/boost ]; then
1032     INFO "  -D BOOST_ROOT=$INST/boost"
1033     INFO "  -D Boost_NO_SYSTEM_PATHS=ON"
1034   fi
1035
1036   if [ -d $INST/osl ]; then
1037     INFO "  -D CYCLES_OSL=$INST/osl"
1038     INFO "  -D WITH_CYCLES_OSL=ON"
1039     INFO "  -D LLVM_VERSION=$LLVM_VERSION_FOUND"
1040   fi
1041
1042   if [ -d $INST/ffmpeg ]; then
1043     INFO "  -D WITH_CODEC_FFMPEG=ON"
1044     INFO "  -D FFMPEG=$INST/ffmpeg"
1045     INFO "  -D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'"
1046   fi
1047
1048   INFO ""
1049   INFO "If you're using SCons add this to your user-config:"
1050
1051   if [ -d $INST/python-3.3 ]; then
1052     INFO "BF_PYTHON = '$INST/python-3.3'"
1053     INFO "BF_PYTHON_ABI_FLAGS = 'm'"
1054   fi
1055
1056   if [ -d $INST/ocio ]; then
1057     INFO "BF_OCIO = '$INST/ocio'"
1058   fi
1059
1060   if [ -d $INST/oiio ]; then
1061     INFO "BF_OIIO = '$INST/oiio'"
1062   fi
1063
1064   if [ -d $INST/boost ]; then
1065     INFO "BF_BOOST = '$INST/boost'"
1066   fi
1067
1068   if [ -d $INST/ffmpeg ]; then
1069     INFO "BF_FFMPEG = '$INST/ffmpeg'"
1070     _ffmpeg_list_sep=" "
1071     INFO "BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice `print_info_ffmpeglink`'"
1072   fi
1073
1074   INFO ""
1075   INFO ""
1076   INFO "WARNING: If this script had to build boost into $INST, and you are dynamically linking "
1077   INFO "         blender against it, you will have to run those commands as root user:"
1078   INFO ""
1079   INFO "    echo \"$INST/boost/lib\" > /etc/ld.so.conf.d/boost.conf"
1080   INFO "    ldconfig"
1081   INFO ""
1082 }
1083
1084 # Detect distributive type used on this machine
1085 detect_distro
1086
1087 if [ -z "$DISTRO" ]; then
1088   ERROR "Failed to detect distribution type"
1089   exit 1
1090 elif [ "$DISTRO" = "DEB" ]; then
1091   install_DEB
1092 elif [ "$DISTRO" = "RPM" ]; then
1093   install_RPM
1094 elif [ "$DISTRO" = "SUSE" ]; then
1095   install_SUSE
1096 fi
1097
1098 print_info
1099
1100 # Switch back to user language.
1101 LANG=LANG_BACK
1102 export LANG