#!/bin/bash configure=$0 build_top=$PWD have_cuda=no cuda_path= cuda_check=include/cuda.h enable_cuda= have_acml=no acml_path= acml_check=include/acml.h have_mkl=no mkl_path= mkl_check=mkl/include/mkl.h # Experimental OpenBLAS support. have_openblas=no openblas_path= openblas_check=include/openblas_config.h have_kaldi=no kaldi_path= kaldi_check=src/kaldi.mk have_buildtype=no buildtype= default_buildtype=release have_gdk=no gdk_path= gdk_check=include/nvidia/gdk/nvml.h have_cub=no cub_path= cub_check=cub/cub.cuh have_cudnn=no cudnn_path= cudnn_check=cuda/include/cudnn.h have_opencv=no opencv_path= opencv_check=include/opencv2/opencv.hpp have_libzip=no libzip_path= libzip_check=include/zip.h mathlib= default_use_1bitsgd=no enable_1bitsgd=$default_use_1bitsgd default_use_code_coverage=no enable_code_coverage=$default_use_code_coverage # List from best to worst choice default_path_list="/usr /usr/local /opt /opt/local /opt/intel" # List from best to worst choice default_acmls="acml5.3.1/ifort64_mp" default_mkls="" default_openblas="" # NOTE: Will get compilation errors with cuda-6.0 default_cudas="cuda-7.5 cuda-7.0 cuda-6.5" default_kaldis="kaldi-trunk kaldi-c024e8aa" default_gdks=". gdk/usr" default_cubs="cub-1.4.1" default_cudnns="cudnn-4.0" default_opencvs="opencv-3.0.0" default_libzips="libzip-1.1.2" function default_paths () { echo $build_top $HOME $default_path_list } # $1 is directory # $2 is file that must be present function check_dir () { if test -e $1/$2 then echo yes else echo no fi } # $1 is the list of tails to search, ordered by preference # $2 is some file that must exist in $1 function find_dir () { # Loop over list of tails to search, including empty (just default_path + search file) for tail in $1 '' do for head in $(default_paths) do [ -n "$tail" ] && search_path="$head/$tail" || search_path=$head if test x$(check_dir "$search_path" $2) = xyes then echo $search_path return 0 fi done done } function find_acml () { find_dir "$default_acmls" "$acml_check" } function find_mkl () { find_dir "$default_mkls" "$mkl_check" } function find_openblas () { find_dir "$default_openblas" "$openblas_check" } function find_cuda () { find_dir "$default_cudas" "$cuda_check" } function find_kaldi () { find_dir "$default_kaldis" "$kaldi_check" } function find_gdk () { find_dir "$default_gdks" "$gdk_check" } function find_cub () { find_dir "$default_cubs" "$cub_check" } function find_cudnn () { find_dir "$default_cudnns" "$cudnn_check" } function find_opencv () { find_dir "$default_opencvs" "$opencv_check" } function find_libzip () { find_dir "$default_libzips" "$libzip_check" } function is_hardlinked () { r=no if test -e $1 && test -e $2 then r=yes [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no fi echo $r } function default_use_cuda () { if test x$(find_cuda) = x || test x$(find_gdk) = x then echo no else echo yes fi } enable_cuda=$(default_use_cuda) function show_default () { if test x$1 = x then echo "(no default)" else echo "(default $1)" fi } function show_help () { echo "Usage: configure [options]" echo "Options:" echo " -h|--help this help" echo " --with-build-top=directory build directory $(show_default $build_top)" echo " --add directory add directory to library search path" echo " --1bitsgd[=(yes|no)] use 1Bit SGD $(show_default ${default_use_1bitsgd})" echo " --cuda[=(yes|no)] use cuda GPU $(show_default $(default_use_cuda))" echo " --with-cuda[=directory] $(show_default $(find_cuda))" echo " --with-cub[=directory] $(show_default $(find_cub))" echo " --with-gdk[=directory] $(show_default $(find_gdk))" echo " --with-cudnn[=directory] $(show_default $(find_cudnn))" echo " --with-acml[=directory] $(show_default $(find_acml))" echo " --with-mkl[=directory] $(show_default $(find_mkl))" echo " --with-openblas[=directory] (experimental) $(show_default $(find_openblas))" echo " --with-buildtype=(debug|release) $(show_default $default_buildtype)" echo " --with-kaldi[=directory] $(show_default $(find_kaldi))" echo " --with-opencv[=directory] $(show_default $(find_opencv))" echo " --with-libzip[=directory] $(show_default $(find_libzip))" echo " --with-code-coverage[=(yes|no)] $(show_default ${default_use_code_coverage})" echo "Libraries search path:" for head in $(default_paths) do echo " $head" done } while [[ $# > 0 ]] do key="$1" case $key in *=?*) optarg=`expr "X$key" : '[^=]*=\(.*\)'` ;; *=) optarg= ;; *) optarg= ;; esac case $key in -h|--help) show_help exit 1 ;; --with-build-top*) if test x$optarg != x then build_top=$optarg mkdir -p $build_top fi ;; --add*) if test x$optarg = x then shift ; optarg=$1 fi default_path_list="$optarg $default_path_list" ;; --1bitsgd*) if test x$optarg = xyes || test x$optarg = xno then enable_1bitsgd=$optarg else echo "Invalid value for --1bitsgd $optarg" show_help exit fi ;; --with-code-coverage*) if test x$optarg = xyes || test x$optarg = xno then enable_code_coverage=$optarg else echo "Invalid value for --with-code-coverage $optarg" show_help exit fi ;; --cuda*) if test x$optarg = xyes || test x$optarg = xno then enable_cuda=$optarg else echo "Invalid value for --cuda $optarg" show_help exit fi ;; --with-cuda*) have_cuda=yes enable_cuda=yes if test x$optarg = x then cuda_path=$(find_cuda) if test x$cuda_path = x then echo "Cannot find cuda directory." echo "Please specify a value for --with-cuda" exit 1 fi else if test $(check_dir $optarg $cuda_check) = yes then cuda_path=$optarg else echo "Invalid cuda directory $optarg" exit 1 fi fi ;; --with-cub*) have_cub=yes if test x$optarg = x then cub_path=$(find_cub) if test x$cub_path = x then echo "Cannot find NVIDIA CUB directory." echo "Please specify a value for --with-cub" echo "NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local" exit 1 fi else if test $(check_dir $optarg $cub_check) = yes then cub_path=$optarg else echo "Invalid CUB directory $optarg" exit 1 fi fi ;; --with-gdk*) have_gdk=yes if test x$optarg = x then gdk_path=$(find_gdk) if test x$gdk_path = x then echo "Cannot find gdk directory." echo "Please specify a value for --with-gdk" exit 1 fi else if test $(check_dir $optarg $gdk_check) = yes then gdk_path=$optarg else echo "Invalid gdk directory $optarg" exit 1 fi fi ;; --with-cudnn*) have_cudnn=yes if test x$optarg = x then cudnn_path=$(find_cudnn) if test x$cudnn_path = x then echo "Cannot find NVIDIA cuDNN directory." echo "Please specify a value for --with-cudnn" exit 1 fi else if test $(check_dir $optarg $cudnn_check) = yes then cudnn_path=$optarg else echo "Invalid cuDNN directory $optarg" exit 1 fi fi ;; --with-acml*) have_acml=yes mathlib=acml if test x$optarg = x then acml_path=$(find_acml) if test x$acml_path = x then echo "Cannot find acml directory" echo "Please specify a value for --with-acml" exit 1 fi else if test $(check_dir $optarg $acml_check) = yes then acml_path=$optarg else echo "Invalid acml directory $optarg" exit 1 fi fi ;; --with-mkl*) have_mkl=yes mathlib=mkl if test x$optarg = x then mkl_path=$(find_mkl) if test x$mkl_path = x then echo "Cannot find mkl directory" echo "Please specify a value for --with-mkl" exit 1 fi else if test $(check_dir $optarg $mkl_check) = yes then mkl_path=$optarg else echo "Invalid mkl directory $optarg" exit 1 fi fi ;; --with-openblas*) have_openblas=yes mathlib=openblas if test x$optarg = x then openblas_path=$(find_openblas) if test x$openblas_path = x then echo "Cannot find openblas directory" echo "Please specify a value for --with-openblas" exit 1 fi else if test $(check_dir $optarg $openblas_check) = yes then openblas_path=$optarg else echo "Invalid openblas directory $optarg" exit 1 fi fi ;; --with-buildtype*) have_buildtype=yes case $optarg in debug|release) buildtype=$optarg ;; *) echo Invalid buildtype $optarg echo Must be debug or release exit 1 esac ;; --with-kaldi*) have_kaldi=yes if test x$optarg = x then kaldi_path=$(find_kaldi) if test x$kaldi_path = x then echo "Cannot find kaldi directory" echo "Please specify a value for --with-kaldi" exit 1 fi else if test $(check_dir $optarg $kaldi_check) then kaldi_path=$optarg else echo "Invalid kaldi directory $optarg" exit 1 fi fi ;; --with-opencv*) have_opencv=yes if test x$optarg = x then opencv_path=$(find_opencv) if test x$opencv_path = x then echo "Cannot find OpenCV directory." echo "Please specify a value for --with-opencv" echo "OpenCV can be downloaded from http://opencv.org/downloads.html, install instructions http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html#linux-installation" exit 1 fi else if test $(check_dir $optarg $opencv_check) = yes then opencv_path=$optarg else echo "Invalid OpenCV directory $optarg" exit 1 fi fi ;; --with-libzip*) have_libzip=yes if test x$optarg = x then libzip_path=$(find_libzip) if test x$libzip_path = x then echo "Cannot find libzip directory." echo "Please specify a value for --with-libzip" echo "libzip (v.1.1.2 or higher) can be downloaded from http://www.nih.at/libzip/" exit 1 fi else if test $(check_dir $optarg $$libzip_check) = yes then libzip_path=$optarg else echo "Invalid libzip directory $optarg" exit 1 fi fi ;; *) echo Invalid option $key show_help exit 1 esac shift done if test x$buildtype = x then buildtype=$default_buildtype echo Defaulting to --with-buildtype=release fi # If no math library was specified, search for acml and then mkl if test x$have_acml = xno && test x$have_mkl = xno && test x$have_openblas = xno then acml_path=$(find_acml) if test x$acml_path = x then mkl_path=$(find_mkl) if test x$mkl_path = x then echo "Cannot find a CPU math library." echo "Please specify --with-acml, --with-mkl, --with-openblas with a path." exit 1 else mathlib=mkl fi else mathlib=acml fi fi # If no cuda library specified, search for one if test x$enable_cuda = xyes && test x$cuda_path = x then cuda_path=$(find_cuda) if test x$cuda_path = x ; then echo Cannot locate a cuda directory echo GPU will be disabled enable_cuda=no else echo Found cuda at $cuda_path fi fi if test $enable_cuda = yes && test x$gdk_path = x then gdk_path=$(find_gdk) if test x$gdk_path = x ; then echo Cannot locate a gdk directory echo GPU will be disabled enable_cuda=no else echo Found gdk at $gdk_path fi fi if test $enable_cuda = yes && test x$cub_path = x then cub_path=$(find_cub) if test x$cub_path = x ; then echo Cannot locate NVIDIA CUB directory echo GPU will be disabled echo NVIDIA CUB can be downloaded from https://github.com/NVlabs/cub/archive/1.4.1.zip, extract the archive to /usr/local enable_cuda=no else echo Found CUB at $cub_path fi fi if test $enable_cuda = yes && test x$cudnn_path = x then cudnn_path=$(find_cudnn) if test x$cudnn_path = x ; then echo Cannot locate NVIDIA cuDNN directory echo CNTK will use default convolution engine. else echo Found cuDNN at $cudnn_path fi fi if test x$opencv_path = x then opencv_path=$(find_opencv) if test x$opencv_path = x ; then echo Cannot locate OpenCV 3.0.0 directory echo ImageReader will NOT be built. else echo Found OpenCV at $opencv_path fi fi if test x$libzip_path = x then libzip_path=$(find_libzip) if test x$libzip_path = x ; then echo Cannot locate libzip files echo ImageReader will be built without zip container support. else echo Found libzip at $libzip_path fi fi if test x$kaldi_path = x then kaldi_path=$(find_kaldi) if test x$kaldi_path = x ; then echo Cannot locate Kaldi files echo Kaldi2Reader will NOT be built. else echo Found Kaldi at $kaldi_path fi fi config=$build_top/Config.make echo Generating $config echo "#Configuration file for cntk" > $config echo BUILDTYPE=$buildtype >> $config echo MATHLIB=$mathlib >> $config case $mathlib in acml) echo ACML_PATH=$acml_path >> $config ;; mkl) echo MKL_PATH=$mkl_path >> $config ;; openblas) echo OPENBLAS_PATH=$openblas_path >> $config ;; esac if test $enable_cuda = yes ; then echo CUDA_PATH=$cuda_path >> $config echo GDK_PATH=$gdk_path >> $config echo CUB_PATH=$cub_path >> $config echo CUDNN_PATH=$cudnn_path >> $config fi if test x$kaldi_path != x ; then echo KALDI_PATH=$kaldi_path >> $config fi if test x$opencv_path != x ; then echo OPENCV_PATH=$opencv_path >> $config fi if test x$libzip_path != x ; then echo LIBZIP_PATH=$libzip_path >> $config fi if test $enable_1bitsgd = yes ; then echo CNTK_ENABLE_1BitSGD=true >> $config fi if test $enable_code_coverage = yes ; then echo CNTK_CODE_COVERAGE=true >> $config fi # If we are not in the configure directory, generate a trampoline Makefile makefile=$build_top/Makefile if test $(is_hardlinked "$configure" "$build_top/configure") = no then echo Generating $makefile realconf=`readlink -f $configure` dir=`dirname $realconf` echo "#Generate Makefile" > $makefile echo dir=$dir >> $makefile echo BUILD_TOP=$build_top >> $makefile echo >> $makefile echo all clean : >> $makefile printf '\t$(MAKE) -C $(dir) BUILD_TOP=$(BUILD_TOP) $@\n' >> $makefile fi echo run echo '>make -j all' echo to build