|  | @echo off | 
|  | setlocal | 
|  | :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | 
|  | :::: This script setup directories, dependencies for MXNET :::: | 
|  | :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: | 
|  |  | 
|  |  | 
|  | :::: Customizable variables :::: | 
|  |  | 
|  |  | 
|  | :: conda environment name for MXNET, default to MXNET-vcversion | 
|  | REM  set MXNET_CONDA_ENV=mxnet | 
|  |  | 
|  | :: which to find MKL, default to openblas installed by conda | 
|  | :: mkl: download from https://software.intel.com/intel-mkl, install and set following two variables | 
|  | REM  set INTEL_MKL_DIR=D:\\Intel\\SWTools\\compilers_and_libraries\\windows\\mkl\\ | 
|  |  | 
|  | :: where to find cudnn library | 
|  | REM  set CUDNN_ROOT=D:\NVIDIA\CUDNN\v5.1\ | 
|  |  | 
|  | ::::  End of customization  :::: | 
|  |  | 
|  |  | 
|  | set ECHO_PREFIX=+++++++ | 
|  |  | 
|  | set MXNET_SETUP_HAS_CUDA=0 | 
|  | set MXNET_SETUP_HAS_CUDNN=0 | 
|  | :::: validate msvc version  :::: | 
|  |  | 
|  | if "%VisualStudioVersion%" == "" ( | 
|  | if not "%VS140COMNTOOLS%" == "" ( call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) | 
|  | REM  Not Supported yet due to dependencies | 
|  | REM  if not "%VS120COMNTOOLS%" == "" ( call "%VS120COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) | 
|  | REM  if not "%VS110COMNTOOLS%" == "" ( call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) | 
|  | REM  if not "%VS100COMNTOOLS%" == "" ( call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x64 && goto :VS_SETUP) | 
|  | REM  if not "%VS90COMNTOOLS%"  == "" ( call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat"  x64 && goto :VS_SETUP) | 
|  | ) | 
|  | :VS_SETUP | 
|  |  | 
|  | if "%VisualStudioVersion%" == "" ( | 
|  | echo %ECHO_PREFIX% Can not find environment variable VisualStudioVersion, msvc is not setup porperly | 
|  | echo %ECHO_PREFIX% Please Install Visual Studio from: | 
|  | echo %ECHO_PREFIX% https://go.microsoft.com/fwlink/?LinkId=691978&clcid=0x409 | 
|  | goto :FAIL | 
|  | ) | 
|  |  | 
|  | set MXNET_VS_VERSION=%VisualStudioVersion:.0=% | 
|  |  | 
|  | if "%PreferredToolArchitecture%" == "x64" ( | 
|  | if "%CommandPromptType%" == "Cross" ( | 
|  | if "%Platform%" == "ARM" set MXNET_VS_PLATFORM=amd64_arm | 
|  | if "%Platform%" == "X86" set MXNET_VS_PLATFORM=amd64_x86 | 
|  | ) | 
|  | ) else ( | 
|  | if "%CommandPromptType%" == "Cross" ( | 
|  | if "%Platform%" == "ARM" set MXNET_VS_PLATFORM=x86_arm | 
|  | if "%Platform%" == "x64" set MXNET_VS_PLATFORM=x86_amd64 | 
|  | ) | 
|  | if "%CommandPromptType%" == "Native" ( | 
|  | if "%Platform%" == "X64" set MXNET_VS_PLATFORM=x64 | 
|  | ) | 
|  | if "%Platform%"   == ""    set MXNET_VS_PLATFORM=x86 | 
|  | ) | 
|  |  | 
|  | if     "%MXNET_VS_PLATFORM%" == "x86"                       set MXNET_VS_TARGET=x86 | 
|  | if not "%MXNET_VS_PLATFORM%" == "%MXNET_VS_PLATFORM:_x86=%" set MXNET_VS_TARGET=x86 | 
|  | if not "%MXNET_VS_PLATFORM%" == "%MXNET_VS_PLATFORM:_arm=%" set MXNET_VS_TARGET=arm | 
|  | if     "%MXNET_VS_TARGET%"   == ""                          set MXNET_VS_TARGET=x64 | 
|  |  | 
|  | ::::    Setup directories   :::: | 
|  |  | 
|  | set MXNET_DISTRO=%~dp0. | 
|  | set MXNET_DISTRO=%MXNET_DISTRO%\.. | 
|  | if "%MXNET_INSTALL_DIR%" == "" set MXNET_INSTALL_DIR=%MXNET_DISTRO%\build | 
|  |  | 
|  | echo %ECHO_PREFIX% MXNET will be installed under %MXNET_INSTALL_DIR%, vs%MXNET_VS_VERSION% %MXNET_VS_PLATFORM% | 
|  |  | 
|  | ::::   Setup dependencies   :::: | 
|  |  | 
|  | :: has blas/lapack? | 
|  | if exist %INTEL_MKL_DIR% set MXNET_BLAS=MKL | 
|  | if "%MXNET_BLAS%" == "" set MXNET_BLAS=Open | 
|  |  | 
|  | :: has cuda? | 
|  | for /f "delims=" %%i in ('where nvcc') do ( | 
|  | set NVCC_CMD=%%i | 
|  | goto :AFTER_NVCC | 
|  | ) | 
|  | :AFTER_NVCC | 
|  | if not "%NVCC_CMD%" == "" set MXNET_SETUP_HAS_CUDA=1 | 
|  |  | 
|  | :: has cudnn | 
|  | if exist %CUDNN_ROOT% set MXNET_SETUP_HAS_CUDNN=1 | 
|  |  | 
|  | :: has conda? | 
|  | for /f "delims=" %%i in ('where conda') do ( | 
|  | set CONDA_CMD=%%i | 
|  | goto :AFTER_CONDA | 
|  | ) | 
|  | :AFTER_CONDA | 
|  |  | 
|  | if "%CONDA_CMD%" == "" ( | 
|  | echo %ECHO_PREFIX% Can not find conda, some dependencies can not be resolved | 
|  | echo %ECHO_PREFIX% Please install Miniconda with Python 3.5 from here: | 
|  | echo %ECHO_PREFIX% http://conda.pydata.org/miniconda.html | 
|  |  | 
|  | goto :FAIL | 
|  | ) | 
|  |  | 
|  | set MXNET_CONDA_INFO=%TEMP%\check_conda_info_for_MXNET.txt | 
|  | conda info > %MXNET_CONDA_INFO% | 
|  | if "%MXNET_VS_TARGET%" == "x64" set MXNET_CONDA_PLATFORM=win-64 | 
|  | if "%MXNET_VS_TARGET%" == "arm" set MXNET_CONDA_PLATFORM=win-64 | 
|  | if "%MXNET_VS_TARGET%" == "x86" set MXNET_CONDA_PLATFORM=win-32 | 
|  |  | 
|  | findstr "%MXNET_CONDA_PLATFORM%" "%MXNET_CONDA_INFO%" >nul | 
|  | if errorlevel 1 ( | 
|  | echo %ECHO_PREFIX% %MXNET_VS_TARGET% MXNET requires %MXNET_CONDA_PLATFORM% conda, installation will continue without conda | 
|  | goto :NO_CONDA | 
|  | ) | 
|  |  | 
|  | if %MXNET_VS_VERSION% GEQ 14 ( set CONDA_VS_VERSION=14&& goto :CONDA_SETUP ) | 
|  | if %MXNET_VS_VERSION% GEQ 10 ( set CONDA_VS_VERSION=10&& goto :CONDA_SETUP ) | 
|  | set CONDA_VS_VERSION=9 | 
|  |  | 
|  | :CONDA_SETUP | 
|  |  | 
|  | if "%MXNET_CONDA_ENV%" == "" set MXNET_CONDA_ENV=mxnet-vc%CONDA_VS_VERSION% | 
|  |  | 
|  | echo %ECHO_PREFIX% Createing conda environment '%MXNET_CONDA_ENV%' for MXNET dependencies | 
|  | conda create -n %MXNET_CONDA_ENV% -c conda-forge vc=%CONDA_VS_VERSION% --yes | 
|  |  | 
|  | set CONDA_DIR=%CONDA_CMD:\Scripts\conda.exe=% | 
|  | set MXNET_CONDA_LIBRARY=%CONDA_DIR%\envs\%MXNET_CONDA_ENV%\Library | 
|  | set MXNET_CONDA_LIBRARY=%MXNET_CONDA_LIBRARY:\=\\% | 
|  | set PATH=%MXNET_CONDA_LIBRARY:\\=\%\bin;%PATH%; | 
|  | set NEW_PATH=%CONDA_DIR%\Scripts;%MXNET_CONDA_LIBRARY%\bin;%NEW_PATH% | 
|  |  | 
|  | set MXNET_CONDA_PKGS=%TEMP%\check_conda_packages_for_MXNET.txt | 
|  | conda list -n %MXNET_CONDA_ENV% > %MXNET_CONDA_PKGS% | 
|  |  | 
|  | :: has cmake? | 
|  | for /f "delims=" %%i in ('where cmake') do ( | 
|  | set CMAKE_CMD=%%i | 
|  | goto :AFTER_CMAKE | 
|  | ) | 
|  | if "%CMAKE_CMD%" == "" ( | 
|  | echo %ECHO_PREFIX% Installing cmake by conda | 
|  | conda install -n %MXNET_CONDA_ENV% -c conda-forge cmake --yes | 
|  | ) | 
|  | :AFTER_CMAKE | 
|  |  | 
|  | :: has patch? | 
|  | for /f "delims=" %%i in ('where patch') do ( | 
|  | set PATCH_CMD=%%i | 
|  | goto :AFTER_PATCH | 
|  | ) | 
|  | if "%PATCH_CMD%" == "" ( | 
|  | echo %ECHO_PREFIX% Installing patch by conda | 
|  | conda install -n %MXNET_CONDA_ENV% patch --yes | 
|  | ) | 
|  | :AFTER_PATCH | 
|  |  | 
|  | :: need openblas? | 
|  | if "%MXNET_BLAS%" == "Open" goto :CONDA_INSTALL_OPENBLAS | 
|  | goto :AFTER_OPENBLAS | 
|  |  | 
|  | :CONDA_INSTALL_OPENBLAS | 
|  | findstr "openblas" "%MXNET_CONDA_PKGS%" >nul | 
|  | if errorlevel 1 ( | 
|  | echo %ECHO_PREFIX% Installing openblas by conda | 
|  | if "%MXNET_VS_TARGET%" == "x64" conda install -n %MXNET_CONDA_ENV% -c ukoethe openblas --yes || goto :Fail | 
|  | CALL :PATCH_OPENBLAS | 
|  | ) | 
|  |  | 
|  | if "%MXNET_VS_TARGET%" == "x64" ( | 
|  | if "%OpenBLAS_INCLUDE_DIR%" == "" set OpenBLAS_INCLUDE_DIR=%MXNET_CONDA_LIBRARY%\\include\\ | 
|  | if "%OpenBLAS_LIB%" == "" set OpenBLAS_LIB=%MXNET_CONDA_LIBRARY%\\lib\\libopenblas.lib | 
|  | ) | 
|  | :AFTER_OPENBLAS | 
|  |  | 
|  | if "%MXNET_BLAS%" == "MKL" goto:CONDA_INSTALL_MKL | 
|  | goto :AFTER_MKL | 
|  |  | 
|  | :CONDA_INSTALL_MKL | 
|  | if "%MKL_INCLUDE_DIR%" == "" set MKL_INCLUDE_DIR=%INTEL_MKL_DIR%\\include\\ | 
|  | if "%MKL_LIB%" == "" set MKL_LIB=%INTEL_MKL_DIR%\\lib\\ | 
|  | :AFTER_MKL | 
|  |  | 
|  | :: other dependencies | 
|  | findstr "opencv" "%MXNET_CONDA_PKGS%" >nul | 
|  | if errorlevel 1 set MXNET_DEPENDENCIES=%MXNET_DEPENDENCIES% opencv | 
|  | findstr "numpy" "%MXNET_CONDA_PKGS%" >nul | 
|  | if errorlevel 1 set MXNET_DEPENDENCIES=%MXNET_DEPENDENCIES% numpy | 
|  | findstr "cython" "%MXNET_CONDA_PKGS%" >nul | 
|  | if errorlevel 1 set MXNET_DEPENDENCIES=%MXNET_DEPENDENCIES% cython | 
|  | findstr "numpy" "%MXNET_CONDA_PKGS%" >nul | 
|  | if errorlevel 1 set MXNET_DEPENDENCIES=%MXNET_DEPENDENCIES% numpy | 
|  |  | 
|  | if not "%MXNET_DEPENDENCIES%" == "" ( | 
|  | echo %ECHO_PREFIX% Installing %MXNET_DEPENDENCIES% by conda for MXNET | 
|  | conda install -n %MXNET_CONDA_ENV% -c conda-forge %MXNET_DEPENDENCIES% --yes | 
|  | ) | 
|  |  | 
|  | :: make symbolic link to workaround opencv cmakefile bug | 
|  | echo %ECHO_PREFIX% Install symblic link for opencv | 
|  | mkdir %CONDA_DIR%\envs\x64\vc14\ | 
|  | mklink /D %CONDA_DIR%\envs\x64\vc14\lib %MXNET_CONDA_LIBRARY:\\=\%\lib | 
|  | mklink /D %CONDA_DIR%\envs\x64\vc14\bin %MXNET_CONDA_LIBRARY:\\=\%\bin | 
|  |  | 
|  | :NO_CONDA | 
|  | if exist "%MXNET_CONDA_INFO%" del /q %MXNET_CONDA_INFO% | 
|  | if exist "%MXNET_CONDA_PKGS%" del /q %MXNET_CONDA_PKGS% | 
|  |  | 
|  | ::::   download graphviz   :::: | 
|  |  | 
|  | REM echo %ECHO_PREFIX% Downloading graphviz for graph package | 
|  | REM cd %MXNET_DISTRO%\build | 
|  | REM wget -nc https://github.com/mahkoCosmo/GraphViz_x64/raw/master/graphviz-2.38_x64.tar.gz --no-check-certificate -O graphviz-2.38_x64.tar.gz | 
|  | REM 7z x graphviz-2.38_x64.tar.gz -y && 7z x graphviz-2.38_x64.tar -ographviz-2.38_x64 -y >NUL | 
|  | REM if not exist %MXNET_INSTALL_BIN%\graphviz md %MXNET_INSTALL_BIN%\graphviz | 
|  | REM copy /y %MXNET_DISTRO%\build\graphviz-2.38_x64\bin\ %MXNET_INSTALL_BIN%\graphviz\ | 
|  |  | 
|  | REM set NEW_PATH=%NEW_PATH%;%MXNET_INSTALL_BIN%\graphviz | 
|  |  | 
|  | echo %ECHO_PREFIX% Build libmxnet.dll | 
|  | cd /D %MXNET_DISTRO% | 
|  |  | 
|  | SET CMAKE_OPT=%CMAKE_OPT% -DUSE_CUDA=%MXNET_SETUP_HAS_CUDA% | 
|  | SET CMAKE_OPT=%CMAKE_OPT% -DUSE_CUDNN=%MXNET_SETUP_HAS_CUDNN% | 
|  | if %MXNET_SETUP_HAS_CUDNN%=="1" SET CMAKE_OPT=%CMAKE_OPT% -DCUDNN_ROOT="%CUDNN_ROOT%" | 
|  | SET CMAKE_OPT=%CMAKE_OPT% -DBLAS="%MXNET_BLAS%" | 
|  | if "%MXNET_BLAS%"=="Open" SET CMAKE_OPT=%CMAKE_OPT% -DOpenBLAS_HOME="%MXNET_CONDA_LIBRARY%" -DOpenBLAS_INCLUDE_DIR="%OpenBLAS_INCLUDE_DIR%" -DOpenBLAS_LIB="%OpenBLAS_LIB%" | 
|  | if "%MXNET_BLAS%"=="MKL" SET CMAKE_OPT=%CMAKE_OPT% -DMKL_HOME="%INTEL_MKL_DIR%" -DMKL_INCLUDE_DIR="%MKL_INCLUDE_DIR%" -DMKL_LIB="%MKL_LIB%" | 
|  |  | 
|  | SET CMAKE_OPT=%CMAKE_OPT% -DOpenCV_LIB_PATH="%MXNET_CONDA_LIBRARY%\\lib\\" -DOpenCV_INCLUDE_DIRS="%MXNET_CONDA_LIBRARY%\\include\\" -DOpenCV_CONFIG_PATH="%MXNET_CONDA_LIBRARY%" | 
|  |  | 
|  | cmake -Wno-dev %CMAKE_OPT% -DCMAKE_PREFIX_PATH="%MXNET_CONDA_LIBRARY%" -G "Visual Studio 14 2015 Win64" -DUSE_PROFILER=1 -DCMAKE_BUILD_TYPE=Release -H. -Bbuild | 
|  | if errorlevel 1 goto :FAIL | 
|  | msbuild build\mxnet.sln /t:Build /p:Configuration=Release;Platform=x64 /m | 
|  | if errorlevel 1 goto :FAIL | 
|  |  | 
|  | echo %ECHO_PREFIX% Install libmxnet.dll | 
|  | cd /D %MXNET_DISTRO%\python | 
|  | python setup.py install | 
|  | if errorlevel 1 goto :FAIL | 
|  |  | 
|  | set NEW_PATH=%NEW_PATH:\\=\% | 
|  | echo %ECHO_PREFIX% Setup succeed! | 
|  | echo %ECHO_PREFIX% Add the following path to your system path or Run env.cmd per cmd window | 
|  | echo %NEW_PATH% | 
|  | echo @SET PATH=%%PATH%%;%NEW_PATH%>%MXNET_DISTRO%\env.cmd | 
|  | goto :END | 
|  |  | 
|  | :PATCH_OPENBLAS | 
|  | echo %ECHO_PREFIX% Apply patch to fix openblas 2.15 | 
|  |  | 
|  | echo --- openblas_config.h   2016-12-20 11:09:11.722445000 +0800>%TEMP%\openblas.diff | 
|  | echo +++ openblas_config.h   2016-12-20 11:01:21.347244600 +0800>>%TEMP%\openblas.diff | 
|  | echo @@ -109,7 +109,7 @@>>%TEMP%\openblas.diff | 
|  | echo     structure as fallback (see Clause 6.2.5.13 of the C99 standard). */>>%TEMP%\openblas.diff | 
|  | echo  #if (defined(__STDC_IEC_559_COMPLEX__) ^|^| __STDC_VERSION__ ^>= 199901L ^|^| \>>%TEMP%\openblas.diff | 
|  | echo       (__GNUC__ ^>= 3 ^&^& !defined(__cplusplus)) ^|^| \>>%TEMP%\openblas.diff | 
|  | echo -     _MSC_VER ^>= 1800) // Visual Studio 2013 supports complex>>%TEMP%\openblas.diff | 
|  | echo +     (_MSC_VER ^>= 1800 ^&^& !defined(__cplusplus))) // Visual Studio 2013 supports complex>>%TEMP%\openblas.diff | 
|  | echo    #define OPENBLAS_COMPLEX_C99>>%TEMP%\openblas.diff | 
|  | echo  #ifndef __cplusplus>>%TEMP%\openblas.diff | 
|  | echo    #include ^<complex.h^>>>%TEMP%\openblas.diff | 
|  | cd /D %MXNET_CONDA_LIBRARY:\\=\%\include | 
|  | patch -p0 -i %TEMP%\openblas.diff | 
|  | DEL %TEMP%\openblas.diff | 
|  | GOTO :eof | 
|  |  | 
|  | :FAIL | 
|  | echo %ECHO_PREFIX% Setup fail! | 
|  |  | 
|  | :END | 
|  |  |