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