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