Add exhaustive command line options description in --help message...
[blender.git] / build_files / build_environment / install_deps.sh
1 #!/bin/bash
2
3 # Parse command line!
4 ARGS=$( \
5 getopt \
6 -o s:i:t:h \
7 --long source:,install:,threads:,help,with-osl,all-static,force-python,force-boost,\
8 force-ocio,force-oiio,force-llvm,force-osl,force-ffmpeg \
9 -- "$@" \
10 )
11
12 DISTRO=""
13 SRC="$HOME/src/blender-deps"
14 INST="/opt/lib"
15 CWD=$PWD
16
17 # Do not yet enable osl, use --build-osl option to try it.
18 BUILD_OSL=false
19
20 # Try to link everything statically. Use this to produce protable versions of blender.
21 ALL_STATIC=false
22
23 THREADS=`cat /proc/cpuinfo | grep cores | uniq | sed -e "s/.*: *\(.*\)/\\1/"`
24 if [ -z "$THREADS" ]; then
25   THREADS=1
26 fi
27
28 COMMON_INFO="\"Source code of dependencies needed to be compiled will be downloaded and extracted into '\$SRC'.
29 Built libs of dependencies needed to be compiled will be installed into '\$INST'.
30 Please edit \\\$SRC and/or \\\$INST variables at the begining of this script,
31 or use --source/--install options, if you want to use other paths!
32
33 Number of threads for building: \$THREADS (automatically detected, use --threads=<nbr> to override it).
34 Building OSL: \$BUILD_OSL (use --with-osl option to enable it).
35 All static linking: \$ALL_STATIC (use --all-static option to enable it).
36
37 Use --help to show all available options!\""
38
39 ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
40     -h, --help
41         Show this message and exit.
42
43     -s <path>, --source=<path>
44         Use a specific path where to store downloaded libraries sources (defaults to '\$SRC').
45
46     -i <path>, --install=<path>
47         Use a specific path where to install built libraries (defaults to '\$INST').
48
49     -t n, --threads=n
50         Use a specific number of threads when building the libraries (auto-detected as '\$THREADS').
51
52     --with-osl
53         Try to install or build the OpenShadingLanguage libraries (and their dependencies).
54         Still experimental!
55
56     --all-static
57         Build libraries as statically as possible, to create static builds of Blender.
58
59     --force-python
60         Force the rebuild of Python.
61
62     --force-boost
63         Force the rebuild of Boost.
64
65     --force-ocio
66         Force the rebuild of OpenColorIO.
67
68     --force-oiio
69         Force the rebuild of OpenImageIO.
70
71     --force-llvm
72         Force the rebuild of LLVM.
73
74     --force-osl
75         Force the rebuild of OpenShadingLanguage.
76
77     --force-ffmpeg
78         Force the rebuild of FFMpeg.
79
80     Note about the --force-foo options:
81         * They obviously only have an effect if those libraries are built by this script
82           (i.e. if there is no available and satisfatory package)!
83         * If the “force-rebuilt” library is a dependency of anothers, it will force the rebuild
84           of those libraries too (e.g. --force-boost will also rebuild oiio and osl...).\""
85
86 PYTHON_VERSION="3.3.0"
87 PYTHON_VERSION_MIN="3.3"
88 PYTHON_SOURCE="http://python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tar.bz2"
89 PYTHON_FORCE_REBUILD=false
90
91 BOOST_VERSION="1.51.0"
92 _boost_version_nodots=`echo "$BOOST_VERSION" | sed -r 's/\./_/g'`
93 BOOST_SOURCE="http://sourceforge.net/projects/boost/files/boost/$BOOST_VERSION/boost_$_boost_version_nodots.tar.bz2/download"
94 BOOST_VERSION_MIN="1.49"
95 BOOST_FORCE_REBUILD=false
96
97 OCIO_VERSION="1.0.7"
98 OCIO_SOURCE="https://github.com/imageworks/OpenColorIO/tarball/v$OCIO_VERSION"
99 OCIO_VERSION_MIN="1.0"
100 OCIO_FORCE_REBUILD=false
101
102 OIIO_VERSION="1.1.1"
103 OIIO_SOURCE="https://github.com/OpenImageIO/oiio/tarball/Release-$OIIO_VERSION"
104 OIIO_VERSION_MIN="1.1"
105 OIIO_FORCE_REBUILD=false
106
107 LLVM_VERSION="3.1"
108 LLVM_VERSION_MIN="3.0"
109 LLVM_VERSION_FOUND=""
110 LLVM_SOURCE="http://llvm.org/releases/$LLVM_VERSION/llvm-$LLVM_VERSION.src.tar.gz"
111 LLVM_CLANG_SOURCE="http://llvm.org/releases/$LLVM_VERSION/clang-$LLVM_VERSION.src.tar.gz"
112 LLVM_FORCE_REBUILD=false
113
114 # OSL needs to be compiled for now!
115 OSL_VERSION="1.2.0"
116 OSL_SOURCE="https://github.com/mont29/OpenShadingLanguage/archive/blender-fixes.tar.gz"
117 OSL_FORCE_REBUILD=false
118
119 FFMPEG_VERSION="1.0"
120 FFMPEG_SOURCE="http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2"
121 FFMPEG_VERSION_MIN="0.7.6"
122 FFMPEG_FORCE_REBUILD=false
123 _ffmpeg_list_sep=";"
124
125 # FFMPEG optional libs.
126 VORBIS_USE=false
127 VORBIS_DEV=""
128 SCHRO_USE=false
129 SCRHO_DEV=""
130 THEORA_USE=false
131 THEORA_DEV=""
132 XVID_USE=false
133 XVID_DEV=""
134 X264_USE=false
135 X264_DEV=""
136 X264_VERSION_MIN=0.118
137 VPX_USE=false
138 VPX_VERSION_MIN=0.9.7
139 VPX_DEV=""
140 MP3LAME_USE=false
141 MP3LAME_DEV=""
142 OPENJPEG_USE=false
143 OPENJPEG_DEV=""
144
145 # Switch to english language, else some things (like check_package_DEB()) won't work!
146 LANG_BACK=$LANG
147 LANG=""
148 export LANG
149
150
151 _echo() {
152   if [ "X$1" = "X-n" ]; then
153      shift; printf "%s" "$@"
154   else
155      printf "%s\n" "$@"
156   fi
157 }
158
159 ERROR() {
160   _echo "$@"
161 }
162
163 INFO() {
164   _echo "$@"
165 }
166
167 # Finish parsing the commandline args.
168 eval set -- "$ARGS"
169 while true; do
170   case $1 in
171     -s|--source)
172       SRC="$2"; shift; shift; continue
173     ;;
174     -i|--install)
175       INST="$2"; shift; shift; continue
176     ;;
177     -t|--threads)
178       THREADS="$2"; shift; shift; continue
179     ;;
180     -h|--help)
181       INFO ""
182       INFO "USAGE:"
183       INFO ""
184       INFO "`eval _echo "$COMMON_INFO"`"
185       INFO ""
186       INFO "`eval _echo "$ARGUMENTS_INFO"`"
187       INFO ""
188       exit 0
189     ;;
190     --with-osl)
191       BUILD_OSL=true; shift; continue
192     ;;
193     --all-static)
194       ALL_STATIC=true; shift; continue
195     ;;
196     --force-python)
197       PYTHON_FORCE_REBUILD=true; shift; continue
198     ;;
199     --force-boost)
200       BOOST_FORCE_REBUILD=true; shift; continue
201     ;;
202     --force-ocio)
203       OCIO_FORCE_REBUILD=true; shift; continue
204     ;;
205     --force-oiio)
206       OIIO_FORCE_REBUILD=true; shift; continue
207     ;;
208     --force-llvm)
209       LLVM_FORCE_REBUILD=true; shift; continue
210     ;;
211     --force-osl)
212       OSL_FORCE_REBUILD=true; shift; continue
213     ;;
214     --force-ffmpeg)
215       FFMPEG_FORCE_REBUILD=true; shift; continue
216     ;;
217     --)
218       # no more arguments to parse
219       break
220     ;;
221     *)
222       INFO ""
223       INFO "Wrong parameter! Usage:"
224       INFO ""
225       INFO "`eval _echo "$COMMON_INFO"`"
226       INFO ""
227       exit 1
228     ;;
229   esac
230 done
231
232 # Return 0 if $1 = $2 (i.e. 1.01.0 = 1.1, but 1.1.1 != 1.1), else 1.
233 # $1 and $2 should be version numbers made of numbers only.
234 version_eq() {
235   backIFS=$IFS
236   IFS='.'
237
238   # Split both version numbers into their numeric elements.
239   arr1=( $1 )
240   arr2=( $2 )
241
242   ret=1
243
244   count1=${#arr1[@]}
245   count2=${#arr2[@]}
246   if [ $count2 -ge $count1 ]; then
247     _t=$count1
248     count1=$count2
249     count2=$_t
250     arr1=( $2 )
251     arr2=( $1 )
252   fi
253
254   ret=0
255   for (( i=0; $i < $count2; i++ ))
256   do
257     if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then
258       ret=1
259       break
260     fi
261   done
262
263   for (( i=$count2; $i < $count1; i++ ))
264   do
265     if [ $(( 10#${arr1[$i]} )) -ne 0 ]; then
266       ret=1
267       break
268     fi
269   done
270
271   IFS=$backIFS
272   return $ret
273 }
274
275 # Return 0 if $1 >= $2, else 1.
276 # $1 and $2 should be version numbers made of numbers only.
277 version_ge() {
278   version_eq $1 $2
279   if [ $? -eq 1 -a $(_echo "$1\n$2" | sort --version-sort | head --lines=1) = "$1" ]; then
280     return 1
281   else
282     return 0
283   fi
284 }
285
286 # 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.
287 # $1 and $2 should be version numbers made of numbers only.
288 # $1 should be at least as long as $2!
289 version_match() {
290   backIFS=$IFS
291   IFS='.'
292
293   # Split both version numbers into their numeric elements.
294   arr1=( $1 )
295   arr2=( $2 )
296
297   ret=1
298
299   count1=${#arr1[@]}
300   count2=${#arr2[@]}
301   if [ $count1 -ge $count2 ]; then
302     ret=0
303     for (( i=0; $i < $count2; i++ ))
304     do
305       if [ $(( 10#${arr1[$i]} )) -ne $(( 10#${arr2[$i]} )) ]; then
306         ret=1
307         break
308       fi
309     done
310   fi
311
312   IFS=$backIFS
313   return $ret
314 }
315
316 detect_distro() {
317   if [ -f /etc/debian_version ]; then
318     DISTRO="DEB"
319   elif [ -f /etc/redhat-release ]; then
320     DISTRO="RPM"
321   elif [ -f /etc/SuSE-release ]; then
322     DISTRO="SUSE"
323   fi
324 }
325
326 prepare_opt() {
327   INFO "Ensuring $INST exists and is writable by us"
328   if [ ! -d  $INST ]; then
329     sudo mkdir -p $INST
330   fi
331
332   if [ ! -w $INST ]; then
333     sudo chown $USER $INST
334     sudo chmod 775 $INST
335   fi
336 }
337
338 # Check whether the current package needs to be recompiled, based on a dummy file containing a magic number in its name...
339 magic_compile_check() {
340   if [ -f $INST/.$1-magiccheck-$2 ]; then
341     return 0
342   else
343     return 1
344   fi
345 }
346
347 magic_compile_set() {
348   rm -f $INST/.$1-magiccheck-*
349   touch $INST/.$1-magiccheck-$2
350 }
351
352 compile_Python() {
353   # To be changed each time we make edits that would modify the compiled result!
354   py_magic=0
355
356   _src=$SRC/Python-$PYTHON_VERSION
357   _inst=$INST/python-$PYTHON_VERSION
358
359   # Clean install if needed!
360   magic_compile_check python-$PYTHON_VERSION $py_magic
361   if [ $? -eq 1 -o $PYTHON_FORCE_REBUILD == true ]; then
362     rm -rf $_inst
363   fi
364
365   if [ ! -d $_inst ]; then
366     INFO "Building Python-$PYTHON_VERSION"
367
368     prepare_opt
369
370     if [ ! -d $_src ]; then
371       mkdir -p $SRC
372       wget -c $PYTHON_SOURCE -O $_src.tar.bz2
373
374       INFO "Unpacking Python-$PYTHON_VERSION"
375       tar -C $SRC -xf $_src.tar.bz2
376     fi
377
378     cd $_src
379
380     ./configure --prefix=$_inst --enable-ipv6 \
381         --enable-loadable-sqlite-extensions --with-dbmliborder=bdb \
382         --with-computed-gotos --with-pymalloc
383
384     make -j$THREADS && make install
385     make clean
386
387     if [ -d $_inst ]; then
388       rm -f $INST/python-3.3
389       ln -s python-$PYTHON_VERSION $INST/python-3.3
390     else
391       ERROR "Python--$PYTHON_VERSION failed to compile, exiting"
392       exit 1
393     fi
394
395     magic_compile_set python-$PYTHON_VERSION $py_magic
396
397     cd $CWD
398     INFO "Done compiling Python-$PYTHON_VERSION!"
399   else
400     INFO "Own Python-$PYTHON_VERSION is up to date, nothing to do!"
401     INFO "If you want to force rebuild of this lib, use the --force-python option."
402   fi
403 }
404
405 compile_Boost() {
406   # To be changed each time we make edits that would modify the compiled result!
407   boost_magic=7
408
409   _src=$SRC/boost-$BOOST_VERSION
410   _inst=$INST/boost-$BOOST_VERSION
411
412   # Clean install if needed!
413   magic_compile_check boost-$BOOST_VERSION $boost_magic
414   if [ $? -eq 1 -o $BOOST_FORCE_REBUILD == true ]; then
415     rm -rf $_inst
416   fi
417
418   if [ ! -d $_inst ]; then
419     INFO "Building Boost-$BOOST_VERSION"
420
421     prepare_opt
422
423     if [ ! -d $_src ]; then
424       INFO "Downloading Boost-$BOOST_VERSION"
425       mkdir -p $SRC
426       wget -c $BOOST_SOURCE -O $_src.tar.bz2
427       tar -C $SRC --transform "s,(.*/?)boost_1_[^/]+(.*),\1boost-$BOOST_VERSION\2,x" -xf $_src.tar.bz2
428     fi
429
430     cd $_src
431     if [ ! -f $_src/b2 ]; then
432       ./bootstrap.sh
433     fi
434     ./b2 -j$THREADS -a --with-system --with-filesystem --with-thread --with-regex --with-locale --with-date_time \
435          --prefix=$_inst --disable-icu boost.locale.icu=off install
436     ./b2 --clean
437
438     if [ -d $_inst ]; then
439       rm -f $INST/boost
440       ln -s boost-$BOOST_VERSION $INST/boost
441     else
442       ERROR "Boost-$BOOST_VERSION failed to compile, exiting"
443       exit 1
444     fi
445
446     magic_compile_set boost-$BOOST_VERSION $boost_magic
447
448     # Rebuild dependecies as well!
449     OIIO_FORCE_REBUILD=true
450     OSL_FORCE_REBUILD=true
451
452     cd $CWD
453     INFO "Done compiling Boost-$BOOST_VERSION!"
454   else
455     INFO "Own Boost-$BOOST_VERSION is up to date, nothing to do!"
456     INFO "If you want to force rebuild of this lib, use the --force-boost option."
457   fi
458 }
459
460 compile_OCIO() {
461   # To be changed each time we make edits that would modify the compiled result!
462   ocio_magic=1
463
464   _src=$SRC/OpenColorIO-$OCIO_VERSION
465   _inst=$INST/ocio-$OCIO_VERSION
466
467   # Clean install if needed!
468   magic_compile_check ocio-$OCIO_VERSION $ocio_magic
469   if [ $? -eq 1 -o $OCIO_FORCE_REBUILD == true ]; then
470     rm -rf $_inst
471   fi
472
473   if [ ! -d $_inst ]; then
474     INFO "Building OpenColorIO-$OCIO_VERSION"
475
476     prepare_opt
477
478     if [ ! -d $_src ]; then
479       INFO "Downloading OpenColorIO-$OCIO_VERSION"
480       mkdir -p $SRC
481       wget -c $OCIO_SOURCE -O $_src.tar.gz
482
483       INFO "Unpacking OpenColorIO-$OCIO_VERSION"
484       tar -C $SRC --transform "s,(.*/?)imageworks-OpenColorIO[^/]*(.*),\1OpenColorIO-$OCIO_VERSION\2,x" \
485           -xf $_src.tar.gz
486     fi
487
488     cd $_src
489     # Always refresh the whole build!
490     if [ -d build ]; then
491       rm -rf build
492     fi    
493     mkdir build
494     cd build
495
496     if file /bin/cp | grep -q '32-bit'; then
497       cflags="-fPIC -m32 -march=i686"
498     else
499       cflags="-fPIC"
500     fi
501
502     cmake -D CMAKE_BUILD_TYPE=Release \
503           -D CMAKE_PREFIX_PATH=$_inst \
504           -D CMAKE_INSTALL_PREFIX=$_inst \
505           -D CMAKE_CXX_FLAGS="$cflags" \
506           -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" \
507           -D OCIO_BUILD_APPS=OFF \
508           -D OCIO_BUILD_PYGLUE=OFF \
509           ..
510
511     make -j$THREADS && make install
512
513     # Force linking against static libs
514     rm -f $_inst/lib/*.so*
515
516     # Additional depencencies
517     cp ext/dist/lib/libtinyxml.a $_inst/lib
518     cp ext/dist/lib/libyaml-cpp.a $_inst/lib
519
520     make clean
521
522     if [ -d $_inst ]; then
523       rm -f $INST/ocio
524       ln -s ocio-$OCIO_VERSION $INST/ocio
525     else
526       ERROR "OpenColorIO-$OCIO_VERSION failed to compile, exiting"
527       exit 1
528     fi
529
530     magic_compile_set ocio-$OCIO_VERSION $ocio_magic
531
532     cd $CWD
533     INFO "Done compiling OpenColorIO-$OCIO_VERSION!"
534   else
535     INFO "Own OpenColorIO-$OCIO_VERSION is up to date, nothing to do!"
536     INFO "If you want to force rebuild of this lib, use the --force-ocio option."
537   fi
538 }
539
540 compile_OIIO() {
541   # To be changed each time we make edits that would modify the compiled result!
542   oiio_magic=6
543
544   _src=$SRC/OpenImageIO-$OIIO_VERSION
545   _inst=$INST/oiio-$OIIO_VERSION
546
547   # Clean install if needed!
548   magic_compile_check oiio-$OIIO_VERSION $oiio_magic
549   if [ $? -eq 1 -o $OIIO_FORCE_REBUILD == true ]; then
550     rm -rf $_inst
551   fi
552
553   if [ ! -d $_inst ]; then
554     INFO "Building OpenImageIO-$OIIO_VERSION"
555
556     prepare_opt
557
558     if [ ! -d $_src ]; then
559       mkdir -p $SRC
560       wget -c $OIIO_SOURCE -O "$_src.tar.gz"
561
562       INFO "Unpacking OpenImageIO-$OIIO_VERSION"
563       tar -C $SRC --transform "s,(.*/?)OpenImageIO-oiio[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" \
564           -xf $_src.tar.gz
565
566       cd $_src
567
568       # XXX Ugly patching hack!
569       cat << EOF | patch -p1
570 diff --git a/src/libutil/SHA1.cpp b/src/libutil/SHA1.cpp
571 index b9e6c8b..c761185 100644
572 --- a/src/libutil/SHA1.cpp
573 +++ b/src/libutil/SHA1.cpp
574 @@ -8,9 +8,9 @@
575  
576  // If compiling with MFC, you might want to add #include "StdAfx.h"
577  
578 +#include "SHA1.h"
579  #include "hash.h"
580  #include "dassert.h"
581 -#include "SHA1.h"
582  
583  #ifdef SHA1_UTILITY_FUNCTIONS
584  #define SHA1_MAX_FILE_BUFFER 8000
585 EOF
586
587       cd $CWD
588
589     fi
590
591     cd $_src
592     # Always refresh the whole build!
593     if [ -d build ]; then
594       rm -rf build
595     fi    
596     mkdir build
597     cd build
598
599     cmake_d="-D CMAKE_BUILD_TYPE=Release"
600     cmake_d="$cmake_d -D CMAKE_PREFIX_PATH=$_inst"
601     cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
602     cmake_d="$cmake_d -D BUILDSTATIC=ON"
603
604     # linking statically could give issues on Debian/Ubuntu (and probably other distros
605     # which doesn't like static linking) when linking shared oiio library due to missing
606     # text symbols (static libs should be compiled with -fPIC)
607     # cmake_d="$cmake_d -D LINKSTATIC=ON"
608
609     if [ -d $INST/boost ]; then
610       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON"
611       if $ALL_STATIC; then
612         cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON"
613       fi
614     fi
615
616     # Looks like we do not need ocio in oiio for now...
617 #    if [ -d $INST/ocio ]; then
618 #      cmake_d="$cmake_d -D OCIO_PATH=$INST/ocio"
619 #    fi
620
621     if file /bin/cp | grep -q '32-bit'; then
622       cflags="-fPIC -m32 -march=i686"
623     else
624       cflags="-fPIC"
625     fi
626
627     cmake $cmake_d -D CMAKE_CXX_FLAGS="$cflags" -D CMAKE_EXE_LINKER_FLAGS="-lgcc_s -lgcc" ../src
628
629     make -j$THREADS && make install
630     make clean
631
632     if [ -d $_inst ]; then
633       rm -f $INST/oiio
634       ln -s oiio-$OIIO_VERSION $INST/oiio
635     else
636       ERROR "OpenImageIO-$OIIO_VERSION failed to compile, exiting"
637       exit 1
638     fi
639
640     magic_compile_set oiio-$OIIO_VERSION $oiio_magic
641
642     # Rebuild dependecies as well!
643     OSL_FORCE_REBUILD=true
644
645     cd $CWD
646     INFO "Done compiling OpenImageIO-$OIIO_VERSION!"
647   else
648     INFO "Own OpenImageIO-$OIIO_VERSION is up to date, nothing to do!"
649     INFO "If you want to force rebuild of this lib, use the --force-oiio option."
650   fi
651 }
652
653 compile_LLVM() {
654   # To be changed each time we make edits that would modify the compiled result!
655   llvm_magic=1
656
657   _src=$SRC/LLVM-$LLVM_VERSION
658   _inst=$INST/llvm-$LLVM_VERSION
659   _src_clang=$SRC/CLANG-$LLVM_VERSION
660
661   # Clean install if needed!
662   magic_compile_check llvm-$LLVM_VERSION $llvm_magic
663   if [ $? -eq 1 -o $LLVM_FORCE_REBUILD == true ]; then
664     rm -rf $_inst
665     rm -rf $_inst_clang
666   fi
667
668   if [ ! -d $_inst ]; then
669     INFO "Building LLVM-$LLVM_VERSION (CLANG included!)"
670
671     prepare_opt
672
673     if [ ! -d $_src -o true ]; then
674       mkdir -p $SRC
675       wget -c $LLVM_SOURCE -O "$_src.tar.gz"
676       wget -c $LLVM_CLANG_SOURCE -O "$_src_clang.tar.gz"
677
678       INFO "Unpacking LLVM-$LLVM_VERSION"
679       tar -C $SRC --transform "s,([^/]*/?)llvm-[^/]*(.*),\1LLVM-$LLVM_VERSION\2,x" \
680           -xf $_src.tar.gz
681       INFO "Unpacking CLANG-$LLVM_VERSION to $_src/tools/clang"
682       tar -C $_src/tools \
683           --transform "s,([^/]*/?)clang-[^/]*(.*),\1clang\2,x" \
684           -xf $_src_clang.tar.gz
685
686       cd $_src
687
688       # XXX Ugly patching hack!
689       cat << EOF | patch -p1
690 --- a/CMakeLists.txt
691 +++ b/CMakeLists.txt
692 @@ -13,7 +13,7 @@
693  set(LLVM_VERSION_MAJOR 3)
694  set(LLVM_VERSION_MINOR 1)
695  
696 -set(PACKAGE_VERSION "\${LLVM_VERSION_MAJOR}.\${LLVM_VERSION_MINOR}svn")
697 +set(PACKAGE_VERSION "\${LLVM_VERSION_MAJOR}.\${LLVM_VERSION_MINOR}")
698  
699  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
700  
701 EOF
702
703       cd $CWD
704
705     fi
706
707     cd $_src
708
709     # Always refresh the whole build!
710     if [ -d build ]; then
711       rm -rf build
712     fi    
713     mkdir build
714     cd build
715
716     cmake_d="-D CMAKE_BUILD_TYPE=Release"
717     cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
718     cmake_d="$cmake_d -D LLVM_ENABLE_FFI=ON"
719
720     if [ -d $_FFI_INCLUDE_DIR ]; then
721       cmake_d="$cmake_d -D FFI_INCLUDE_DIR=$_FFI_INCLUDE_DIR"
722     fi
723
724     cmake $cmake_d ..
725
726     make -j$THREADS && make install
727     make clean
728
729     if [ -d $_inst ]; then
730       rm -f $INST/llvm
731       ln -s llvm-$LLVM_VERSION $INST/llvm
732     else
733       ERROR "LLVM-$LLVM_VERSION failed to compile, exiting"
734       exit 1
735     fi
736
737     magic_compile_set llvm-$LLVM_VERSION $llvm_magic
738
739     # Rebuild dependecies as well!
740     OSL_FORCE_REBUILD=true
741
742     cd $CWD
743     INFO "Done compiling LLVM-$LLVM_VERSION (CLANG included)!"
744   else
745     INFO "Own LLVM-$LLVM_VERSION (CLANG included) is up to date, nothing to do!"
746     INFO "If you want to force rebuild of this lib, use the --force-llvm option."
747   fi
748 }
749
750 compile_OSL() {
751   # To be changed each time we make edits that would modify the compiled result!
752   osl_magic=7
753
754   _src=$SRC/OpenShadingLanguage-$OSL_VERSION
755   _inst=$INST/osl-$OSL_VERSION
756
757   # Clean install if needed!
758   magic_compile_check osl-$OSL_VERSION $osl_magic
759   if [ $? -eq 1 -o $OSL_FORCE_REBUILD == true ]; then
760     rm -rf $_inst
761   fi
762
763   if [ ! -d $_inst ]; then
764     INFO "Building OpenShadingLanguage-$OSL_VERSION"
765
766     prepare_opt
767
768     if [ ! -d $_src ]; then
769       mkdir -p $SRC
770
771       # XXX Using git on my own repo for now, looks like archives are not updated immediately... :/
772 #      wget -c $OSL_SOURCE -O "$_src.tar.gz"
773
774 #      INFO "Unpacking OpenShadingLanguage-$OSL_VERSION"
775 #      tar -C $SRC --transform "s,(.*/?)OpenShadingLanguage-[^/]*(.*),\1OpenShadingLanguage-$OSL_VERSION\2,x" \
776 #          -xf $_src.tar.gz
777       git clone https://github.com/mont29/OpenShadingLanguage.git $_src
778       cd $_src
779       git checkout blender-fixes
780       cd $CWD
781     fi
782
783     cd $_src
784     # XXX For now, always update from latest repo...
785     git pull origin
786
787     # Always refresh the whole build!
788     if [ -d build ]; then
789       rm -rf build
790     fi    
791     mkdir build
792     cd build
793
794     cmake_d="-D CMAKE_BUILD_TYPE=Release"
795     cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
796     cmake_d="$cmake_d -D BUILDSTATIC=ON"
797     cmake_d="$cmake_d -D BUILD_TESTING=OFF"
798
799     if [ -d $INST/boost ]; then
800       cmake_d="$cmake_d -D BOOST_ROOT=$INST/boost -D Boost_NO_SYSTEM_PATHS=ON"
801       if $ALL_STATIC; then
802         cmake_d="$cmake_d -D Boost_USE_STATIC_LIBS=ON"        
803       fi
804     fi
805
806     if [ -d $INST/oiio ]; then
807       cmake_d="$cmake_d -D OPENIMAGEIOHOME=$INST/oiio"
808     fi
809
810     if [ ! -z $LLVM_VERSION_FOUND ]; then
811       cmake_d="$cmake_d -D LLVM_VERSION=$LLVM_VERSION_FOUND"
812       if [ -d $INST/llvm ]; then
813         cmake_d="$cmake_d -D LLVM_DIRECTORY=$INST/llvm"
814         cmake_d="$cmake_d -D LLVM_STATIC=ON"
815       fi
816     fi
817
818     cmake $cmake_d ../src
819
820     make -j$THREADS && make install
821     make clean
822
823     if [ -d $_inst ]; then
824       rm -f $INST/osl
825       ln -s osl-$OSL_VERSION $INST/osl
826     else
827       ERROR "OpenShadingLanguage-$OSL_VERSION failed to compile, exiting"
828       exit 1
829     fi
830
831     magic_compile_set osl-$OSL_VERSION $osl_magic
832
833     cd $CWD
834     INFO "Done compiling OpenShadingLanguage-$OSL_VERSION!"
835   else
836     INFO "Own OpenShadingLanguage-$OSL_VERSION is up to date, nothing to do!"
837     INFO "If you want to force rebuild of this lib, use the --force-osl option."
838   fi
839 }
840
841 compile_FFmpeg() {
842   # To be changed each time we make edits that would modify the compiled result!
843   ffmpeg_magic=3
844
845   _src=$SRC/ffmpeg-$FFMPEG_VERSION
846   _inst=$INST/ffmpeg-$FFMPEG_VERSION
847
848   # Clean install if needed!
849   magic_compile_check ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
850   if [ $? -eq 1 -o $FFMPEG_FORCE_REBUILD == true ]; then
851     rm -rf $_inst
852   fi
853
854   if [ ! -d $_inst ]; then
855     INFO "Building ffmpeg-$FFMPEG_VERSION"
856
857     prepare_opt
858
859     if [ ! -d $_src ]; then
860       INFO "Downloading ffmpeg-$FFMPEG_VERSION"
861       mkdir -p $SRC
862       wget -c $FFMPEG_SOURCE -O "$_src.tar.bz2"
863
864       INFO "Unpacking ffmpeg-$FFMPEG_VERSION"
865       tar -C $SRC -xf $_src.tar.bz2
866     fi
867
868     cd $_src
869
870     extra=""
871
872     if $VORBIS_USE; then
873       extra="$extra --enable-libvorbis"
874     fi
875
876     if $THEORA_USE; then
877       extra="$extra --enable-libtheora"
878     fi
879
880     # XXX At least under Debian, static schro gives problem at blender linking time... :/
881     if $SCHRO_USE && ! $ALL_STATIC; then
882       extra="$extra --enable-libschroedinger"
883     fi
884
885     if $XVID_USE; then
886       extra="$extra --enable-libxvid"
887     fi
888
889     if $X264_USE; then
890       extra="$extra --enable-libx264"
891     fi
892
893     if $VPX_USE; then
894       extra="$extra --enable-libvpx"
895     fi
896
897     if $MP3LAME_USE; then
898       extra="$extra --enable-libmp3lame"
899     fi
900
901     if $OPENJPEG_USE; then
902       extra="$extra --enable-libopenjpeg"
903     fi
904
905     ./configure --cc="gcc -Wl,--as-needed" \
906         --extra-ldflags="-pthread -static-libgcc" \
907         --prefix=$_inst --enable-static \
908         --disable-ffplay --disable-ffserver --disable-doc \
909         --enable-gray \
910         --enable-avfilter --disable-vdpau \
911         --disable-bzlib --disable-libgsm --disable-libspeex \
912         --enable-pthreads --enable-zlib --enable-stripping --enable-runtime-cpudetect \
913         --disable-vaapi  --disable-libfaac --disable-nonfree --enable-gpl \
914         --disable-postproc --disable-x11grab  --disable-librtmp  --disable-libopencore-amrnb \
915         --disable-libopencore-amrwb --disable-libdc1394 --disable-version3  --disable-outdev=sdl \
916         --disable-outdev=alsa --disable-indev=sdl --disable-indev=alsa --disable-indev=jack \
917         --disable-indev=lavfi $extra
918
919     make -j$THREADS && make install
920     make clean
921
922     if [ -d $_inst ]; then
923       rm -f $INST/ffmpeg
924       ln -s ffmpeg-$FFMPEG_VERSION $INST/ffmpeg
925     else
926       ERROR "FFmpeg-$FFMPEG_VERSION failed to compile, exiting"
927       exit 1
928     fi
929
930     magic_compile_set ffmpeg-$FFMPEG_VERSION $ffmpeg_magic
931
932     cd $CWD
933     INFO "Done compiling ffmpeg-$FFMPEG_VERSION!"
934   else
935     INFO "Own ffmpeg-$FFMPEG_VERSION is up to date, nothing to do!"
936     INFO "If you want to force rebuild of this lib, use the --force-ffmpeg option."
937   fi
938 }
939
940 get_package_version_DEB() {
941     dpkg-query -W -f '${Version}' $1 | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'
942 }
943
944 check_package_DEB() {
945   r=`apt-cache policy $1 | grep -c 'Candidate:'`
946
947   if [ $r -ge 1 ]; then
948     return 0
949   else
950     return 1
951   fi
952 }
953
954 check_package_version_match_DEB() {
955   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)(([0-9]+\.?)+).*/\2/'`
956
957   if [ -z "$v" ]; then
958     return 1
959   fi
960
961   version_match $v $2
962   return $?
963 }
964
965 check_package_version_ge_DEB() {
966   v=`apt-cache policy $1 | grep 'Candidate:' | sed -r 's/.*:\s*([0-9]+:)?(([0-9]+\.?)+).*/\2/'`
967
968   if [ -z "$v" ]; then
969     return 1
970   fi
971
972   version_ge $v $2
973   return $?
974 }
975
976 install_DEB() {
977   INFO ""
978   INFO "Installing dependencies for DEB-based distribution"
979   INFO ""
980   INFO "`eval _echo "$COMMON_INFO"`"
981   INFO ""
982
983   if [ ! -z "`cat /etc/debian_version | grep ^6`"  ]; then
984     if [ -z "`cat /etc/apt/sources.list | grep backports.debian.org`"  ]; then
985       INFO "Looks like you're using Debian Squeeze which does have broken CMake"
986       INFO "It is highly recommended to install cmake from backports, otherwise"
987       INFO "compilation of some libraries could fail"
988       INFO ""
989       INFO "You could install newer CMake from debian-backports repository"
990       INFO "Add this this line to your /etc/apt/sources.lixt:"
991       INFO ""
992       INFO "deb http://backports.debian.org/debian-backports squeeze-backports main"
993       INFO ""
994       INFO "and then run:"
995       INFO ""
996       INFO "sudo apt-get update && sudo apt-get install cmake=2.8.7-4~bpo60+1 sudo apt-get install cmake=2.8.7-4~bpo60+1"
997       INFO ""
998       INFO "(you could also add this reporisotry using GUI like synaptic)"
999       INFO ""
1000       INFO "Hit Enter to continue running the script, or hit Ctrl-C to abort the script"
1001
1002       read
1003       INFO ""
1004     fi
1005   fi
1006
1007   sudo apt-get update
1008 # XXX Why in hell? Let's let this stuff to the user's responsability!!!
1009 #  sudo apt-get -y upgrade
1010
1011   # These libs should always be available in debian/ubuntu official repository...
1012   OPENJPEG_DEV="libopenjpeg-dev"
1013   SCHRO_DEV="libschroedinger-dev"
1014   VORBIS_DEV="libvorbis-dev"
1015   THEORA_DEV="libtheora-dev"
1016
1017   INFO ""
1018   sudo apt-get install -y gawk cmake scons gcc g++ libjpeg-dev libpng-dev libtiff-dev \
1019     libfreetype6-dev libx11-dev libxi-dev wget libsqlite3-dev libbz2-dev libncurses5-dev \
1020     libssl-dev liblzma-dev libreadline-dev $OPENJPEG_DEV libopenexr-dev libopenal-dev \
1021     libglew-dev yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libsdl1.2-dev \
1022     libfftw3-dev libjack-dev python-dev patch bzip2
1023
1024   OPENJPEG_USE=true
1025   SCHRO_USE=true
1026   VORBIS_USE=true
1027   THEORA_USE=true
1028
1029   INFO ""
1030   # Grmpf, debian is libxvidcore-dev and ubuntu libxvidcore4-dev!
1031   XVID_DEV="libxvidcore-dev"
1032   check_package_DEB $XVID_DEV
1033   if [ $? -eq 0 ]; then
1034     sudo apt-get install -y $XVID_DEV
1035     XVID_USE=true
1036   else
1037     XVID_DEV="libxvidcore4-dev"
1038     check_package_DEB $XVID_DEV
1039     if [ $? -eq 0 ]; then
1040       sudo apt-get install -y $XVID_DEV
1041       XVID_USE=true
1042     fi
1043   fi
1044
1045   INFO ""
1046   MP3LAME_DEV="libmp3lame-dev"
1047   check_package_DEB $MP3LAME_DEV
1048   if [ $? -eq 0 ]; then
1049     sudo apt-get install -y $MP3LAME_DEV
1050     MP3LAME_USE=true
1051   fi
1052
1053   INFO ""
1054   X264_DEV="libx264-dev"
1055   check_package_version_ge_DEB $X264_DEV $X264_VERSION_MIN
1056   if [ $? -eq 0 ]; then
1057     sudo apt-get install -y $X264_DEV
1058     X264_USE=true
1059   fi
1060
1061   INFO ""
1062   VPX_DEV="libvpx-dev"
1063   check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN
1064   if [ $? -eq 0 ]; then
1065     sudo apt-get install -y $VPX_DEV
1066     VPX_USE=true
1067   fi
1068
1069   INFO ""
1070   check_package_DEB libspnav-dev
1071   if [ $? -eq 0 ]; then
1072     sudo apt-get install -y libspnav-dev
1073   fi
1074
1075   INFO ""
1076   check_package_DEB python3.3-dev
1077   if [ $? -eq 0 ]; then
1078     sudo apt-get install -y python3.3-dev
1079   else
1080     compile_Python
1081   fi
1082
1083   INFO ""
1084   check_package_version_ge_DEB libboost-dev $BOOST_VERSION_MIN
1085   if [ $? -eq 0 ]; then
1086     sudo apt-get install -y libboost-dev
1087
1088     boost_version=$(echo `get_package_version_DEB libboost-dev` | sed -r 's/^([0-9]+\.[0-9]+).*/\1/')
1089
1090     check_package_DEB libboost-locale$boost_version-dev
1091     if [ $? -eq 0 ]; then
1092       sudo apt-get install -y libboost-locale$boost_version-dev libboost-filesystem$boost_version-dev \
1093                               libboost-regex$boost_version-dev libboost-system$boost_version-dev \
1094                               libboost-thread$boost_version-dev
1095     else
1096       compile_Boost
1097     fi
1098   else
1099     compile_Boost
1100   fi
1101
1102   INFO ""
1103   check_package_version_ge_DEB libopencolorio-dev $OCIO_VERSION_MIN
1104   if [ $? -eq 0 ]; then
1105     sudo apt-get install -y libopencolorio-dev
1106   else
1107     compile_OCIO
1108   fi
1109
1110   INFO ""
1111   check_package_version_ge_DEB libopenimageio-dev $OIIO_VERSION_MIN
1112   if [ $? -eq 0 ]; then
1113     sudo apt-get install -y libopenimageio-dev
1114   else
1115     compile_OIIO
1116   fi
1117
1118   if $BUILD_OSL; then
1119     have_llvm=false
1120
1121     INFO ""
1122     check_package_DEB llvm-$LLVM_VERSION-dev
1123     if [ $? -eq 0 ]; then
1124       sudo apt-get install -y llvm-$LLVM_VERSION-dev
1125       have_llvm=true
1126       LLVM_VERSION_FOUND=$LLVM_VERSION
1127     else
1128       check_package_DEB llvm-$LLVM_VERSION_MIN-dev
1129       if [ $? -eq 0 ]; then
1130         sudo apt-get install -y llvm-$LLVM_VERSION_MIN-dev
1131         have_llvm=true
1132         LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
1133       else
1134         sudo apt-get install -y libffi-dev
1135         INFO ""
1136         compile_LLVM
1137         have_llvm=true
1138         LLVM_VERSION_FOUND=$LLVM_VERSION
1139       fi
1140     fi
1141
1142     if $have_llvm; then
1143       INFO ""
1144       sudo apt-get install -y clang flex bison libtbb-dev git
1145       # No package currently!
1146       INFO ""
1147       compile_OSL
1148     fi
1149   fi
1150
1151 #  XXX Debian features libav packages as ffmpeg, those are not really compatible with blender code currently :/
1152 #      So for now, always build our own ffmpeg.
1153 #  check_package_DEB ffmpeg
1154 #  if [ $? -eq 0 ]; then
1155 #    sudo apt-get install -y ffmpeg
1156 #    ffmpeg_version=`get_package_version_DEB ffmpeg`
1157 #    INFO "ffmpeg version: $ffmpeg_version"
1158 #    if [ ! -z "$ffmpeg_version" ]; then
1159 #      if  dpkg --compare-versions $ffmpeg_version gt 0.7.2; then
1160 #        sudo apt-get install -y libavfilter-dev libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev libswscale-dev
1161 #      else
1162 #        compile_FFmpeg
1163 #      fi
1164 #    fi
1165 #  fi
1166   INFO ""
1167   compile_FFmpeg
1168 }
1169
1170 get_package_version_RPM() {
1171   yum info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
1172 }
1173
1174 check_package_RPM() {
1175   r=`yum info $1 | grep -c 'Summary'`
1176
1177   if [ $r -ge 1 ]; then
1178     return 0
1179   else
1180     return 1
1181   fi
1182 }
1183
1184 check_package_version_match_RPM() {
1185   v=`get_package_version_RPM $1`
1186
1187   if [ -z "$v" ]; then
1188     return 1
1189   fi
1190
1191   version_match $v $2
1192   return $?
1193 }
1194
1195 check_package_version_ge_RPM() {
1196   v=`get_package_version_RPM $1`
1197
1198   if [ -z "$v" ]; then
1199     return 1
1200   fi
1201
1202   version_ge $v $2
1203   return $?
1204 }
1205
1206 install_RPM() {
1207   INFO ""
1208   INFO "Installing dependencies for RPM-based distribution"
1209   INFO ""
1210   INFO "`eval _echo "$COMMON_INFO"`"
1211   INFO ""
1212
1213   sudo yum -y update
1214
1215   # These libs should always be available in debian/ubuntu official repository...
1216   OPENJPEG_DEV="openjpeg-devel"
1217   SCHRO_DEV="schroedinger-devel"
1218   VORBIS_DEV="libvorbis-devel"
1219   THEORA_DEV="libtheora-devel"
1220
1221   INFO ""
1222   sudo yum -y install gawk gcc gcc-c++ cmake scons libpng-devel libtiff-devel \
1223     freetype-devel libX11-devel libXi-devel wget libsqlite3x-devel ncurses-devel \
1224     readline-devel $OPENJPEG_DEV openexr-devel openal-soft-devel \
1225     glew-devel yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV SDL-devel \
1226     fftw-devel lame-libs jack-audio-connection-kit-devel libspnav-devel \
1227     libjpeg-devel patch python-devel
1228
1229   OPENJPEG_USE=true
1230   SCHRO_USE=true
1231   VORBIS_USE=true
1232   THEORA_USE=true
1233
1234   INFO ""
1235   X264_DEV="x264-devel"
1236   check_package_version_ge_RPM $X264_DEV $X264_VERSION_MIN
1237   if [ $? -eq 0 ]; then
1238     sudo yum install -y $X264_DEV
1239     X264_USE=true
1240   fi
1241
1242   INFO ""
1243   XVID_DEV="xvidcore-devel"
1244   check_package_RPM $XVID_DEV
1245   if [ $? -eq 0 ]; then
1246     sudo yum install -y $XVID_DEV
1247     XVID_USE=true
1248   fi
1249
1250   INFO ""
1251   VPX_DEV="libvpx-devel"
1252   check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN
1253   if [ $? -eq 0 ]; then
1254     sudo yum install -y $VPX_DEV
1255     VPX_USE=true
1256   fi
1257
1258   INFO ""
1259   MP3LAME_DEV="lame-devel"
1260   check_package_RPM $MP3LAME_DEV
1261   if [ $? -eq 0 ]; then
1262     sudo yum install -y $MP3LAME_DEV
1263     MP3LAME_USE=true
1264   fi
1265
1266   INFO ""
1267   check_package_version_match_RPM python3-devel $PYTHON_VERSION_MIN
1268   if [ $? -eq 0 ]; then
1269     sudo yum install -y python3-devel
1270   else
1271     compile_Python
1272   fi
1273
1274   INFO ""
1275   check_package_version_ge_RPM boost-devel $BOOST_VERSION_MIN
1276   if [ $? -eq 0 ]; then
1277     sudo yum install -y boost-devel
1278   else
1279     compile_Boost
1280   fi
1281
1282   INFO ""
1283   check_package_version_ge_RPM OpenColorIO-devel $OCIO_VERSION_MIN
1284   if [ $? -eq 0 ]; then
1285     sudo yum install -y OpenColorIO-devel
1286   else
1287     compile_OCIO
1288   fi
1289
1290   INFO ""
1291   check_package_version_ge_RPM OpenImageIO-devel $OIIO_VERSION_MIN
1292   if [ $? -eq 0 ]; then
1293     sudo yum install -y OpenImageIO-devel
1294   else
1295     compile_OIIO
1296   fi
1297
1298   if $BUILD_OSL; then
1299     have_llvm=false
1300
1301     INFO ""
1302     check_package_RPM llvm-$LLVM_VERSION-devel
1303     if [ $? -eq 0 ]; then
1304       sudo yum install -y llvm-$LLVM_VERSION-devel
1305       have_llvm=true
1306       LLVM_VERSION_FOUND=$LLVM_VERSION
1307     else
1308 #      check_package_RPM llvm-$LLVM_VERSION_MIN-devel
1309 #      if [ $? -eq 0 ]; then
1310 #        sudo yum install -y llvm-$LLVM_VERSION_MIN-devel
1311 #        have_llvm=true
1312 #        LLVM_VERSION_FOUND=$LLVM_VERSION_MIN
1313 #      else
1314 #        check_package_version_ge_RPM llvm-devel $LLVM_VERSION_MIN
1315 #        if [ $? -eq 0 ]; then
1316 #          sudo yum install -y llvm-devel
1317 #          have_llvm=true
1318 #          LLVM_VERSION_FOUND=`get_package_version_RPM llvm-devel`
1319 #        fi
1320 #      fi
1321     sudo yum install -y libffi-devel
1322     # XXX Stupid fedora puts ffi header into a darn stupid dir!
1323     _FFI_INCLUDE_DIR=`rpm -ql libffi-devel | grep -e ".*/ffi.h" | sed -r 's/(.*)\/ffi.h/\1/'`
1324     INFO ""
1325     compile_LLVM
1326     have_llvm=true
1327     LLVM_VERSION_FOUND=$LLVM_VERSION
1328     fi
1329
1330     if $have_llvm; then
1331       INFO ""
1332       sudo yum install -y flex bison clang tbb-devel git
1333       # No package currently!
1334       INFO ""
1335       compile_OSL
1336     fi
1337   fi
1338
1339   # Always for now, not sure which packages should be installed
1340   INFO ""
1341   compile_FFmpeg
1342 }
1343
1344 get_package_version_SUSE() {
1345   zypper info $1 | grep Version | tail -n 1 | sed -r 's/.*:\s+(([0-9]+\.?)+).*/\1/'
1346 }
1347
1348 check_package_SUSE() {
1349   r=`zypper info $1 | grep -c 'Summary'`
1350
1351   if [ $r -ge 1 ]; then
1352     return 0
1353   else
1354     return 1
1355   fi
1356 }
1357
1358 check_package_version_match_SUSE() {
1359   v=`get_package_version_SUSE $1`
1360
1361   if [ -z "$v" ]; then
1362     return 1
1363   fi
1364
1365   version_match $v $2
1366   return $?
1367 }
1368
1369 check_package_version_ge_SUSE() {
1370   v=`get_package_version_SUSE $1`
1371
1372   if [ -z "$v" ]; then
1373     return 1
1374   fi
1375
1376   version_ge $v $2
1377   return $?
1378 }
1379
1380 install_SUSE() {
1381   INFO ""
1382   INFO "Installing dependencies for SuSE-based distribution"
1383   INFO ""
1384   INFO "`eval _echo "$COMMON_INFO"`"
1385   INFO ""
1386
1387   sudo zypper --non-interactive update --auto-agree-with-licenses
1388
1389   # These libs should always be available in debian/ubuntu official repository...
1390   OPENJPEG_DEV="openjpeg-devel"
1391   SCHRO_DEV="schroedinger-devel"
1392   VORBIS_DEV="libvorbis-devel"
1393   THEORA_DEV="libtheora-devel"
1394
1395   INFO ""
1396   sudo zypper --non-interactive install --auto-agree-with-licenses \
1397     gawk gcc gcc-c++ cmake scons libpng12-devel libtiff-devel \
1398     freetype-devel libX11-devel libXi-devel wget sqlite3-devel ncurses-devel \
1399     readline-devel $OPENJPEG_DEV libopenexr-devel openal-soft-devel \
1400     glew-devel yasm $SCHRO_DEV $THEORA_DEV $VORBIS_DEV libSDL-devel \
1401     fftw3-devel libjack-devel libspnav-devel \
1402     libjpeg62-devel patch python-devel
1403
1404   OPENJPEG_USE=true
1405   SCHRO_USE=true
1406   VORBIS_USE=true
1407   THEORA_USE=true
1408
1409   INFO ""
1410   X264_DEV="x264-devel"
1411   check_package_version_ge_SUSE $X264_DEV $X264_VERSION_MIN
1412   if [ $? -eq 0 ]; then
1413     sudo zypper --non-interactive install --auto-agree-with-licenses $X264_DEV
1414     X264_USE=true
1415   fi
1416
1417   INFO ""
1418   XVID_DEV="xvidcore-devel"
1419   check_package_SUSE $XVID_DEV
1420   if [ $? -eq 0 ]; then
1421     sudo zypper --non-interactive install --auto-agree-with-licenses $XVID_DEV
1422     XVID_USE=true
1423   fi
1424
1425   INFO ""
1426   VPX_DEV="libvpx-devel"
1427   check_package_version_ge_SUSE $VPX_DEV $VPX_VERSION_MIN
1428   if [ $? -eq 0 ]; then
1429     sudo zypper --non-interactive install --auto-agree-with-licenses $VPX_DEV
1430     VPX_USE=true
1431   fi
1432
1433   INFO ""
1434   # No mp3 in suse, it seems.
1435   MP3LAME_DEV="lame-devel"
1436   check_package_SUSE $MP3LAME_DEV
1437   if [ $? -eq 0 ]; then
1438     sudo zypper --non-interactive install --auto-agree-with-licenses $MP3LAME_DEV
1439     MP3LAME_USE=true
1440   fi
1441
1442   INFO ""
1443   check_package_version_match_SUSE python3-devel 3.3.
1444   if [ $? -eq 0 ]; then
1445     sudo zypper --non-interactive install --auto-agree-with-licenses python3-devel
1446   else
1447     compile_Python
1448   fi
1449
1450   INFO ""
1451   # No boost_locale currently available, so let's build own boost.
1452   compile_Boost
1453
1454   INFO ""
1455   # No ocio currently available, so let's build own boost.
1456   compile_OCIO
1457
1458   INFO ""
1459   # No oiio currently available, so let's build own boost.
1460   compile_OIIO
1461
1462   if $BUILD_OSL; then
1463     have_llvm=false
1464
1465     INFO ""
1466     # Suse llvm package *_$SUCKS$_* (tm) !!!
1467 #    check_package_version_ge_SUSE llvm-devel $LLVM_VERSION_MIN
1468 #    if [ $? -eq 0 ]; then
1469 #      sudo zypper --non-interactive install --auto-agree-with-licenses llvm-devel
1470 #      have_llvm=true
1471 #      LLVM_VERSION_FOUND=`get_package_version_SUSE llvm-devel`
1472 #    fi
1473
1474     sudo zypper --non-interactive install --auto-agree-with-licenses libffi47-devel
1475     INFO ""
1476     compile_LLVM
1477     have_llvm=true
1478     LLVM_VERSION_FOUND=$LLVM_VERSION
1479
1480     if $have_llvm; then
1481       INFO ""
1482       # XXX No tbb lib!
1483       sudo zypper --non-interactive install --auto-agree-with-licenses flex bison git
1484       # No package currently!
1485       INFO ""
1486       compile_OSL
1487     fi
1488   fi
1489
1490   # No ffmpeg currently available, so let's build own boost.
1491   INFO ""
1492   compile_FFmpeg
1493 }
1494
1495 print_info_ffmpeglink_DEB() {
1496   if $ALL_STATIC; then
1497     dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }'
1498   else
1499     dpkg -L $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1500   fi
1501 }
1502
1503 print_info_ffmpeglink_RPM() {
1504   if $ALL_STATIC; then
1505     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }'
1506   else
1507     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1508   fi
1509 }
1510
1511 print_info_ffmpeglink_SUSE() {
1512   if $ALL_STATIC; then
1513     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.a" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", $0); nlines++ }'
1514   else
1515     rpm -ql $_packages | grep -e ".*\/lib[^\/]\+\.so" | gawk '{ printf(nlines ? "'"$_ffmpeg_list_sep"'%s" : "%s", gensub(/.*lib([^\/]+)\.so/, "\\1", "g", $0)); nlines++ }'
1516   fi
1517 }
1518
1519 print_info_ffmpeglink() {
1520   # This func must only print a ';'-separated list of libs...
1521   if [ -z "$DISTRO" ]; then
1522     ERROR "Failed to detect distribution type"
1523     exit 1
1524   fi
1525
1526   # Create list of packages from which to get libs names...
1527   _packages=""
1528
1529   if $THEORA_USE; then
1530     _packages="$_packages $THEORA_DEV"
1531   fi
1532
1533   if $VORBIS_USE; then
1534     _packages="$_packages $VORBIS_DEV"
1535   fi
1536
1537   if $XVID_USE; then
1538     _packages="$_packages $XVID_DEV"
1539   fi
1540
1541   if $VPX_USE; then
1542     _packages="$_packages $VPX_DEV"
1543   fi
1544
1545   if $MP3LAME_USE; then
1546     _packages="$_packages $MP3LAME_DEV"
1547   fi
1548
1549   if $X264_USE; then
1550     _packages="$_packages $X264_DEV"
1551   fi
1552
1553   if $OPENJPEG_USE; then
1554     _packages="$_packages $OPENJPEG_DEV"
1555   fi
1556
1557   # XXX At least under Debian, static schro give problem at blender linking time... :/
1558   if $SCHRO_USE && ! $ALL_STATIC; then
1559     _packages="$_packages $SCHRO_DEV"
1560   fi
1561
1562   if [ "$DISTRO" = "DEB" ]; then
1563     print_info_ffmpeglink_DEB
1564   elif [ "$DISTRO" = "RPM" ]; then
1565     print_info_ffmpeglink_RPM
1566   elif [ "$DISTRO" = "SUSE" ]; then
1567     print_info_ffmpeglink_SUSE
1568   # XXX TODO!
1569   else INFO "<Could not determine additional link libraries needed for ffmpeg, replace this by valid list of libs...>"
1570   fi
1571 }
1572
1573 print_info() {
1574   INFO ""
1575   INFO "If you're using CMake add this to your configuration flags:"
1576
1577   if $ALL_STATIC; then
1578     INFO "  -D WITH_STATIC_LIBS=ON"
1579   fi
1580
1581   if [ -d $INST/boost ]; then
1582     INFO "  -D BOOST_ROOT=$INST/boost"
1583     INFO "  -D Boost_NO_SYSTEM_PATHS=ON"
1584   elif $ALL_STATIC; then
1585     INFO "  -D Boost_USE_ICU=ON"
1586   fi
1587
1588   if [ -d $INST/osl -a $BUILD_OSL == true ]; then
1589     INFO "  -D CYCLES_OSL=$INST/osl"
1590     INFO "  -D WITH_CYCLES_OSL=ON"
1591     INFO "  -D LLVM_VERSION=$LLVM_VERSION_FOUND"
1592     if [ -d $INST/llvm ]; then
1593       INFO "  -D LLVM_DIRECTORY=$INST/llvm"
1594       INFO "  -D LLVM_STATIC=ON"
1595     fi
1596   fi
1597
1598   if [ -d $INST/ffmpeg ]; then
1599     INFO "  -D WITH_CODEC_FFMPEG=ON"
1600     INFO "  -D FFMPEG=$INST/ffmpeg"
1601     INFO "  -D FFMPEG_LIBRARIES='avformat;avcodec;avutil;avdevice;swscale;rt;`print_info_ffmpeglink`'"
1602   fi
1603
1604   INFO ""
1605   INFO "If you're using SCons add this to your user-config:"
1606
1607   if [ -d $INST/python-3.3 ]; then
1608     INFO "BF_PYTHON = '$INST/python-3.3'"
1609     INFO "BF_PYTHON_ABI_FLAGS = 'm'"
1610   fi
1611
1612   if [ -d $INST/ocio ]; then
1613     INFO "BF_OCIO = '$INST/ocio'"
1614   fi
1615
1616   if [ -d $INST/oiio ]; then
1617     INFO "BF_OIIO = '$INST/oiio'"
1618   fi
1619
1620   if [ -d $INST/boost ]; then
1621     INFO "BF_BOOST = '$INST/boost'"
1622   fi
1623
1624   if [ -d $INST/ffmpeg ]; then
1625     INFO "BF_FFMPEG = '$INST/ffmpeg'"
1626     _ffmpeg_list_sep=" "
1627     INFO "BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice `print_info_ffmpeglink`'"
1628   fi
1629
1630   INFO ""
1631   INFO ""
1632   INFO "WARNING: If this script had to build boost into $INST, and you are dynamically linking "
1633   INFO "         blender against it, you will have to run those commands as root user:"
1634   INFO ""
1635   INFO "    echo \"$INST/boost/lib\" > /etc/ld.so.conf.d/boost.conf"
1636   INFO "    ldconfig"
1637   INFO ""
1638 }
1639
1640 # Detect distributive type used on this machine
1641 detect_distro
1642
1643 if [ -z "$DISTRO" ]; then
1644   ERROR "Failed to detect distribution type"
1645   exit 1
1646 elif [ "$DISTRO" = "DEB" ]; then
1647   install_DEB
1648 elif [ "$DISTRO" = "RPM" ]; then
1649   install_RPM
1650 elif [ "$DISTRO" = "SUSE" ]; then
1651   install_SUSE
1652 fi
1653
1654 print_info
1655
1656 # Switch back to user language.
1657 LANG=LANG_BACK
1658 export LANG