More tweaks:
[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           -D OCIO_BUILD_PYGLUE=OFF \
359           ..
360
361     make -j$THREADS && make install
362
363     # Force linking against static libs
364     rm -f $_inst/lib/*.so*
365
366     # Additional depencencies
367     cp ext/dist/lib/libtinyxml.a $_inst/lib
368     cp ext/dist/lib/libyaml-cpp.a $_inst/lib
369
370     make clean
371
372     if [ -d $_inst ]; then
373       rm -f $INST/ocio
374       ln -s ocio-$OCIO_VERSION $INST/ocio
375     else
376       ERROR "OpenColorIO-$OCIO_VERSION failed to compile, exiting"
377       exit 1
378     fi
379
380     magic_compile_set ocio-$OCIO_VERSION $ocio_magic
381
382     cd $CWD
383   else
384     INFO "Own OpenColorIO-$OCIO_VERSION is up to date, nothing to do!"
385     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
386   fi
387 }
388
389 compile_OIIO() {
390   # To be changed each time we make edits that would modify the compiled result!
391   oiio_magic=5
392
393   _src=$SRC/OpenImageIO-$OIIO_VERSION
394   _inst=$INST/oiio-$OIIO_VERSION
395
396   # Clean install if needed!
397   magic_compile_check oiio-$OIIO_VERSION $oiio_magic
398   if [ $? -eq 1 ]; then
399     rm -rf $_inst
400   fi
401
402   if [ ! -d $_inst ]; then
403     INFO "Building OpenImageIO-$OIIO_VERSION"
404
405     prepare_opt
406
407     if [ ! -d $_src ]; then
408       wget -c $OIIO_SOURCE -O "$_src.tar.gz"
409
410       INFO "Unpacking OpenImageIO-$OIIO_VERSION"
411       tar -C $SRC --transform "s,(.*/?)OpenImageIO-oiio[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" \
412           -xf $_src.tar.gz
413
414       cd $_src
415
416       # XXX Ugly patching hack!
417       cat << EOF | patch -p1
418 diff --git a/src/libutil/SHA1.cpp b/src/libutil/SHA1.cpp
419 index b9e6c8b..c761185 100644
420 --- a/src/libutil/SHA1.cpp
421 +++ b/src/libutil/SHA1.cpp
422 @@ -8,9 +8,9 @@
423  
424  // If compiling with MFC, you might want to add #include "StdAfx.h"
425  
426 +#include "SHA1.h"
427  #include "hash.h"
428  #include "dassert.h"
429 -#include "SHA1.h"
430  
431  #ifdef SHA1_UTILITY_FUNCTIONS
432  #define SHA1_MAX_FILE_BUFFER 8000
433 EOF
434
435     fi
436
437     cd $_src
438     # Always refresh the whole build!
439     if [ -d build ]; then
440       rm -rf build
441     fi    
442     mkdir build
443     cd build
444
445     cmake_d="-D CMAKE_BUILD_TYPE=Release \
446              -D CMAKE_PREFIX_PATH=$_inst \
447              -D CMAKE_INSTALL_PREFIX=$_inst \
448              -D BUILDSTATIC=ON"
449
450     if [ -d $INST/boost ]; then
451       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON"
452       if $ALL_STATIC; then
453         cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON"        
454       fi
455     fi
456
457     # Looks like we do not need ocio in oiio for now...
458 #    if [ -d $INST/ocio ]; then
459 #      cmake_d="$cmake_d -D OCIO_PATH=$INST/ocio"
460 #    fi
461
462     if file /bin/cp | grep -q '32-bit'; then
463       cflags="-fPIC -m32 -march=i686"
464     else
465       cflags="-fPIC"
466     fi
467
468     cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ../src
469
470     make -j$THREADS && make install
471     make clean
472
473     if [ -d $_inst ]; then
474       rm -f $INST/oiio
475       ln -s oiio-$OIIO_VERSION $INST/oiio
476     else
477       ERROR "OpenImageIO-$OIIO_VERSION failed to compile, exiting"
478       exit 1
479     fi
480
481     magic_compile_set oiio-$OIIO_VERSION $oiio_magic
482
483     cd $CWD
484   else
485     INFO "Own OpenImageIO-$OIIO_VERSION is up to date, nothing to do!"
486     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
487   fi
488 }
489
490 compile_OSL() {
491   # To be changed each time we make edits that would modify the compiled result!
492   osl_magic=6
493
494   _src=$SRC/OpenShadingLanguage-$OSL_VERSION
495   _inst=$INST/osl-$OSL_VERSION
496
497   # Clean install if needed!
498   magic_compile_check osl-$OSL_VERSION $osl_magic
499   if [ $? -eq 1 ]; then
500     rm -rf $_inst
501   fi
502
503   if [ ! -d $_inst ]; then
504     INFO "Building OpenShadingLanguage-$OSL_VERSION"
505
506     prepare_opt
507
508     if [ ! -d $_src ]; then
509       # XXX Using git on my own repo for now, looks like archives are not updated immediately... :/
510 #      wget -c $OSL_SOURCE -O "$_src.tar.gz"
511
512 #      INFO "Unpacking OpenShadingLanguage-$OSL_VERSION"
513 #      tar -C $SRC --transform "s,(.*/?)OpenShadingLanguage-[^/]*(.*),\1OpenShadingLanguage-$OSL_VERSION\2,x" \
514 #          -xf $_src.tar.gz
515       git clone https://github.com/mont29/OpenShadingLanguage.git $_src
516       cd $_src
517       git checkout blender-fixes
518       cd $CWD
519     fi
520
521     cd $_src
522     # XXX For now, always update from latest repo...
523     git checkout .
524
525     # Always refresh the whole build!
526     if [ -d build ]; then
527       rm -rf build
528     fi    
529     mkdir build
530     cd build
531
532     cmake_d="-D CMAKE_BUILD_TYPE=Release"
533     cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
534     cmake_d="$cmake_d -D BUILDSTATIC=ON"
535     cmake_d="$cmake_d -D BUILD_TESTING=OFF"
536
537     if [ -d $INST/boost ]; then
538       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON"
539       if $ALL_STATIC; then
540         cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON"        
541       fi
542     fi
543
544     if [ -d $INST/oiio ]; then
545       cmake_d="$cmake_d -D OPENIMAGEIOHOME=$INST/oiio"
546     fi
547
548     if [ ! -z $LLVM_VERSION_FOUND ]; then
549       cmake_d="$cmake_d -D LLVM_VERSION=$LLVM_VERSION_FOUND"
550     fi
551
552     cmake $cmake_d ../src
553
554     make -j$THREADS && make install
555     make clean
556
557     if [ -d $_inst ]; then
558       rm -f $INST/osl
559       ln -s osl-$OSL_VERSION $INST/osl
560     else
561       ERROR "OpenShadingLanguage-$OSL_VERSION failed to compile, exiting"
562       exit 1
563     fi
564
565     magic_compile_set osl-$OSL_VERSION $osl_magic
566
567     cd $CWD
568   else
569     INFO "Own OpenShadingLanguage-$OSL_VERSION is up to date, nothing to do!"
570     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
571   fi
572 }
573
574 compile_FFmpeg() {
575   # To be changed each time we make edits that would modify the compiled result!
576   ffmpeg_magic=3
577
578   _src=$SRC/ffmpeg-$FFMPEG_VERSION
579   _inst=$INST/ffmpeg-$FFMPEG_VERSION
580
581   # Clean install if needed!
582   magic_compile_check ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
583   if [ $? -eq 1 ]; then
584     rm -rf $_inst
585   fi
586
587   if [ ! -d $_inst ]; then
588     INFO "Building ffmpeg-$FFMPEG_VERSION"
589
590     prepare_opt
591
592     if [ ! -d $_src ]; then
593       INFO "Downloading ffmpeg-$FFMPEG_VERSION"
594       wget -c $FFMPEG_SOURCE -O "$_src.tar.bz2"
595
596       INFO "Unpacking ffmpeg-$FFMPEG_VERSION"
597       tar -C $SRC -xf $_src.tar.bz2
598     fi
599
600     cd $_src
601
602     extra=""
603
604     if $VORBIS_USE; then
605       extra="$extra --enable-libvorbis"
606     fi
607
608     if $THEORA_USE; then
609       extra="$extra --enable-libtheora"
610     fi
611
612     # XXX At under Debian, static schro gives problem at blender linking time... :/
613     if $SCHRO_USE && ! $ALL_STATIC; then
614       extra="$extra --enable-libschroedinger"
615     fi
616
617     if $XVID_USE; then
618       extra="$extra --enable-libxvid"
619     fi
620
621     if $X264_USE; then
622       extra="$extra --enable-libx264"
623     fi
624
625     if $VPX_USE; then
626       extra="$extra --enable-libvpx"
627     fi
628
629     if $MP3LAME_USE; then
630       extra="$extra --enable-libmp3lame"
631     fi
632
633     if $OPENJPEG_USE; then
634       extra="$extra --enable-libopenjpeg"
635     fi
636
637     ./configure --cc="gcc -Wl,--as-needed" \
638         --extra-ldflags="-pthread -static-libgcc" \
639         --prefix=$_inst --enable-static \
640         --disable-ffplay --disable-ffserver --disable-doc \
641         --enable-gray \
642         --enable-avfilter --disable-vdpau \
643         --disable-bzlib --disable-libgsm --disable-libspeex \
644         --enable-pthreads --enable-zlib --enable-stripping --enable-runtime-cpudetect \
645         --disable-vaapi  --disable-libfaac --disable-nonfree --enable-gpl \
646         --disable-postproc --disable-x11grab  --disable-librtmp  --disable-libopencore-amrnb \
647         --disable-libopencore-amrwb --disable-libdc1394 --disable-version3  --disable-outdev=sdl \
648         --disable-outdev=alsa --disable-indev=sdl --disable-indev=alsa --disable-indev=jack \
649         --disable-indev=lavfi $extra
650
651     make -j$THREADS && make install
652     make clean
653
654     if [ -d $_inst ]; then
655       rm -f $INST/ffmpeg
656       ln -s ffmpeg-$FFMPEG_VERSION $INST/ffmpeg
657     else
658       ERROR "FFmpeg-$FFMPEG_VERSION failed to compile, exiting"
659       exit 1
660     fi
661
662     magic_compile_set ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
663
664     cd $CWD
665   else
666     INFO "Own ffmpeg-$FFMPEG_VERSION is up to date, nothing to do!"
667     INFO "If you want to force rebuild of this lib, delete the '$_src' and '$_inst' directories."
668   fi
669 }
670
671 get_package_version_DEB() {
672     dpkg-query -W -f '${Version}' $1 | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'
673 }
674
675 check_package_DEB() {
676   r=`apt-cache policy $1 | grep -c 'Candidate:'`
677
678   if [ $r -ge 1 ]; then
679     return 0
680   else
681     return 1
682   fi
683 }
684
685 check_package_version_match_DEB() {
686   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'`
687
688   if [ -z "$v" ]; then
689     return 1
690   fi
691
692   version_match $v $2
693   return $?
694 }
695
696 check_package_version_ge_DEB() {
697   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'`
698
699   if [ -z "$v" ]; then
700     return 1
701   fi
702
703   version_ge $v $2
704   return $?
705 }
706
707 install_DEB() {
708   INFO ""
709   INFO "Installing dependencies for DEB-based distribution"
710   INFO "$COMMON_INFO"
711   INFO ""
712
713   sudo apt-get update
714 # XXX Why in hell? Let's let this stuff to the user's responsability!!!
715 #  sudo apt-get -y upgrade
716
717   # These libs should always be available in debian/ubuntu official repository...
718   OPENJPEG_DEV="libopenjpeg-dev"
719   SCHRO_DEV="libschroedinger-dev"
720   VORBIS_DEV="libvorbis-dev"
721   THEORA_DEV="libtheora-dev"
722
723   sudo apt-get install -y gawk cmake scons gcc g++ libjpeg-dev libpng-dev libtiff-dev \
724     libfreetype6-dev libx11-dev libxi-dev wget libsqlite3-dev libbz2-dev libncurses5-dev \
725     libssl-dev liblzma-dev libreadline-dev $OPENJPEG_DEV libopenexr-dev libopenal-dev \
726     libglew-dev yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libsdl1.2-dev \
727     libfftw3-dev libjack-dev python-dev patch
728
729   OPENJPEG_USE=true
730   SCHRO_USE=true
731   VORBIS_USE=true
732   THEORA_USE=true
733
734   # Grmpf, debian is libxvidcore-dev and ubuntu libxvidcore4-dev!
735   XVID_DEV="libxvidcore-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   else
741     XVID_DEV="libxvidcore4-dev"
742     check_package_DEB $XVID_DEV
743     if [ $? -eq 0 ]; then
744       sudo apt-get install -y $XVID_DEV
745       XVID_USE=true
746     fi
747   fi
748
749   MP3LAME_DEV="libmp3lame-dev"
750   check_package_DEB $MP3LAME_DEV
751   if [ $? -eq 0 ]; then
752     sudo apt-get install -y $MP3LAME_DEV
753     MP3LAME_USE=true
754   fi
755
756   X264_DEV="libx264-dev"
757   check_package_version_ge_DEB $X264_DEV $X264_VERSION_MIN
758   if [ $? -eq 0 ]; then
759     sudo apt-get install -y $X264_DEV
760     X264_USE=true
761   fi
762
763   VPX_DEV="libvpx-dev"
764   check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN
765   if [ $? -eq 0 ]; then
766     sudo apt-get install -y $VPX_DEV
767     VPX_USE=true
768   fi
769
770   check_package_DEB libspnav-dev
771   if [ $? -eq 0 ]; then
772     sudo apt-get install -y libspnav-dev
773   fi
774
775   check_package_DEB python3.3-dev
776   if [ $? -eq 0 ]; then
777     sudo apt-get install -y python3.3-dev
778   else
779     compile_Python
780   fi
781
782   check_package_version_ge_DEB libboost-dev $BOOST_VERSION_MIN
783   if [ $? -eq 0 ]; then
784     sudo apt-get install -y libboost-dev
785
786     boost_version=$(echo `get_package_version_DEB libboost-dev` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')
787
788     check_package_DEB libboost-locale$boost_version-dev
789     if [ $? -eq 0 ]; then
790       sudo apt-get install -y libboost-locale$boost_version-dev libboost-filesystem$boost_version-dev \
791                               libboost-regex$boost_version-dev libboost-system$boost_version-dev \
792                               libboost-thread$boost_version-dev
793     else
794       compile_Boost
795     fi
796   else
797     compile_Boost
798   fi
799
800   check_package_version_ge_DEB libopencolorio-dev $OCIO_VERSION_MIN
801   if [ $? -eq 0 ]; then
802     sudo apt-get install -y libopencolorio-dev
803   else
804     compile_OCIO
805   fi
806
807   check_package_version_ge_DEB libopenimageio-dev $OIIO_VERSION_MIN
808   if [ $? -eq 0 ]; then
809     sudo apt-get install -y libopenimageio-dev
810   else
811     compile_OIIO
812   fi
813
814   if $BUILD_OSL; then
815     have_llvm=false
816
817     check_package_DEB llvm-$LLVM_VERSION-dev
818     if [ $? -eq 0 ]; then
819       sudo apt-get install -y llvm-$LLVM_VERSION-dev
820       have_llvm=true
821       LLVM_VERSION_FOUND=$LLVM_VERSION
822     else
823       check_package_DEB llvm-$LLVM_VERSION_MIN-dev
824       if [ $? -eq 0 ]; then
825         sudo apt-get install -y llvm-$LLVM_VERSION_MIN-dev
826         have_llvm=true
827         LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
828       fi
829     fi
830
831     if $have_llvm; then
832       sudo apt-get install -y clang flex bison libtbb-dev git
833       # No package currently!
834       compile_OSL
835     fi
836   fi
837
838 #  XXX Debian features libav packages as ffmpeg, those are not really compatible with blender code currently :/
839 #      So for now, always build our own ffmpeg.
840 #  check_package_DEB ffmpeg
841 #  if [ $? -eq 0 ]; then
842 #    sudo apt-get install -y ffmpeg
843 #    ffmpeg_version=`get_package_version_DEB ffmpeg`
844 #    INFO "ffmpeg version: $ffmpeg_version"
845 #    if [ ! -z "$ffmpeg_version" ]; then
846 #      if  dpkg --compare-versions $ffmpeg_version gt 0.7.2; then
847 #        sudo apt-get install -y libavfilter-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libswscale-dev
848 #      else
849 #        compile_FFmpeg
850 #      fi
851 #    fi
852 #  fi
853   compile_FFmpeg
854 }
855
856 get_package_version_RPM() {
857   yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
858 }
859
860 check_package_RPM() {
861   r=`yum info $1 | grep -c 'Summary'`
862
863   if [ $r -ge 1 ]; then
864     return 0
865   else
866     return 1
867   fi
868 }
869
870 check_package_version_match_RPM() {
871   v=`yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
872
873   if [ -z "$v" ]; then
874     return 1
875   fi
876
877   version_match $v $2
878   return $?
879 }
880
881 check_package_version_ge_RPM() {
882   v=`yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
883
884   if [ -z "$v" ]; then
885     return 1
886   fi
887
888   version_ge $v $2
889   return $?
890 }
891
892 install_RPM() {
893   INFO ""
894   INFO "Installing dependencies for RPM-based distribution"
895   INFO "$COMMON_INFO"
896   INFO ""
897
898   sudo yum -y update
899
900   # These libs should always be available in debian/ubuntu official repository...
901   OPENJPEG_DEV="openjpeg-devel"
902   SCHRO_DEV="schroedinger-devel"
903   VORBIS_DEV="libvorbis-devel"
904   THEORA_DEV="libtheora-devel"
905
906   sudo yum -y install gawk gcc gcc-c++ cmake scons libpng-devel libtiff-devel \
907     freetype-devel libX11-devel libXi-devel wget libsqlite3x-devel ncurses-devel \
908     readline-devel $OPENJPEG_DEV openexr-devel openal-soft-devel \
909     glew-devel yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV SDL-devel \
910     fftw-devel lame-libs jack-audio-connection-kit-devel libspnav-devel \
911     libjpeg-devel patch python-devel
912
913   OPENJPEG_USE=true
914   SCHRO_USE=true
915   VORBIS_USE=true
916   THEORA_USE=true
917
918   X264_DEV="x264-devel"
919   check_package_version_ge_RPM $X264_DEV $X264_VERSION_MIN
920   if [ $? -eq 0 ]; then
921     sudo yum install -y $X264_DEV
922     X264_USE=true
923   fi
924
925   XVID_DEV="xvidcore-devel"
926   check_package_RPM $XVID_DEV
927   if [ $? -eq 0 ]; then
928     sudo yum install -y $XVID_DEV
929     XVID_USE=true
930   fi
931
932   VPX_DEV="libvpx-devel"
933   check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN
934   if [ $? -eq 0 ]; then
935     sudo yum install -y $VPX_DEV
936     VPX_USE=true
937   fi
938
939   MP3LAME_DEV="lame-devel"
940   check_package_RPM $MP3LAME_DEV
941   if [ $? -eq 0 ]; then
942     sudo yum install -y $MP3LAME_DEV
943     MP3LAME_USE=true
944   fi
945
946   check_package_version_match_RPM python3-devel $PYTHON_VERSION_MIN
947   if [ $? -eq 0 ]; then
948     sudo yum install -y python3-devel
949   else
950     compile_Python
951   fi
952
953   check_package_version_ge_RPM boost-devel $BOOST_VERSION_MIN
954   if [ $? -eq 0 ]; then
955     sudo yum install -y boost-devel
956   else
957     compile_Boost
958   fi
959
960   check_package_version_ge_RPM OpenColorIO-devel $OCIO_VERSION_MIN
961   if [ $? -eq 0 ]; then
962     sudo yum install -y OpenColorIO-devel
963   else
964     compile_OCIO
965   fi
966
967   check_package_version_ge_RPM OpenImageIO-devel $OIIO_VERSION_MIN
968   if [ $? -eq 0 ]; then
969     sudo yum install -y OpenImageIO-devel
970   else
971     compile_OIIO
972   fi
973
974   if $BUILD_OSL; then
975     have_llvm=false
976
977     check_package_RPM llvm-$LLVM_VERSION-devel
978     if [ $? -eq 0 ]; then
979       sudo yum install -y llvm-$LLVM_VERSION-devel
980       have_llvm=true
981       LLVM_VERSION_FOUND=$LLVM_VERSION
982     else
983       check_package_RPM llvm-$LLVM_VERSION_MIN-devel
984       if [ $? -eq 0 ]; then
985         sudo yum install -y llvm-$LLVM_VERSION_MIN-devel
986         have_llvm=true
987         LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
988       else
989         check_package_version_ge_RPM llvm-devel $LLVM_VERSION_MIN
990         if [ $? -eq 0 ]; then
991           sudo yum install -y llvm-devel
992           have_llvm=true
993           LLVM_VERSION_FOUND=`get_package_version_RPM llvm-devel`
994         fi
995       fi
996     fi
997
998     if $have_llvm; then
999       sudo yum install -y flex bison clang tbb-devel git
1000       # No package currently!
1001       compile_OSL
1002     fi
1003   fi
1004
1005   # Always for now, not sure which packages should be installed
1006   compile_FFmpeg
1007 }
1008
1009 check_package_SUSE() {
1010   r=`zypper info $1 | grep -c 'Summary'`
1011
1012   if [ $r -ge 1 ]; then
1013     return 0
1014   else
1015     return 1
1016   fi
1017 }
1018
1019 check_package_version_SUSE() {
1020   v=`zypper info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'`
1021
1022   # for now major and minor versions only (as if x.y, not x.y.z)
1023   r=`echo $v | grep -c $2`
1024
1025   if [ $r -ge 1 ]; then
1026     return 0
1027   else
1028     return 1
1029   fi
1030 }
1031
1032 install_SUSE() {
1033   INFO ""
1034   INFO "Installing dependencies for SuSE-based distribution"
1035   INFO "$COMMON_INFO"
1036   INFO ""
1037
1038   sudo zypper --non-interactive update --auto-agree-with-licenses
1039
1040   sudo zypper --non-interactive install --auto-agree-with-licenses \
1041     gcc gcc-c++ libSDL-devel openal-soft-devel libpng12-devel libjpeg62-devel \
1042     libtiff-devel OpenEXR-devel yasm libtheora-devel libvorbis-devel cmake \
1043     scons patch
1044
1045   check_package_version_SUSE python3-devel 3.3.
1046   if [ $? -eq 0 ]; then
1047     sudo zypper --non-interactive install --auto-agree-with-licenses python3-devel
1048   else
1049     compile_Python
1050   fi
1051
1052   # can not see boost_locale in repo, so let's build own boost
1053   compile_Boost
1054
1055   # this libraries are also missing in the repo
1056   compile_OCIO
1057   compile_OIIO
1058   compile_FFmpeg
1059 }
1060
1061 print_info_ffmpeglink_DEB() {
1062   if $ALL_STATIC; then
1063     dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }'
1064   else
1065     dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1066   fi
1067 }
1068
1069 print_info_ffmpeglink_RPM() {
1070   if $ALL_STATIC; then
1071     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }'
1072   else
1073     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1074   fi
1075 }
1076
1077 print_info_ffmpeglink() {
1078   # This func must only print a ';'-separated list of libs...
1079   if [ -z "$DISTRO" ]; then
1080     ERROR "Failed to detect distribution type"
1081     exit 1
1082   fi
1083
1084   # Create list of packages from which to get libs names...
1085   _packages=""
1086
1087   if $THEORA_USE; then
1088     _packages="$_packages $THEORA_DEV"
1089   fi
1090
1091   if $VORBIS_USE; then
1092     _packages="$_packages $VORBIS_DEV"
1093   fi
1094
1095   if $XVID_USE; then
1096     _packages="$_packages $XVID_DEV"
1097   fi
1098
1099   if $VPX_USE; then
1100     _packages="$_packages $VPX_DEV"
1101   fi
1102
1103   if $MP3LAME_USE; then
1104     _packages="$_packages $MP3LAME_DEV"
1105   fi
1106
1107   if $X264_USE; then
1108     _packages="$_packages $X264_DEV"
1109   fi
1110
1111   if $OPENJPEG_USE; then
1112     _packages="$_packages $OPENJPEG_DEV"
1113   fi
1114
1115   # XXX At least under Debian, static schro give problem at blender linking time... :/
1116   if $SCHRO_USE && ! $ALL_STATIC; then
1117     _packages="$_packages $SCHRO_DEV"
1118   fi
1119
1120   if [ "$DISTRO" = "DEB" ]; then
1121     print_info_ffmpeglink_DEB
1122   elif [ "$DISTRO" = "RPM" ]; then
1123     print_info_ffmpeglink_RPM
1124   # XXX TODO!
1125   else INFO "<Could not determine additional link libraries needed for ffmpeg, replace this by valid list of libs...>"
1126 #  elif [ "$DISTRO" = "SUSE" ]; then
1127 #    print_info_ffmpeglink_SUSE
1128   fi
1129 }
1130
1131 print_info() {
1132   INFO ""
1133   INFO "If you're using CMake add this to your configuration flags:"
1134
1135   if [ -d $INST/boost ]; then
1136     INFO "  -D BOOST_ROOT=$INST/boost"
1137     INFO "  -D Boost_NO_SYSTEM_PATHS=ON"
1138     if $ALL_STATIC; then
1139       INFO "  -D Boost_USE_STATIC_LIBS=ON"
1140     fi
1141   elif $ALL_STATIC; then
1142     INFO "  -D Boost_USE_STATIC_LIBS=ON"
1143     INFO "  -D Boost_USE_ICU=ON"
1144   fi
1145
1146   if [ -d $INST/osl ]; then
1147     INFO "  -D CYCLES_OSL=$INST/osl"
1148     INFO "  -D WITH_CYCLES_OSL=ON"
1149     INFO "  -D LLVM_VERSION=$LLVM_VERSION_FOUND"
1150   fi
1151
1152   if [ -d $INST/ffmpeg ]; then
1153     INFO "  -D WITH_CODEC_FFMPEG=ON"
1154     INFO "  -D FFMPEG=$INST/ffmpeg"
1155     INFO "  -D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'"
1156   fi
1157
1158   INFO ""
1159   INFO "If you're using SCons add this to your user-config:"
1160
1161   if [ -d $INST/python-3.3 ]; then
1162     INFO "BF_PYTHON = '$INST/python-3.3'"
1163     INFO "BF_PYTHON_ABI_FLAGS = 'm'"
1164   fi
1165
1166   if [ -d $INST/ocio ]; then
1167     INFO "BF_OCIO = '$INST/ocio'"
1168   fi
1169
1170   if [ -d $INST/oiio ]; then
1171     INFO "BF_OIIO = '$INST/oiio'"
1172   fi
1173
1174   if [ -d $INST/boost ]; then
1175     INFO "BF_BOOST = '$INST/boost'"
1176   fi
1177
1178   if [ -d $INST/ffmpeg ]; then
1179     INFO "BF_FFMPEG = '$INST/ffmpeg'"
1180     _ffmpeg_list_sep=" "
1181     INFO "BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice `print_info_ffmpeglink`'"
1182   fi
1183
1184   INFO ""
1185   INFO ""
1186   INFO "WARNING: If this script had to build boost into $INST, and you are dynamically linking "
1187   INFO "         blender against it, you will have to run those commands as root user:"
1188   INFO ""
1189   INFO "    echo \"$INST/boost/lib\" > /etc/ld.so.conf.d/boost.conf"
1190   INFO "    ldconfig"
1191   INFO ""
1192 }
1193
1194 # Detect distributive type used on this machine
1195 detect_distro
1196
1197 if [ -z "$DISTRO" ]; then
1198   ERROR "Failed to detect distribution type"
1199   exit 1
1200 elif [ "$DISTRO" = "DEB" ]; then
1201   install_DEB
1202 elif [ "$DISTRO" = "RPM" ]; then
1203   install_RPM
1204 elif [ "$DISTRO" = "SUSE" ]; then
1205   install_SUSE
1206 fi
1207
1208 print_info
1209
1210 # Switch back to user language.
1211 LANG=LANG_BACK
1212 export LANG