#!/bin/bash # # Copyright (c) Microsoft. All rights reserved. # # Licensed under the MIT license. See LICENSE.md file in the project root # for full license information. # ============================================================================== # configure=$0 build_top=$PWD cuda_path= cuda_check=include/cuda.h enable_cuda= enable_python= enable_java= enable_csharp= # cntk build version # Modify both of the following during major release default_build_version="2.6" default_build_public="no" build_version=$default_build_version build_public=$default_build_public # MKLML Version mklml_version=mklml_lnx_2018.0.3.20180406 have_mkl=no mkl_path= mkl_check=include/mkl_version.h # Experimental OpenBLAS support. have_openblas=no openblas_path= openblas_check=include/openblas_config.h # Boost library boost_path= boost_check=include/boost/test/unit_test.hpp # Protocol buffers library protobuf_path= protobuf_check=lib/libprotobuf.a # MPI library mpi_path= mpi_check=include/mpi.h # Halide library halide_path= halide_check=include/Halide.h # Cuda-aware MPI # OPENMPI can auto-detect but not MVAPICH2 cuda_gdr=no default_cuda_gdr=$cuda_gdr have_kaldi=no kaldi_path= kaldi_check=src/kaldi.mk have_buildtype=no buildtype= default_buildtype=release have_gdk_include=no gdk_include_path= gdk_include_check=nvml.h have_gdk_nvml_lib=no gdk_nvml_lib_path= gdk_nvml_lib_check=libnvidia-ml.so 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 have_swig=no swig_path= swig_check=bin/swig swig_required_version=3.0.10 py_check=bin/python py_versions= declare -A py_paths jdk_check=include/jni.h default_jdk="jvm/java-8-openjdk-amd64" mathlib= have_mpi=yes default_use_mpi=$have_mpi # NCCL communication library have_nccl=$have_mpi nccl_path= nccl_check=include/nccl.h default_use_code_coverage=no enable_code_coverage=$default_use_code_coverage default_use_asgd=yes enable_asgd=$default_use_asgd # List from best to worst choice default_path_list="/usr /usr/local /opt /opt/local /lib /usr/lib" # List from best to worst choice default_mkls="mklml/$mklml_version" default_openblas="" default_boost="boost-1.60.0" default_cudas="cuda-10.0" default_nccls="nccl" default_kaldis="kaldi-trunk kaldi-c024e8aa" default_gdk_includes="include/nvidia/gdk cuda/include" default_gdk_nvml_libs="src/gdk/nvml/lib cuda/lib64/stubs" default_cubs="cub-1.8.0" default_cudnns="cudnn-7.3" default_opencvs="opencv-3.1.0 opencv-3.0.0" default_protobuf="protobuf-3.6.1" default_libzips="libzip-1.1.2" default_swig="swig-3.0.10" default_mpi="mpi" default_halide="halide" 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_mkl () { find_dir "$default_mkls" "$mkl_check" } function find_openblas () { find_dir "$default_openblas" "$openblas_check" } function find_boost () { find_dir "$default_boost" "$boost_check" } function find_protobuf () { find_dir "$default_protobuf" "$protobuf_check" } function find_nccl () { find_dir "$default_nccls" "$nccl_check" } function find_cuda () { find_dir "$default_cudas" "$cuda_check" } function find_kaldi () { find_dir "$default_kaldis" "$kaldi_check" } function find_gdk_include () { find_dir "$default_gdk_includes" "$gdk_include_check" } function find_gdk_nvml_lib () { find_dir "$default_gdk_nvml_libs" "$gdk_nvml_lib_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 find_mpi () { find_dir "$default_mpi" "$mpi_check" } function find_halide () { find_dir "$default_halide" "$halide_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 check_version () { local expected_version=$1 local actual_version=$2 [ -z "$actual_version" ] && return 1 [ "$( printf "%s\n" $actual_version $expected_version | sort -V | head -1)" = "$expected_version" ] return $? } function default_use_cuda () { if test x$(find_cuda) = x || test x$(find_gdk_include) = x || test x$(find_gdk_nvml_lib) = x || test x$(find_cudnn) = x || test x$(find_cub) = x then echo no else echo yes fi } enable_cuda=$(default_use_cuda) # TODO allow to pick up from path? function check_swig () { local swig_dir="$1" local swig_bin="$swig_dir/$swig_check" # Check that binary is executable and we can retrieve the version test -x "$swig_bin" || return $? "$swig_bin" -version 2>&1 1>/dev/null || return $? local actual_version=$("$swig_bin" -version | grep '^SWIG Version ' | head -1 | grep -o '[0-9.]*') if check_version "$swig_required_version" "$actual_version" then echo "$swig_dir" return 0 else return 1 fi } function find_swig () { check_swig "$(find_dir "$default_swig" "$swig_check")" } function check_python () { # Required version: exact match against major and minor version local required_version="$1" local py_dir="$2" local py_bin="$py_dir/$py_check" [ -x "$py_bin" ] || return 1 local py_version=$("$py_bin" -c "import sys; sys.stdout.write('{0}{1}'.format(sys.version_info.major,sys.version_info.minor))") [ "$?" = "0" ] && [ -x "$py_bin" ] && [ "$py_version" = "$required_version" ] && { echo $py_dir return 0 } return 1 } # TODO allow to pick up from path? function find_python () { local required_version="$1" local py_dir=$(find_dir "" "$py_check") check_python "$required_version" "$py_dir" } function default_use_python () { # Keeping it default "no" for a little while: # if test x$(find_swig) = x || test x$(find_python 27)$(find_python 34)$(find_python 35)$(find_python 36) = x # then echo no # else # echo yes # fi } enable_python=$(default_use_python) function default_python_with_deps () { if [[ $default_build_public == "yes" ]]; then echo yes else if [[ -z "$PYTHON_WITH_DEPS" ]]; then echo no else echo $PYTHON_WITH_DEPS fi fi } python_with_deps=$(default_python_with_deps) function find_jdk () { echo $(find_dir $default_jdk "$jdk_check") } function default_use_java () { jdk_path=$(find_jdk) if test x$jdk_path = x then echo no else echo yes fi } enable_java=$(default_use_java) function default_use_csharp() { if [[ `command -v dotnet` && `command -v swig` && `command -v cmake` ]] then echo yes else echo no fi } enable_csharp=$(default_use_csharp) 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-buildtype=(debug|release) $(show_default $default_buildtype)" echo " --with-build-top=directory build directory $(show_default $build_top)" echo " --add directory add directory to library search path" echo " --asgd[=(yes|no)] use ASGD powered by Multiverso $(show_default ${default_use_asgd})" echo " --cuda[=(yes|no)] use cuda GPU $(show_default $(default_use_cuda))" echo " --python[=(yes|no)] with Python bindings $(show_default $(default_use_python))" echo " --java[=(yes|no)] with Java bindings $(show_default $(default_use_java))" echo " --with-jdk[=directory] $(show_default $(find_jdk))" echo " --csharp[=(yes|no)] with C# bindings $(show_default $(default_use_csharp))" echo " --mpi[=(yes|no)] use MPI communication $(show_default ${default_use_mpi})" echo " --gdr[=(yes|no)] use GPUDirect RDMA $(show_default ${default_cuda_gdr})" echo " --with-cuda[=directory] $(show_default $(find_cuda))" echo " --with-cub[=directory] $(show_default $(find_cub))" echo " --with-gdk-include[=directory] $(show_default $(find_gdk_include))" echo " --with-gdk-nvml-lib[=directory] $(show_default $(find_gdk_nvml_lib))" echo " --with-cudnn[=directory] $(show_default $(find_cudnn))" echo " --with-nccl[=directory] $(show_default $(find_nccl))" echo " --with-mkl[=directory] $(show_default $(find_mkl))" echo " --with-mkl-sequential[=directory] $(show_default $(find_mkl))" echo " --with-openblas[=directory] (experimental) $(show_default $(find_openblas))" 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 " --with-boost[=directory] $(show_default $(find_boost))" echo " --with-protobuf[=directory] $(show_default $(find_protobuf))" echo " --with-py-versions=(space-separated list of 27, 35, 36)" echo " --with-py27-path[=directory] $(show_default $(find_python 27))" echo " --with-py34-path[=directory] $(show_default $(find_python 34))" echo " --with-py35-path[=directory] $(show_default $(find_python 35))" echo " --with-py36-path[=directory] $(show_default $(find_python 36))" echo " --with-swig[=directory] $(show_default $(find_swig))" echo " --with-mpi[=directory] $(show_default $(find_mpi))" echo " --with-halide[=directory] $(show_default $(find_halide))" echo " --with-build-version=[version] $default_build_version" echo " --with-deps[=(yes|no)] include third party libs in the wheel packages (MKL, CUDA and OpenCV) $(show_default $(default_python_with_deps))" 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" ;; --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 ;; --asgd*) if test x$optarg = xyes || test x$optarg = xno then enable_asgd=$optarg else echo "Invalid value for --asgd $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 ;; --python*) if test x$optarg = xyes || test x$optarg = xno then enable_python=$optarg else echo "Invalid value for --python $optarg" show_help exit fi ;; --with-py-versions*) enable_python=yes if test "x$optarg" = "x" then echo "Mandatory parameter for --with-py-versions missing. Use '--python no' to disable Python support completely." show_help exit 1 else for ver in $optarg do case $ver in 27 | 34 | 35 | 36) ;; *) echo "Invalid value for --with-py-versions $optarg: invalid version $ver" show_help exit esac done # TODO filter duplicates? py_versions="$optarg" fi ;; --with-py27-path*|--with-py34-path*|--with-py35-path*|--with-py36-path*) enable_python=yes py_version=${key:9:2} if test x$optarg = x then py_paths[$py_version]=$(find_python $py_version) if test x${py_paths[$py_version]} = x then echo "Cannot find Python $py_version directory." echo "Please specify a value for $key" exit 1 fi else if check_python $py_version "$optarg" then py_paths[$py_version]=$optarg else echo "Invalid Python $py_version directory $optarg" exit 1 fi fi ;; --with-swig*) have_swig=yes if test x$optarg = x then swig_path=$(find_swig) if test x$swig_path = x then echo "Cannot find SWIG directory." echo "Please specify a value for --with-swig" exit 1 fi else if check_swig "$optarg" then swig_path=$optarg else echo "Invalid SWIG directory $optarg" exit 1 fi fi ;; --java*) if test x$optarg = xyes || test x$optarg = xno then enable_java=$optarg else echo "Invalid value for --java $optarg" show_help exit fi ;; --with-jdk*) enable_java=yes if test x$optarg = x then jdk_path=$(find_jdk) if test x$jdk_path = x then echo "Cannot find JDK directory." echo "Please specify a value for --with-jdk" exit 1 fi else if test $(check_dir $optarg $jdk_check) = yes then jdk_path=$optarg else echo "Invalid JDK directory $optarg" exit 1 fi fi ;; --csharp*) if test x$optarg = xyes || test x$optarg = xno then enable_csharp=$optarg else echo "Invalid value for --csharp $optarg" show_help exit fi ;; --mpi*) if test x$optarg = xyes || test x$optarg = xno then have_mpi=$optarg have_nccl=$have_mpi if test $have_nccl = no then nccl_path= fi else echo "Invalid value for --mpi $optarg" show_help exit fi ;; --gdr*) if test x$optarg = xyes || test x$optarg = xno then cuda_gdr=$optarg else echo "Invalid value for --gdr $optarg" show_help exit fi ;; --with-cuda*) 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.8.0.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-include*) have_gdk_include=yes if test x$optarg = x then gdk_include_path=$(find_gdk_include) if test x$gdk_include_path = x then echo "Cannot find GDK include directory." echo "Please specify a value for --with-gdk-include" exit 1 fi else if test $(check_dir $optarg $gdk_include_check) = yes then gdk_include_path=$optarg else echo "Invalid GDK include directory $optarg" exit 1 fi fi ;; --with-gdk-nvml-lib*) have_gdk_nvml_lib=yes if test x$optarg = x then gdk_nvml_lib_path=$(find_gdk_nvml_lib) if test x$gdk_nvml_lib_path = x then echo "Cannot find GDK NVML library directory." echo "Please specify a value for --with-gdk-nvml-lib" exit 1 fi else if test $(check_dir $optarg $gdk_nvml_lib_check) = yes then gdk_nvml_lib_path=$optarg else echo "Invalid GDK NVML library 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-nccl*) have_nccl=$have_mpi if test $have_nccl = yes then if test x$optarg = x then nccl_path=$(find_nccl) if test x$nccl_path = x then echo "Cannot find NCCL directory." echo "Please specify a value for --with-nccl" echo "NCCL can be downloaded from https://github.com/NVIDIA/nccl" exit 1 fi else if test $(check_dir $optarg $nccl_check) = yes then nccl_path=$optarg else echo "Invalid NCCL directory $optarg" exit 1 fi fi else echo "--with-nccl cannot be used with --mpi=no" exit 1 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 MKLML directory (version $mklml_version)" 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 MKLML 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-boost*) if test x$optarg = x then boost_path=$(find_boost) if test x$boost_path = x then echo "Cannot find Boost directory" echo "Please specify a value for --with-boost" exit 1 fi else if test $(check_dir $optarg $boost_check) = yes then boost_path=$optarg else echo "Invalid Boost directory $optarg" exit 1 fi fi ;; --with-protobuf*) if test x$optarg = x then protobuf_path=$(find_protobuf) if test x$protobuf_path = x then echo "Cannot find Protocol Buffers directory" echo "Please specify a value for --with-protobuf" exit 1 fi else if test $(check_dir $optarg $protobuf_check) = yes then protobuf_path=$optarg else echo "Invalid Protocol Buffers 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 ;; --with-mpi*) if test x$optarg = x then mpi_path=$(find_mpi) if test x$mpi_path = x then echo "Cannot find mpi directory." exit 1 fi else if test $(check_dir $optarg $mpi_check) = yes then mpi_path=$optarg else echo "Invalid mpi directory $optarg" exit 1 fi fi ;; --with-halide*) if test x$optarg = x then halide_path=$(find_halide) if test x$halide_path = x then echo "Cannot find halide directory." exit 1 fi else if test $(check_dir $optarg $halide_check) = yes then halide_path=$optarg else echo "Invalid halide directory $optarg" exit 1 fi fi ;; --with-build-version*) if test "x$optarg" != "x" then build_version=$optarg build_public="yes" fi ;; --with-deps*) if test x$optarg = xyes || test x$optarg = xno then if test x$optarg = xyes then python_with_deps=$optarg fi else echo "Invalid value for --with-deps $optarg" show_help exit 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 mkl if test x$have_mkl = xno && test x$have_openblas = xno then mkl_path=$(find_mkl) if test x$mkl_path = x then echo "Cannot find a CPU math library." echo "Please specify --with-mkl, --with-openblas with a path." exit 1 else mathlib=mkl 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_include_path = x then gdk_include_path=$(find_gdk_include) if test x$gdk_include_path = x ; then echo Cannot locate a GDK include directory echo GPU will be disabled enable_cuda=no else echo Found GDK include at $gdk_include_path fi fi if test $enable_cuda = yes && test x$gdk_nvml_lib_path = x then gdk_nvml_lib_path=$(find_gdk_nvml_lib) if test x$gdk_nvml_lib_path = x ; then echo Cannot locate a GDK NVML library directory echo GPU will be disabled enable_cuda=no else echo Found GDK NVML library at $gdk_nvml_lib_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.8.0.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 $enable_java = yes || test $enable_python = yes || test $enable_csharp = yes ) && test x$swig_path = x then swig_path=$(find_swig) if test x$swig_path = x then echo 'Cannot locate SWIG (>= 3.0.10), which is required for Python/Java/C# support.' echo Please see https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#optional-swig echo for installation instructions. exit 1 fi fi if test $enable_python = yes then # TODO disabled for now. Default Python versions may miss dependencies we do not # check for here yet, only support explicitly specified paths. # Fill unfilled default paths #[ -z "${py_paths[27]}" ] && find_python 27 && py_paths[27]=$(find_python 27) #[ -z "${py_paths[34]}" ] && find_python 34 && py_paths[34]=$(find_python 34) #[ -z "${py_paths[35]}" ] && find_python 35 && py_paths[35]=$(find_python 35) # Unless there's a specified order or restriction, take all configured Python versions (old to new) [ -z "$py_versions" ] && py_versions=${!py_paths[@]} py_versions="$py_versions " # Make sure each requested version is configured, remove other parts for ver in 27 34 35 36 do case $py_versions in *$ver\ *) # Build for version is requested, check if configured if [ -z "${py_paths[$ver]}" ] then echo Build for Python version $ver was requested, but is not configured. exit 1 fi ;; *) # Build for version is not requested, unconfigure unset -v py_paths[$ver] ;; esac done fi if test $enable_cuda = yes && test $have_nccl = yes && test x$nccl_path = x then nccl_path=$(find_nccl) if test x$nccl_path != x; then echo Found NCCL at $nccl_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 if test x$boost_path = x then boost_path=$(find_boost) if test x$boost_path = x then echo Cannot locate Boost libraries. See echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#boost-library echo for installation instructions. exit 1 else echo Found Boost at $boost_path fi fi if test x$protobuf_path = x then protobuf_path=$(find_protobuf) if test x$protobuf_path = x then echo Cannot locate Protocol Buffers library. See echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#protobuf echo for installation instructions. exit 1 else echo Found Protocol Buffers at $protobuf_path fi fi if test x$halide_path = x then halide_path=$(find_halide) if test x${halide_path} = x then echo Cannot locate optional Halide library. else echo Found Halide at $halide_path fi fi if test x$mpi_path = x && test $have_mpi = yes then mpi_path=$(find_mpi) if test x${mpi_path} = x then echo Cannot locate MPI library. See echo https://docs.microsoft.com/en-us/cognitive-toolkit/Setup-CNTK-on-Linux#open-mpi echo for installation instructions. exit 1 else echo Found MPI at $mpi_path fi fi config=$build_top/Config.make echo Generating $config echo "#Configuration file for cntk" > $config echo BUILDTYPE=$buildtype >> $config echo BUILD_VERSION=$build_version >> $config echo BUILD_PUBLIC=$build_public >> $config echo MATHLIB=$mathlib >> $config case $mathlib in mkl) echo MKL_PATH=$mkl_path >> $config echo MKL_THREADING=$mkl_threading >> $config ;; openblas) echo OPENBLAS_PATH=$openblas_path >> $config ;; esac if test $have_mpi = yes ; then echo HAS_MPI=1 >> $config else echo HAS_MPI=0 >> $config fi if test $cuda_gdr = yes ; then echo CUDA_GDR=1 >> $config else echo CUDA_GDR=0 >> $config fi if test $enable_cuda = yes ; then echo CUDA_PATH=$cuda_path >> $config echo GDK_INCLUDE_PATH=$gdk_include_path >> $config echo GDK_NVML_LIB_PATH=$gdk_nvml_lib_path >> $config echo CUB_PATH=$cub_path >> $config echo CUDNN_PATH=$cudnn_path >> $config [ -z "$nccl_path" ] || echo NCCL_PATH=$nccl_path >> $config fi if test $enable_python = yes || test $enable_java = yes || test $enable_csharp = yes; then echo SWIG_PATH=$swig_path/bin >> $config fi if test $enable_python = yes ; then echo PYTHON_SUPPORT=true >> $config # N.B. PYTHON_VERSIONS at least needs to be parseable by bash (cf. Tools/generate_build_info) echo PYTHON_VERSIONS= >> $config for ver in $py_versions do echo PYTHON_VERSIONS+=$ver >> $config echo PYTHON${ver}_PATH=${py_paths[$ver]}/$py_check >> $config done fi if test $enable_java = yes ; then if test x${jdk_path} = x ; then jdk_path=$(find_jdk) fi if test x${jdk_path} = x then echo Cannot locate JDK. exit 1 else echo Found JDK at $jdk_path echo JAVA_SUPPORT=true >> $config echo JDK_PATH=$jdk_path >> $config fi fi if test $enable_csharp = yes ; then echo CSHARP_SUPPORT=true >> $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_code_coverage = yes ; then echo CNTK_CODE_COVERAGE=true >> $config fi if test x$boost_path != x; then echo BOOST_PATH=$boost_path >> $config fi if test x$protobuf_path != x; then echo PROTOBUF_PATH=$protobuf_path >> $config fi if test x$mpi_path != x; then echo MPI_PATH=$mpi_path >> $config fi if test x$halide_path != x; then echo HALIDE_PATH=$halide_path >> $config fi if test $enable_asgd = yes ; then echo CNTK_ENABLE_ASGD=true >> $config fi if test $python_with_deps = yes ; then echo PYTHON_WITH_DEPS=1 >> $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 $(nproc) all' echo to build # vim:set expandtab tabstop=4 shiftwidth=4: