blob: 206c66c4c008b03c0e45e3ed0dad400873d15d9f [file] [log] [blame]
@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