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