Revision e1467a79dc6580ae009d827b5e6f274faff3b339 authored by liqunfu on 27 March 2020, 21:42 UTC, committed by GitHub on 27 March 2020, 21:42 UTC
2 parents c7bc93f + a2055f6
Raw File
configure
#!/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.1.0"
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:
back to top