mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08: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:
committed by
Facebook Github Bot
parent
cf1ce29631
commit
8cc9dbf357
4
.gitignore
vendored
4
.gitignore
vendored
@ -5,15 +5,18 @@
|
||||
*.lo
|
||||
*.o
|
||||
*.cuo
|
||||
*.obj
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Compiled protocol buffers
|
||||
*.pb.h
|
||||
@ -22,6 +25,7 @@
|
||||
|
||||
# Compiled python
|
||||
*.pyc
|
||||
*.pyd
|
||||
|
||||
# Compiled MATLAB
|
||||
*.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} -Wno-narrowing")
|
||||
else()
|
||||
if (NOT ${BUILD_SHARED_LIBS})
|
||||
foreach(flag_var
|
||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||
foreach(flag_var
|
||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||
if (NOT ${BUILD_SHARED_LIBS})
|
||||
if(${flag_var} MATCHES "/MD")
|
||||
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||
endif(${flag_var} MATCHES "/MD")
|
||||
endforeach(flag_var)
|
||||
endif()
|
||||
endif()
|
||||
set(${flag_var} "${${flag_var}} /MP /bigobj")
|
||||
endforeach(flag_var)
|
||||
endif()
|
||||
|
||||
if(NOT APPLE AND UNIX)
|
||||
|
@ -128,6 +128,7 @@ if(USE_CUDA)
|
||||
endif()
|
||||
install(TARGETS Caffe2_GPU DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
|
||||
link_directories(${CMAKE_INSTALL_PREFIX}/lib)
|
||||
add_dependencies(Caffe2_GPU Caffe2_PROTO)
|
||||
endif()
|
||||
|
||||
# ---[ Test binaries.
|
||||
@ -208,7 +209,7 @@ if (BUILD_PYTHON)
|
||||
${CMAKE_INSTALL_PREFIX}/caffe2/python)
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
if (MSVC AND CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
# If we are building under windows, we will copy the file from
|
||||
# build/caffe2/python/{Debug,Release}/caffe2_pybind11_state.pyd
|
||||
# to its parent folder so that we can do in-build execution.
|
||||
@ -217,14 +218,14 @@ if (BUILD_PYTHON)
|
||||
add_custom_command(
|
||||
TARGET windows_python_copy_lib POST_BUILD
|
||||
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)
|
||||
if (USE_CUDA)
|
||||
add_dependencies(windows_python_copy_lib caffe2_pybind11_state_gpu)
|
||||
add_custom_command(
|
||||
TARGET windows_python_copy_lib POST_BUILD
|
||||
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)
|
||||
endif()
|
||||
endif()
|
||||
@ -239,13 +240,28 @@ if (BUILD_PYTHON)
|
||||
file(GLOB_RECURSE PYTHON_SRCS RELATIVE ${PROJECT_SOURCE_DIR}
|
||||
"${PROJECT_SOURCE_DIR}/caffe2/*.py")
|
||||
add_custom_target(python_copy_files ALL)
|
||||
foreach(python_src ${PYTHON_SRCS})
|
||||
get_filename_component(dir ${python_src} DIRECTORY)
|
||||
add_custom_command(
|
||||
TARGET python_copy_files PRE_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${PROJECT_SOURCE_DIR}/${python_src} ${CMAKE_BINARY_DIR}/${dir})
|
||||
endforeach()
|
||||
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})
|
||||
get_filename_component(dir ${python_src} DIRECTORY)
|
||||
add_custom_command(
|
||||
TARGET python_copy_files PRE_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${PROJECT_SOURCE_DIR}/${python_src} ${CMAKE_BINARY_DIR}/${dir})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# Install commands
|
||||
# Pick up static python files
|
||||
|
@ -14,26 +14,14 @@ include(FindPackageHandleStandardArgs)
|
||||
set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags")
|
||||
|
||||
# We are testing only a couple of files in the include directories
|
||||
if(WIN32)
|
||||
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
|
||||
PATHS ${GFLAGS_ROOT_DIR}/src/windows)
|
||||
else()
|
||||
if(NOT WIN32)
|
||||
find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h
|
||||
PATHS ${GFLAGS_ROOT_DIR})
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
find_library(GFLAGS_LIBRARY_RELEASE
|
||||
NAMES libgflags
|
||||
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})
|
||||
find_package(gflags NO_MODULE)
|
||||
set(GFLAGS_LIBRARY ${gflags_LIBRARIES})
|
||||
else()
|
||||
find_library(GFLAGS_LIBRARY gflags)
|
||||
endif()
|
||||
|
@ -13,24 +13,21 @@ include(FindPackageHandleStandardArgs)
|
||||
|
||||
set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog")
|
||||
|
||||
if(WIN32)
|
||||
find_path(GLOG_INCLUDE_DIR glog/logging.h
|
||||
PATHS ${GLOG_ROOT_DIR}/src/windows)
|
||||
else()
|
||||
if(NOT WIN32)
|
||||
find_path(GLOG_INCLUDE_DIR glog/logging.h
|
||||
PATHS ${GLOG_ROOT_DIR})
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
find_library(GLOG_LIBRARY_RELEASE libglog_static
|
||||
PATHS ${GLOG_ROOT_DIR}
|
||||
PATH_SUFFIXES Release)
|
||||
|
||||
find_library(GLOG_LIBRARY_DEBUG libglog_static
|
||||
PATHS ${GLOG_ROOT_DIR}
|
||||
PATH_SUFFIXES Debug)
|
||||
|
||||
set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG})
|
||||
find_package(glog NO_MODULE)
|
||||
if(TARGET glog)
|
||||
set(GLOG_LIBRARY glog)
|
||||
elseif(TARGET glog::glog)
|
||||
set(GLOG_LIBRARY glog::glog)
|
||||
endif()
|
||||
if(TARGET ${GLOG_LIBRARY})
|
||||
get_target_property(GLOG_INCLUDE_DIR ${GLOG_LIBRARY} INTERFACE_INCLUDE_DIRECTORIES)
|
||||
endif()
|
||||
else()
|
||||
find_library(GLOG_LIBRARY glog
|
||||
PATHS ${GLOG_ROOT_DIR}
|
||||
|
@ -12,8 +12,12 @@
|
||||
# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com>
|
||||
# Aug 31, 2013
|
||||
|
||||
find_path(LMDB_INCLUDE_DIR NAMES lmdb.h PATHS "$ENV{LMDB_DIR}/include")
|
||||
find_library(LMDB_LIBRARIES NAMES lmdb PATHS "$ENV{LMDB_DIR}/lib" )
|
||||
if(MSVC)
|
||||
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)
|
||||
find_package_handle_standard_args(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES)
|
||||
|
@ -29,7 +29,13 @@ function(custom_protobuf_find)
|
||||
endfunction()
|
||||
|
||||
if (WIN32)
|
||||
custom_protobuf_find()
|
||||
find_package( Protobuf NO_MODULE)
|
||||
if ( NOT (Protobuf_FOUND OR PROTOBUF_FOUND) )
|
||||
custom_protobuf_find()
|
||||
else()
|
||||
list(APPEND Caffe2_DEPENDENCY_LIBS protobuf::libprotobuf)
|
||||
# include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR})
|
||||
endif()
|
||||
elseif (ANDROID OR IOS)
|
||||
custom_protobuf_find()
|
||||
# For Androd or iOS, we won't need to build the libprotoc and protoc binaries
|
||||
|
Reference in New Issue
Block a user