blob: 8f4624a85f891ffb4f916ec433e7184e5d89009e [file] [log] [blame]
# This list is required for static linking and exported to Caffe2Config.cmake
set(Caffe2_DEPENDENCY_LIBS "")
set(Caffe2_CUDA_DEPENDENCY_LIBS "")
set(Caffe2_PYTHON_DEPENDENCY_LIBS "")
set(Caffe2_EXTERNAL_DEPENDENCIES "")
# ---[ Custom Protobuf
include("cmake/ProtoBuf.cmake")
# ---[ Threads
if(USE_THREADS)
find_package(Threads REQUIRED)
list(APPEND Caffe2_DEPENDENCY_LIBS ${CMAKE_THREAD_LIBS_INIT})
endif()
# ---[ protobuf
if(USE_LITE_PROTO)
set(CAFFE2_USE_LITE_PROTO 1)
endif()
# ---[ git: used to generate git build string.
find_package(Git)
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --always --dirty
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
OUTPUT_VARIABLE CAFFE2_GIT_VERSION
RESULT_VARIABLE __git_result)
if(NOT ${__git_result} EQUAL 0)
set(CAFFE2_GIT_VERSION "unknown")
endif()
else()
message(
WARNING
"Cannot find git, so Caffe2 won't have any git build info available")
endif()
# ---[ BLAS
set(BLAS "Eigen" CACHE STRING "Selected BLAS library")
set_property(CACHE BLAS PROPERTY STRINGS "Eigen;ATLAS;OpenBLAS;MKL;vecLib")
message(STATUS "The BLAS backend of choice:" ${BLAS})
if(BLAS STREQUAL "Eigen")
# Eigen is header-only and we do not have any dependent libraries
set(CAFFE2_USE_EIGEN_FOR_BLAS 1)
elseif(BLAS STREQUAL "ATLAS")
find_package(Atlas REQUIRED)
caffe2_include_directories(${ATLAS_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS ${ATLAS_LIBRARIES})
list(APPEND Caffe2_DEPENDENCY_LIBS cblas)
elseif(BLAS STREQUAL "OpenBLAS")
find_package(OpenBLAS REQUIRED)
caffe2_include_directories(${OpenBLAS_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenBLAS_LIB})
list(APPEND Caffe2_DEPENDENCY_LIBS cblas)
elseif(BLAS STREQUAL "MKL")
find_package(MKL REQUIRED)
caffe2_include_directories(${MKL_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${MKL_LIBRARIES})
set(CAFFE2_USE_MKL 1)
elseif(BLAS STREQUAL "vecLib")
find_package(vecLib REQUIRED)
caffe2_include_directories(${vecLib_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${vecLib_LINKER_LIBS})
else()
message(FATAL_ERROR "Unrecognized blas option:" ${BLAS})
endif()
# ---[ NNPACK
if(USE_NNPACK)
include("cmake/External/nnpack.cmake")
if(NNPACK_FOUND)
caffe2_include_directories(${NNPACK_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS ${NNPACK_LIBRARIES})
else()
message(WARNING "Not compiling with NNPACK. Suppress this warning with -DUSE_NNPACK=OFF")
set(USE_NNPACK OFF)
endif()
endif()
# ---[ Google-glog
if(USE_GLOG)
include("cmake/External/glog.cmake")
if(GLOG_FOUND)
set(CAFFE2_USE_GOOGLE_GLOG 1)
caffe2_include_directories(${GLOG_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS ${GLOG_LIBRARIES})
else()
message(WARNING "Not compiling with glog. Suppress this warning with -DUSE_GLOG=OFF")
set(USE_GLOG OFF)
endif()
endif()
# ---[ Google-gflags
if(USE_GFLAGS)
include("cmake/External/gflags.cmake")
if(GFLAGS_FOUND)
set(CAFFE2_USE_GFLAGS 1)
caffe2_include_directories(${GFLAGS_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS ${GFLAGS_LIBRARIES})
else()
message(WARNING "Not compiling with gflags. Suppress this warning with -DUSE_GFLAGS=OFF")
set(USE_GFLAGS OFF)
endif()
endif()
# ---[ Googletest and benchmark
if(BUILD_TEST)
add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/googletest)
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/googletest/googletest/include)
find_package(Benchmark)
if(Benchmark_FOUND)
list(APPEND Caffe2_DEPENDENCY_LIBS ${Benchmark_LIBRARIES})
caffe2_include_directories(${Benchmark_INCLUDE_DIRS})
else()
add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/benchmark)
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/benchmark/include)
endif()
endif()
# ---[ LMDB
if(USE_LMDB)
find_package(LMDB)
if(LMDB_FOUND)
caffe2_include_directories(${LMDB_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${LMDB_LIBRARIES})
else()
message(WARNING "Not compiling with LMDB. Suppress this warning with -DUSE_LMDB=OFF")
set(USE_LMDB OFF)
endif()
endif()
# ---[ LevelDB
# ---[ Snappy
if(USE_LEVELDB)
find_package(LevelDB)
find_package(Snappy)
if(LEVELDB_FOUND AND SNAPPY_FOUND)
caffe2_include_directories(${LevelDB_INCLUDE})
list(APPEND Caffe2_DEPENDENCY_LIBS ${LevelDB_LIBRARIES})
caffe2_include_directories(${Snappy_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${Snappy_LIBRARIES})
else()
message(WARNING "Not compiling with LevelDB. Suppress this warning with -DUSE_LEVELDB=OFF")
set(USE_LEVELDB OFF)
endif()
endif()
# ---[ Rocksdb
if(USE_ROCKSDB)
find_package(RocksDB)
if(ROCKSDB_FOUND)
caffe2_include_directories(${RocksDB_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${RocksDB_LIBRARIES})
else()
message(WARNING "Not compiling with RocksDB. Suppress this warning with -DUSE_ROCKSDB=OFF")
set(USE_ROCKSDB OFF)
endif()
endif()
# ---[ ZMQ
if(USE_ZMQ)
find_package(ZMQ)
if(ZMQ_FOUND)
caffe2_include_directories(${ZMQ_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${ZMQ_LIBRARIES})
else()
message(WARNING "Not compiling with ZMQ. Suppress this warning with -DUSE_ZMQ=OFF")
set(USE_ZMQ OFF)
endif()
endif()
# ---[ Redis
if(USE_REDIS)
find_package(Hiredis)
if(HIREDIS_FOUND)
caffe2_include_directories(${Hiredis_INCLUDE})
list(APPEND Caffe2_DEPENDENCY_LIBS ${Hiredis_LIBRARIES})
else()
message(WARNING "Not compiling with Redis. Suppress this warning with -DUSE_REDIS=OFF")
set(USE_REDIS OFF)
endif()
endif()
# ---[ OpenCV
if(USE_OPENCV)
# OpenCV 3
find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs)
if(NOT OpenCV_FOUND)
# OpenCV 2
find_package(OpenCV QUIET COMPONENTS core highgui imgproc)
endif()
if(OpenCV_FOUND)
caffe2_include_directories(${OpenCV_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenCV_LIBS})
message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})")
else()
message(WARNING "Not compiling with OpenCV. Suppress this warning with -DUSE_OPENCV=OFF")
set(USE_OPENCV OFF)
endif()
endif()
# ---[ FFMPEG
if(USE_FFMPEG)
find_package(FFmpeg REQUIRED)
if (FFMPEG_FOUND)
message("Found FFMPEG/LibAV libraries")
caffe2_include_directories(${FFMPEG_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${FFMPEG_LIBRARIES})
else ()
message("Not compiling with FFmpeg. Suppress this warning with -DUSE_FFMPEG=OFF")
set(USE_FFMPEG OFF)
endif ()
endif()
# ---[ EIGEN
set(EIGEN_MPL2_ONLY 1)
find_package(Eigen3 QUIET)
if(EIGEN3_FOUND)
caffe2_include_directories(${EIGEN3_INCLUDE_DIRS})
else()
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/eigen)
endif()
# ---[ Python + Numpy
if(BUILD_PYTHON)
set(Python_ADDITIONAL_VERSIONS 2.8 2.7 2.6)
find_package(PythonInterp 2.7)
find_package(PythonLibs 2.7)
find_package(NumPy REQUIRED)
if(PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND NUMPY_FOUND)
caffe2_include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR})
list(APPEND Caffe2_PYTHON_DEPENDENCY_LIBS ${PYTHON_LIBRARIES})
else()
message(WARNING "Python dependencies not met. Not compiling with python. Suppress this warning with -DBUILD_PYTHON=OFF")
set(BUILD_PYTHON OFF)
endif()
endif()
# ---[ pybind11
find_package(pybind11)
if(pybind11_FOUND)
caffe2_include_directories(${pybind11_INCLUDE_DIRS})
else()
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/pybind11/include)
endif()
# ---[ MPI
if(USE_MPI)
find_package(MPI)
if(MPI_CXX_FOUND)
message(STATUS "MPI support found")
message(STATUS "MPI compile flags: " ${MPI_CXX_COMPILE_FLAGS})
message(STATUS "MPI include path: " ${MPI_CXX_INCLUDE_PATH})
message(STATUS "MPI LINK flags path: " ${MPI_CXX_LINK_FLAGS})
message(STATUS "MPI libraries: " ${MPI_CXX_LIBRARIES})
caffe2_include_directories(${MPI_CXX_INCLUDE_PATH})
list(APPEND Caffe2_DEPENDENCY_LIBS ${MPI_CXX_LIBRARIES})
set(CMAKE_EXE_LINKER_FLAGS ${MPI_CXX_LINK_FLAGS})
find_program(OMPI_INFO
NAMES ompi_info
HINTS ${MPI_CXX_LIBRARIES}/../bin)
if(OMPI_INFO)
execute_process(COMMAND ${OMPI_INFO}
OUTPUT_VARIABLE _output)
if(_output MATCHES "smcuda")
message(STATUS "Found OpenMPI with CUDA support built.")
else()
message(WARNING "OpenMPI found, but it is not built with CUDA support.")
set(CAFFE2_FORCE_FALLBACK_CUDA_MPI 1)
endif()
endif()
else()
message(WARNING "Not compiling with MPI. Suppress this warning with -DUSE_MPI=OFF")
set(USE_MPI OFF)
endif()
endif()
# ---[ OpenMP
if(USE_OPENMP)
find_package(OpenMP)
if(OPENMP_FOUND)
message(STATUS "Adding " ${OpenMP_CXX_FLAGS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
else()
message(WARNING "Not compiling with OpenMP. Suppress this warning with -DUSE_OPENMP=OFF")
set(USE_OPENMP OFF)
endif()
endif()
# ---[ Android specific ones
if(ANDROID)
list(APPEND Caffe2_DEPENDENCY_LIBS log)
endif()
# ---[ CUDA
if(USE_CUDA)
include(cmake/Cuda.cmake)
# CUDA 8.0 requires GCC 5
if(HAVE_CUDA)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND
NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.0 AND
CUDA_HOST_COMPILER STREQUAL CMAKE_C_COMPILER)
message(FATAL_ERROR
"CUDA 8.0 is not compatible with GCC version >= 6. "
"Use the following option to use another version (for example): \n"
" -DCUDA_HOST_COMPILER=/usr/bin/gcc-5\n")
endif()
endif()
# ---[ CUDNN
if(HAVE_CUDA)
find_package(CuDNN REQUIRED)
if(CUDNN_FOUND)
caffe2_include_directories(${CUDNN_INCLUDE_DIRS})
list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS ${CUDNN_LIBRARIES})
endif()
else()
message(WARNING "Not compiling with CUDA. Suppress this warning with -DUSE_CUDA=OFF")
set(USE_CUDA OFF)
endif()
endif()
# ---[ NCCL
if(USE_NCCL)
if(NOT USE_CUDA)
message(WARNING "If not using cuda, one should not use NCCL either.")
set(USE_NCCL OFF)
elseif(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
message(WARNING "NCCL is currently only supported under Linux.")
set(USE_NCCL OFF)
else()
include("cmake/External/nccl.cmake")
caffe2_include_directories(${NCCL_INCLUDE_DIRS})
message(STATUS "NCCL: ${NCCL_LIBRARIES}")
list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS ${NCCL_LIBRARIES})
endif()
endif()
# ---[ CUB
if(USE_CUDA)
find_package(CUB)
if(CUB_FOUND)
caffe2_include_directories(${CUB_INCLUDE_DIRS})
else()
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/cub)
endif()
endif()
if(USE_GLOO)
if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
message(WARNING "Gloo can only be used on Linux.")
set(USE_GLOO OFF)
elseif(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
message(WARNING "Gloo can only be used on 64-bit systems.")
set(USE_GLOO OFF)
else()
set(Gloo_USE_CUDA ${USE_CUDA})
find_package(Gloo)
if(Gloo_FOUND)
caffe2_include_directories(${Gloo_INCLUDE_DIRS})
list(APPEND Caffe2_DEPENDENCY_LIBS gloo)
else()
set(GLOO_INSTALL OFF CACHE BOOL "" FORCE)
set(GLOO_STATIC_OR_SHARED STATIC CACHE STRING "" FORCE)
# Temporarily override variables to avoid building Gloo tests/benchmarks
set(__BUILD_TEST ${BUILD_TEST})
set(__BUILD_BENCHMARK ${BUILD_BENCHMARK})
set(BUILD_TEST OFF)
set(BUILD_BENCHMARK OFF)
add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/gloo)
# Here is a little bit hacky. We have to put PROJECT_BINARY_DIR in front
# of PROJECT_SOURCE_DIR with/without conda system. The reason is that
# gloo generates a new config.h in the binary diretory.
include_directories(BEFORE SYSTEM ${PROJECT_SOURCE_DIR}/third_party/gloo)
include_directories(BEFORE SYSTEM ${PROJECT_BINARY_DIR}/third_party/gloo)
set(BUILD_TEST ${__BUILD_TEST})
set(BUILD_BENCHMARK ${__BUILD_BENCHMARK})
# Add explicit dependency if NCCL is built from third_party.
# Without dependency, make -jN with N>1 can fail if the NCCL build
# hasn't finished when CUDA targets are linked.
if(NCCL_EXTERNAL)
add_dependencies(gloo_cuda nccl_external)
endif()
endif()
# Pick the right dependency depending on USE_CUDA
list(APPEND Caffe2_DEPENDENCY_LIBS gloo)
if(USE_CUDA)
list(APPEND Caffe2_CUDA_DEPENDENCY_LIBS gloo_cuda)
endif()
endif()
endif()
if (USE_MOBILE_OPENGL)
if (ANDROID)
list(APPEND Caffe2_DEPENDENCY_LIBS EGL GLESv2)
elseif (IOS)
message(STATUS "TODO item for adding ios opengl dependency")
else()
message(WARNING "mobile opengl is only used in android or ios builds.")
set(USE_MOBILE_OPENGL OFF)
endif()
endif()
if (USE_SNPE AND ANDROID)
if (SNPE_LOCATION AND SNPE_HEADERS)
message(STATUS "Using SNPE location specified by -DSNPE_LOCATION: " ${SNPE_LOCATION})
message(STATUS "Using SNPE headers specified by -DSNPE_HEADERS: " ${SNPE_HEADERS})
include_directories(SYSTEM ${SNPE_HEADERS})
add_library(snpe SHARED IMPORTED)
set_property(TARGET snpe PROPERTY IMPORTED_LOCATION ${SNPE_LOCATION})
list(APPEND Caffe2_DEPENDENCY_LIBS snpe)
else()
set(USE_SNPE OFF)
endif()
endif()
if (USE_METAL)
if (NOT IOS)
message(WARNING "Metal is only used in ios builds.")
set(USE_METAL OFF)
endif()
endif()
if (USE_ATEN)
list(APPEND Caffe2_EXTERNAL_DEPENDENCIES aten_build)
list(APPEND Caffe2_DEPENDENCY_LIBS ATen)
caffe2_include_directories(${PROJECT_BINARY_DIR}/caffe2/contrib/aten/aten/src/ATen)
caffe2_include_directories(${PROJECT_SOURCE_DIR}/third_party/aten/src)
caffe2_include_directories(${PROJECT_BINARY_DIR}/caffe2/contrib/aten)
endif()