mirror of
https://github.com/zebrajr/pytorch.git
synced 2025-12-07 12:21:27 +01:00
Added Ninja generator support on Windows
Summary:
I successfully built caffe2 using MSVC 2015 and the Ninja Generator. I use vcpkg to build glfags, glog, lmdb and protobuf. Here is my build procedure:
1. Install vcpkg and set it up according to vcpkg docs
2. Install dependencies
```
$> vcpkg install gflags glog lmdb protobuf eigen3 --triplet x64-windows-static
```
3. Run CMake with this batch file
```Batch
setlocal
if NOT DEFINED VCPKG_DIR ( echo "Please defined VCPKG_DIR" && exit /b 1 )
if NOT DEFINED CMAKE_BUILD_TYPE set CMAKE_BUILD_TYPE=Release
if NOT DEFINED BUILD_DIR set BUILD_DIR=build_%CMAKE_BUILD_TYPE%
if NOT DEFINED USE_CUDA set USE_CUDA=OFF
call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" amd64
if NOT EXIST %BUILD_DIR% (mkdir %BUILD_DIR%)
pushd %BUILD_DIR%
set CMAKE_GENERATOR=Ninja
set ZLIB_LIBRARY=%VCPKG_DIR%\installed\x64-windows-static\lib\zlib.lib
cmake -G"%CMAKE_GENERATOR%" ^
-DBUILD_SHARED_LIBS=OFF ^
-DCMAKE_VERBOSE_MAKEFILE=1 ^
-DBUILD_TEST=OFF ^
-DBUILD_SHARED_LIBS=OFF ^
-DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE% ^
-DUSE_CUDA=%USE_CUDA% ^
-DZLIB_LIBRARY:FILEPATH="%ZLIB_LIBRARY%" ^
-DVCPKG_TARGET_TRIPLET=x64-windows-static ^
-DVCPKG_APPLOCAL_DEPS:BOOL=OFF ^
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=%VCPKG_DIR%\scripts\buildsystems\vcpkg.cmake ^
-DPROTOBUF_PROTOC_EXECUTABLE:FILEPATH=%VCPKG_DIR%\installed\x64-windows-static\tools\protoc.exe ^
..\
ninja
popd
endlocal
```
Closes https://github.com/caffe2/caffe2/pull/880
Differential Revision: D5497384
Pulled By: Yangqing
fbshipit-source-id: e0d81d3dbd3286ab925eddef0e6fbf99eb6375a5
This commit is contained in:
parent
cf1ce29631
commit
8cc9dbf357
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -5,15 +5,18 @@
|
||||||
*.lo
|
*.lo
|
||||||
*.o
|
*.o
|
||||||
*.cuo
|
*.cuo
|
||||||
|
*.obj
|
||||||
|
|
||||||
# Compiled Dynamic libraries
|
# Compiled Dynamic libraries
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
# Compiled Static libraries
|
# Compiled Static libraries
|
||||||
*.lai
|
*.lai
|
||||||
*.la
|
*.la
|
||||||
*.a
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
# Compiled protocol buffers
|
# Compiled protocol buffers
|
||||||
*.pb.h
|
*.pb.h
|
||||||
|
|
@ -22,6 +25,7 @@
|
||||||
|
|
||||||
# Compiled python
|
# Compiled python
|
||||||
*.pyc
|
*.pyc
|
||||||
|
*.pyd
|
||||||
|
|
||||||
# Compiled MATLAB
|
# Compiled MATLAB
|
||||||
*.mex*
|
*.mex*
|
||||||
|
|
|
||||||
|
|
@ -94,15 +94,16 @@ if(NOT MSVC)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing")
|
||||||
else()
|
else()
|
||||||
if (NOT ${BUILD_SHARED_LIBS})
|
|
||||||
foreach(flag_var
|
foreach(flag_var
|
||||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||||
|
if (NOT ${BUILD_SHARED_LIBS})
|
||||||
if(${flag_var} MATCHES "/MD")
|
if(${flag_var} MATCHES "/MD")
|
||||||
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||||
endif(${flag_var} MATCHES "/MD")
|
endif(${flag_var} MATCHES "/MD")
|
||||||
endforeach(flag_var)
|
|
||||||
endif()
|
endif()
|
||||||
|
set(${flag_var} "${${flag_var}} /MP /bigobj")
|
||||||
|
endforeach(flag_var)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT APPLE AND UNIX)
|
if(NOT APPLE AND UNIX)
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@ if(USE_CUDA)
|
||||||
endif()
|
endif()
|
||||||
install(TARGETS Caffe2_GPU DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
install(TARGETS Caffe2_GPU DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
||||||
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
|
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
|
||||||
|
add_dependencies(Caffe2_GPU Caffe2_PROTO)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---[ Test binaries.
|
# ---[ Test binaries.
|
||||||
|
|
@ -208,7 +209,7 @@ if (BUILD_PYTHON)
|
||||||
${CMAKE_INSTALL_PREFIX}/caffe2/python)
|
${CMAKE_INSTALL_PREFIX}/caffe2/python)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||||
# If we are building under windows, we will copy the file from
|
# If we are building under windows, we will copy the file from
|
||||||
# build/caffe2/python/{Debug,Release}/caffe2_pybind11_state.pyd
|
# build/caffe2/python/{Debug,Release}/caffe2_pybind11_state.pyd
|
||||||
# to its parent folder so that we can do in-build execution.
|
# to its parent folder so that we can do in-build execution.
|
||||||
|
|
@ -217,14 +218,14 @@ if (BUILD_PYTHON)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
TARGET windows_python_copy_lib POST_BUILD
|
TARGET windows_python_copy_lib POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
${CMAKE_BINARY_DIR}/caffe2/python/${CMAKE_BUILD_TYPE}/caffe2_pybind11_state.pyd
|
$<TARGET_FILE:caffe2_pybind11_state>
|
||||||
${CMAKE_BINARY_DIR}/caffe2/python)
|
${CMAKE_BINARY_DIR}/caffe2/python)
|
||||||
if (USE_CUDA)
|
if (USE_CUDA)
|
||||||
add_dependencies(windows_python_copy_lib caffe2_pybind11_state_gpu)
|
add_dependencies(windows_python_copy_lib caffe2_pybind11_state_gpu)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
TARGET windows_python_copy_lib POST_BUILD
|
TARGET windows_python_copy_lib POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
${CMAKE_BINARY_DIR}/caffe2/python/${CMAKE_BUILD_TYPE}/caffe2_pybind11_state_gpu.pyd
|
$<TARGET_FILE:caffe2_pybind11_state_gpu>
|
||||||
${CMAKE_BINARY_DIR}/caffe2/python)
|
${CMAKE_BINARY_DIR}/caffe2/python)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -239,6 +240,20 @@ if (BUILD_PYTHON)
|
||||||
file(GLOB_RECURSE PYTHON_SRCS RELATIVE ${PROJECT_SOURCE_DIR}
|
file(GLOB_RECURSE PYTHON_SRCS RELATIVE ${PROJECT_SOURCE_DIR}
|
||||||
"${PROJECT_SOURCE_DIR}/caffe2/*.py")
|
"${PROJECT_SOURCE_DIR}/caffe2/*.py")
|
||||||
add_custom_target(python_copy_files ALL)
|
add_custom_target(python_copy_files ALL)
|
||||||
|
if(MSVC AND CMAKE_GENERATOR MATCHES "Ninja")
|
||||||
|
# ninja fails when the command line is too long so we split
|
||||||
|
# the target into several. This would be beneficial for VS also
|
||||||
|
# since it build targets in parallel but not custom commands
|
||||||
|
foreach(python_src ${PYTHON_SRCS})
|
||||||
|
get_filename_component(dir ${python_src} DIRECTORY)
|
||||||
|
string(SHA1 name_hash "${python_src}")
|
||||||
|
# get_filename_component(name_we ${python_src} NAME_WE)
|
||||||
|
add_custom_target(python_copy_files_${name_hash}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
${PROJECT_SOURCE_DIR}/${python_src} ${CMAKE_BINARY_DIR}/${dir})
|
||||||
|
add_dependencies(python_copy_files python_copy_files_${name_hash})
|
||||||
|
endforeach()
|
||||||
|
else()
|
||||||
foreach(python_src ${PYTHON_SRCS})
|
foreach(python_src ${PYTHON_SRCS})
|
||||||
get_filename_component(dir ${python_src} DIRECTORY)
|
get_filename_component(dir ${python_src} DIRECTORY)
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
|
|
@ -246,6 +261,7 @@ if (BUILD_PYTHON)
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
${PROJECT_SOURCE_DIR}/${python_src} ${CMAKE_BINARY_DIR}/${dir})
|
${PROJECT_SOURCE_DIR}/${python_src} ${CMAKE_BINARY_DIR}/${dir})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
# Install commands
|
# Install commands
|
||||||
# Pick up static python files
|
# Pick up static python files
|
||||||
|
|
|
||||||
|
|
@ -14,26 +14,14 @@ include(FindPackageHandleStandardArgs)
|
||||||
set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags")
|
set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags")
|
||||||
|
|
||||||
# We are testing only a couple of files in the include directories
|
# We are testing only a couple of files in the include directories
|
||||||
if(WIN32)
|
if(NOT WIN32)
|
||||||
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
|
|
||||||
PATHS ${GFLAGS_ROOT_DIR}/src/windows)
|
|
||||||
else()
|
|
||||||
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
|
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
|
||||||
PATHS ${GFLAGS_ROOT_DIR})
|
PATHS ${GFLAGS_ROOT_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
find_library(GFLAGS_LIBRARY_RELEASE
|
find_package(gflags NO_MODULE)
|
||||||
NAMES libgflags
|
set(GFLAGS_LIBRARY ${gflags_LIBRARIES})
|
||||||
PATHS ${GFLAGS_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES Release)
|
|
||||||
|
|
||||||
find_library(GFLAGS_LIBRARY_DEBUG
|
|
||||||
NAMES libgflags-debug
|
|
||||||
PATHS ${GFLAGS_ROOT_DIR}
|
|
||||||
PATH_SUFFIXES Debug)
|
|
||||||
|
|
||||||
set(GFLAGS_LIBRARY optimized ${GFLAGS_LIBRARY_RELEASE} debug ${GFLAGS_LIBRARY_DEBUG})
|
|
||||||
else()
|
else()
|
||||||
find_library(GFLAGS_LIBRARY gflags)
|
find_library(GFLAGS_LIBRARY gflags)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -13,24 +13,21 @@ include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")
|
set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")
|
||||||
|
|
||||||
if(WIN32)
|
if(NOT WIN32)
|
||||||
find_path(GLOG_INCLUDE_DIR glog/logging.h
|
|
||||||
PATHS ${GLOG_ROOT_DIR}/src/windows)
|
|
||||||
else()
|
|
||||||
find_path(GLOG_INCLUDE_DIR glog/logging.h
|
find_path(GLOG_INCLUDE_DIR glog/logging.h
|
||||||
PATHS ${GLOG_ROOT_DIR})
|
PATHS ${GLOG_ROOT_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
find_library(GLOG_LIBRARY_RELEASE libglog_static
|
find_package(glog NO_MODULE)
|
||||||
PATHS ${GLOG_ROOT_DIR}
|
if(TARGET glog)
|
||||||
PATH_SUFFIXES Release)
|
set(GLOG_LIBRARY glog)
|
||||||
|
elseif(TARGET glog::glog)
|
||||||
find_library(GLOG_LIBRARY_DEBUG libglog_static
|
set(GLOG_LIBRARY glog::glog)
|
||||||
PATHS ${GLOG_ROOT_DIR}
|
endif()
|
||||||
PATH_SUFFIXES Debug)
|
if(TARGET ${GLOG_LIBRARY})
|
||||||
|
get_target_property(GLOG_INCLUDE_DIR ${GLOG_LIBRARY} INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG})
|
endif()
|
||||||
else()
|
else()
|
||||||
find_library(GLOG_LIBRARY glog
|
find_library(GLOG_LIBRARY glog
|
||||||
PATHS ${GLOG_ROOT_DIR}
|
PATHS ${GLOG_ROOT_DIR}
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,12 @@
|
||||||
# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com>
|
# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com>
|
||||||
# Aug 31, 2013
|
# Aug 31, 2013
|
||||||
|
|
||||||
find_path(LMDB_INCLUDE_DIR NAMES lmdb.h PATHS "$ENV{LMDB_DIR}/include")
|
if(MSVC)
|
||||||
find_library(LMDB_LIBRARIES NAMES lmdb PATHS "$ENV{LMDB_DIR}/lib" )
|
find_package(LMDB NO_MODULE)
|
||||||
|
else()
|
||||||
|
find_path(LMDB_INCLUDE_DIR NAMES lmdb.h PATHS "$ENV{LMDB_DIR}/include")
|
||||||
|
find_library(LMDB_LIBRARIES NAMES lmdb PATHS "$ENV{LMDB_DIR}/lib" )
|
||||||
|
endif()
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES)
|
find_package_handle_standard_args(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,13 @@ function(custom_protobuf_find)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
|
find_package( Protobuf NO_MODULE)
|
||||||
|
if ( NOT (Protobuf_FOUND OR PROTOBUF_FOUND) )
|
||||||
custom_protobuf_find()
|
custom_protobuf_find()
|
||||||
|
else()
|
||||||
|
list(APPEND Caffe2_DEPENDENCY_LIBS protobuf::libprotobuf)
|
||||||
|
# include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
elseif (ANDROID OR IOS)
|
elseif (ANDROID OR IOS)
|
||||||
custom_protobuf_find()
|
custom_protobuf_find()
|
||||||
# For Androd or iOS, we won't need to build the libprotoc and protoc binaries
|
# For Androd or iOS, we won't need to build the libprotoc and protoc binaries
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user