cmake build system
authorAdam Kosiorek <a.kosiorek@samsung.com>
Tue, 1 Jul 2014 07:56:20 +0000 (09:56 +0200)
committerJeff Donahue <jeff.donahue@gmail.com>
Sun, 17 Aug 2014 08:07:11 +0000 (01:07 -0700)
25 files changed:
.gitignore
CMakeLists.txt [new file with mode: 0644]
CMakeScripts/FindAtlas.cmake [new file with mode: 0644]
CMakeScripts/FindGlog.cmake [new file with mode: 0644]
CMakeScripts/FindLAPACK.cmake [new file with mode: 0644]
CMakeScripts/FindLMDB.cmake [new file with mode: 0644]
CMakeScripts/FindLevelDB.cmake [new file with mode: 0644]
CMakeScripts/FindMKL.cmake [new file with mode: 0644]
CMakeScripts/FindOpenBLAS.cmake [new file with mode: 0644]
Makefile
matlab/CMakeLists.txt [new file with mode: 0644]
python/CMakeLists.txt [new file with mode: 0644]
src/caffe/CMakeLists.txt [new file with mode: 0644]
src/caffe/proto/CMakeLists.txt [new file with mode: 0644]
src/caffe/proto/caffe_pretty_print.proto
src/caffe/test/CMakeLists.txt [new file with mode: 0644]
src/caffe/test/cmake_test_defines.hpp.in [new file with mode: 0644]
src/caffe/test/test_caffe_main.cpp
src/caffe/test/test_caffe_main.hpp [new file with mode: 0644]
src/caffe/test/test_data/sample_data_list.txt.in [new file with mode: 0644]
src/caffe/test/test_hdf5_output_layer.cpp
src/caffe/test/test_hdf5data_layer.cpp
src/caffe/test/test_image_data_layer.cpp
src/gtest/CMakeLists.txt [new file with mode: 0644]
tools/CMakeLists.txt [new file with mode: 0644]

index 7a10d94..c198930 100644 (file)
@@ -62,3 +62,9 @@ _site
 *.sublime-workspace
 *.sublime-project
 
+# Eclipse Project settings
+*.*project
+
+
+# CMake generated files
+*.gen.cmake
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..cc50a3a
--- /dev/null
@@ -0,0 +1,72 @@
+cmake_minimum_required(VERSION 2.8)
+project( Caffe )
+
+###    Build Options     ##########################################################################
+
+option(BUILD_PYTHON "Build Python wrapper" OFF)
+option(BUILD_MATLAB "Build Matlab wrapper" OFF)
+option(BUILD_EXAMPLES "Build examples" ON)
+option(BUILD_SHARED_LIBS "Build SHARED libs if ON and STATIC otherwise" OFF)
+
+if(NOT BLAS)
+    set(BLAS atlas)
+endif()
+
+if(NOT CUDA_TEST_DEVICE)
+    set(CUDA_TEST_DEVICE -1)
+endif()
+
+#    Install Prefix
+if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+    set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE )
+endif()
+
+###    Configuration    ###########################################################################
+
+#    Enable CTest from top build directory
+enable_testing()
+
+#    Compiler Flags
+set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall)
+set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC)
+set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} -O3)
+
+#    Include Directories
+set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include)
+include_directories(${${PROJECT_NAME}_INCLUDE_DIRS})
+include_directories(${CMAKE_SOURCE_DIR}/src)
+
+#      CMake module path for custom module finding
+set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts)
+
+#    CUDA is required globally
+find_package(CUDA 5.5 REQUIRED)
+include_directories(${CUDA_INCLUDE_DIRS})
+
+
+###    Subdirectories    ##########################################################################
+
+add_subdirectory(src/gtest)
+add_subdirectory(src/caffe)
+add_subdirectory(tools)
+
+if(BUILD_EXAMPLES)
+    message(STATUS "Examples enabled")
+    add_subdirectory(examples)
+endif()
+
+if(BUILD_PYTHON)
+    message(STATUS "Python enabled")
+    add_subdirectory(python)
+endif()
+
+if(BUILD_MATLAB)
+    message(STATUS "Matlab enabled")
+    add_subdirectory(matlab)
+endif()
+
+###    Install    #################################################################################
+
+#    Install Includes
+file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*)
+install(DIRECTORY ${folders} DESTINATION include)
diff --git a/CMakeScripts/FindAtlas.cmake b/CMakeScripts/FindAtlas.cmake
new file mode 100644 (file)
index 0000000..27657a6
--- /dev/null
@@ -0,0 +1,61 @@
+# Find the Atlas (and Lapack) libraries
+#
+# The following variables are optionally searched for defaults
+#  Atlas_ROOT_DIR:            Base directory where all Atlas components are found
+#
+# The following are set after configuration is done:
+#  Atlas_FOUND
+#  Atlas_INCLUDE_DIRS
+#  Atlas_LIBRARIES
+#  Atlas_LIBRARYRARY_DIRS
+
+set(Atlas_INCLUDE_SEARCH_PATHS
+  /usr/include/atlas
+  /usr/include/atlas-base
+  $ENV{Atlas_ROOT_DIR}
+  $ENV{Atlas_ROOT_DIR}/include
+)
+
+set(Atlas_LIB_SEARCH_PATHS
+  /usr/lib/atlas
+  /usr/lib/atlas-base
+  $ENV{Atlas_ROOT_DIR}
+  $ENV{Atlas_ROOT_DIR}/lib
+)
+
+find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS})
+find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS})
+find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas PATHS ${Atlas_LIB_SEARCH_PATHS})
+find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas PATHS ${Atlas_LIB_SEARCH_PATHS})
+find_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS})
+
+set(LOOKED_FOR
+
+  Atlas_CBLAS_INCLUDE_DIR
+  Atlas_CLAPACK_INCLUDE_DIR
+
+  Atlas_CBLAS_LIBRARY
+  Atlas_BLAS_LIBRARY
+  Atlas_LAPACK_LIBRARY
+)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR})
+
+if(ATLAS_FOUND)
+
+  mark_as_advanced(${LOOKED_FOR})
+
+  set(Atlas_INCLUDE_DIR
+    ${Atlas_CBLAS_INCLUDE_DIR}
+    ${Atlas_CLAPACK_INCLUDE_DIR}
+  )
+
+  set(Atlas_LIBRARIES
+    ${Atlas_LAPACK_LIBRARY}
+    ${Atlas_CBLAS_LIBRARY}
+    ${Atlas_BLAS_LIBRARY}
+  )
+
+endif(ATLAS_FOUND)
+
diff --git a/CMakeScripts/FindGlog.cmake b/CMakeScripts/FindGlog.cmake
new file mode 100644 (file)
index 0000000..0dc30ab
--- /dev/null
@@ -0,0 +1,48 @@
+# - Try to find Glog
+#
+# The following variables are optionally searched for defaults
+#  GLOG_ROOT_DIR:            Base directory where all GLOG components are found
+#
+# The following are set after configuration is done:
+#  GLOG_FOUND
+#  GLOG_INCLUDE_DIRS
+#  GLOG_LIBRARIES
+#  GLOG_LIBRARYRARY_DIRS
+
+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()
+    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})
+else()
+    find_library(GLOG_LIBRARY glog
+        PATHS ${GLOG_ROOT_DIR}
+        PATH_SUFFIXES
+            lib
+            lib64)
+endif()
+
+find_package_handle_standard_args(GLOG DEFAULT_MSG
+    GLOG_INCLUDE_DIR GLOG_LIBRARY)
+
+if(GLOG_FOUND)
+    set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR})
+    set(GLOG_LIBRARIES ${GLOG_LIBRARY})
+endif()
diff --git a/CMakeScripts/FindLAPACK.cmake b/CMakeScripts/FindLAPACK.cmake
new file mode 100644 (file)
index 0000000..9641c45
--- /dev/null
@@ -0,0 +1,190 @@
+# - Find LAPACK library
+# This module finds an installed fortran library that implements the LAPACK
+# linear-algebra interface (see http://www.netlib.org/lapack/).
+#
+# The approach follows that taken for the autoconf macro file, acx_lapack.m4
+# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).
+#
+# This module sets the following variables:
+#  LAPACK_FOUND - set to true if a library implementing the LAPACK interface is found
+#  LAPACK_LIBRARIES - list of libraries (using full path name) for LAPACK
+
+# Note: I do not think it is a good idea to mixup different BLAS/LAPACK versions
+# Hence, this script wants to find a Lapack library matching your Blas library
+
+# Do nothing if LAPACK was found before
+IF(NOT LAPACK_FOUND)
+
+SET(LAPACK_LIBRARIES)
+SET(LAPACK_INFO)
+
+IF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
+  FIND_PACKAGE(BLAS)
+ELSE(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
+  FIND_PACKAGE(BLAS REQUIRED)
+ENDIF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)
+
+# Old search lapack script
+include(CheckFortranFunctionExists)
+
+macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas)
+  # This macro checks for the existence of the combination of fortran libraries
+  # given by _list.  If the combination is found, this macro checks (using the
+  # Check_Fortran_Function_Exists macro) whether can link against that library
+  # combination using the name of a routine given by _name using the linker
+  # flags given by _flags.  If the combination of libraries is found and passes
+  # the link test, LIBRARIES is set to the list of complete library paths that
+  # have been found.  Otherwise, LIBRARIES is set to FALSE.
+  # N.B. _prefix is the prefix applied to the names of all cached variables that
+  # are generated internally and marked advanced by this macro.
+  set(_libraries_work TRUE)
+  set(${LIBRARIES})
+  set(_combined_name)
+  foreach(_library ${_list})
+    set(_combined_name ${_combined_name}_${_library})
+    if(_libraries_work)
+      if (WIN32)
+        find_library(${_prefix}_${_library}_LIBRARY
+          NAMES ${_library} PATHS ENV LIB PATHS ENV PATH)
+      else (WIN32)
+        if(APPLE)
+          find_library(${_prefix}_${_library}_LIBRARY
+            NAMES ${_library}
+            PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64
+            ENV DYLD_LIBRARY_PATH)
+        else(APPLE)
+          find_library(${_prefix}_${_library}_LIBRARY
+            NAMES ${_library}
+            PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64
+            ENV LD_LIBRARY_PATH)
+        endif(APPLE)
+      endif(WIN32)
+      mark_as_advanced(${_prefix}_${_library}_LIBRARY)
+      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})
+      set(_libraries_work ${${_prefix}_${_library}_LIBRARY})
+    endif(_libraries_work)
+  endforeach(_library ${_list})
+  if(_libraries_work)
+    # Test this combination of libraries.
+    set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas})
+    if (CMAKE_Fortran_COMPILER_WORKS)
+      check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS)
+    else (CMAKE_Fortran_COMPILER_WORKS)
+      check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS)
+    endif (CMAKE_Fortran_COMPILER_WORKS)
+    set(CMAKE_REQUIRED_LIBRARIES)
+    mark_as_advanced(${_prefix}${_combined_name}_WORKS)
+    set(_libraries_work ${${_prefix}${_combined_name}_WORKS})
+  endif(_libraries_work)
+  if(NOT _libraries_work)
+    set(${LIBRARIES} FALSE)
+  endif(NOT _libraries_work)
+endmacro(Check_Lapack_Libraries)
+
+
+if(BLAS_FOUND)
+
+  # Intel MKL
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "mkl"))
+    IF(MKL_LAPACK_LIBRARIES)
+      SET(LAPACK_LIBRARIES ${MKL_LAPACK_LIBRARIES} ${MKL_LIBRARIES})
+    ELSE(MKL_LAPACK_LIBRARIES)
+      SET(LAPACK_LIBRARIES ${MKL_LIBRARIES})
+    ENDIF(MKL_LAPACK_LIBRARIES)
+    SET(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIR})
+    SET(LAPACK_INFO "mkl")
+  ENDIF()
+
+  # OpenBlas
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "open"))
+    SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES})
+    check_function_exists("cheev_" OPEN_LAPACK_WORKS)
+    if(OPEN_LAPACK_WORKS)
+      SET(LAPACK_INFO "open")
+    else()
+      message(STATUS "It seems OpenBlas has not been compiled with Lapack support")
+    endif()
+  endif()
+
+  # GotoBlas
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "goto"))
+    SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES})
+    check_function_exists("cheev_" GOTO_LAPACK_WORKS)
+    if(GOTO_LAPACK_WORKS)
+      SET(LAPACK_INFO "goto")
+    else()
+      message(STATUS "It seems GotoBlas has not been compiled with Lapack support")
+    endif()
+  endif()
+
+  # ACML
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "acml"))
+    SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES})
+    check_function_exists("cheev_" ACML_LAPACK_WORKS)
+    if(ACML_LAPACK_WORKS)
+      SET(LAPACK_INFO "acml")
+    else()
+      message(STATUS "Strangely, this ACML library does not support Lapack?!")
+    endif()
+  endif()
+
+  # Accelerate
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "accelerate"))
+    SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES})
+    check_function_exists("cheev_" ACCELERATE_LAPACK_WORKS)
+    if(ACCELERATE_LAPACK_WORKS)
+      SET(LAPACK_INFO "accelerate")
+    else()
+      message(STATUS "Strangely, this Accelerate library does not support Lapack?!")
+    endif()
+  endif()
+
+  # vecLib
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "veclib"))
+    SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES})
+    check_function_exists("cheev_" VECLIB_LAPACK_WORKS)
+    if(VECLIB_LAPACK_WORKS)
+      SET(LAPACK_INFO "veclib")
+    else()
+      message(STATUS "Strangely, this vecLib library does not support Lapack?!")
+    endif()
+  endif()
+
+  # Generic LAPACK library?
+  IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "generic"))
+    check_lapack_libraries(
+      LAPACK_LIBRARIES
+      LAPACK
+      cheev
+      ""
+      "lapack"
+      "${BLAS_LIBRARIES}"
+      )
+    if(LAPACK_LIBRARIES)
+      SET(LAPACK_INFO "generic")
+    endif(LAPACK_LIBRARIES)
+  endif()
+
+else(BLAS_FOUND)
+  message(STATUS "LAPACK requires BLAS")
+endif(BLAS_FOUND)
+
+if(LAPACK_INFO)
+  set(LAPACK_FOUND TRUE)
+else(LAPACK_INFO)
+  set(LAPACK_FOUND FALSE)
+endif(LAPACK_INFO)
+
+IF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED)
+  message(FATAL_ERROR "Cannot find a library with LAPACK API. Please specify library location.")
+ENDIF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED)
+IF(NOT LAPACK_FIND_QUIETLY)
+  IF(LAPACK_FOUND)
+    MESSAGE(STATUS "Found a library with LAPACK API. (${LAPACK_INFO})")
+  ELSE(LAPACK_FOUND)
+    MESSAGE(STATUS "Cannot find a library with LAPACK API. Not using LAPACK.")
+  ENDIF(LAPACK_FOUND)
+ENDIF(NOT LAPACK_FIND_QUIETLY)
+
+# Do nothing if LAPACK was found before
+ENDIF(NOT LAPACK_FOUND)
diff --git a/CMakeScripts/FindLMDB.cmake b/CMakeScripts/FindLMDB.cmake
new file mode 100644 (file)
index 0000000..e615f54
--- /dev/null
@@ -0,0 +1,28 @@
+# Try to find the LMBD libraries and headers
+#  LMDB_FOUND - system has LMDB lib
+#  LMDB_INCLUDE_DIR - the LMDB include directory
+#  LMDB_LIBRARIES - Libraries needed to use LMDB
+
+# FindCWD based on FindGMP by:
+# Copyright (c) 2006, Laurent Montel, <montel@kde.org>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+
+# Adapted from FindCWD by:
+# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com>
+# Aug 31, 2013
+
+if (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES)
+  # Already in cache, be silent
+  set(LMDB_FIND_QUIETLY TRUE)
+endif (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES)
+
+find_path(LMDB_INCLUDE_DIR NAMES "lmdb.h" HINTS "$ENV{LMDB_DIR}/include")
+find_library(LMDB_LIBRARIES NAMES lmdb HINTS $ENV{LMDB_DIR}/lib )
+MESSAGE(STATUS "LMDB lib: " ${LMDB_LIBRARIES} )
+MESSAGE(STATUS "LMDB include: " ${LMDB_INCLUDE} )
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES)
+
+mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES)
diff --git a/CMakeScripts/FindLevelDB.cmake b/CMakeScripts/FindLevelDB.cmake
new file mode 100644 (file)
index 0000000..f3386f2
--- /dev/null
@@ -0,0 +1,37 @@
+# - Find LevelDB
+#
+#  LEVELDB_INCLUDE - Where to find leveldb/db.h
+#  LEVELDB_LIBS    - List of libraries when using LevelDB.
+#  LEVELDB_FOUND   - True if LevelDB found.
+
+get_filename_component(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+# Look for the header file.
+find_path(LEVELDB_INCLUDE NAMES leveldb/db.h PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include DOC "Path in which the file leveldb/db.h is located." )
+mark_as_advanced(LEVELDB_INCLUDE)
+
+# Look for the library.
+# Does this work on UNIX systems? (LINUX)
+find_library(LEVELDB_LIBS NAMES leveldb PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib DOC "Path to leveldb library." )
+mark_as_advanced(LEVELDB_LIBS)
+
+# Copy the results to the output variables.
+if (LEVELDB_INCLUDE AND LEVELDB_LIBS)
+  message(STATUS "Found leveldb in ${LEVELDB_INCLUDE} ${LEVELDB_LIBS}")
+  set(LEVELDB_FOUND 1)
+  include(CheckCXXSourceCompiles)
+  set(CMAKE_REQUIRED_LIBRARY ${LEVELDB_LIBS} pthread)
+  set(CMAKE_REQUIRED_INCLUDES ${LEVELDB_INCLUDE})
+ else ()
+   set(LEVELDB_FOUND 0)
+ endif ()
+
+ # Report the results.
+ if (NOT LEVELDB_FOUND)
+   set(LEVELDB_DIR_MESSAGE "LEVELDB was not found. Make sure LEVELDB_LIBS and LEVELDB_INCLUDE are set.")
+   if (LEVELDB_FIND_REQUIRED)
+     message(FATAL_ERROR "${LEVELDB_DIR_MESSAGE}")
+   elseif (NOT LEVELDB_FIND_QUIETLY)
+     message(STATUS "${LEVELDB_DIR_MESSAGE}")
+   endif ()
+ endif ()
\ No newline at end of file
diff --git a/CMakeScripts/FindMKL.cmake b/CMakeScripts/FindMKL.cmake
new file mode 100644 (file)
index 0000000..eb2d9f8
--- /dev/null
@@ -0,0 +1,113 @@
+# - Find Intel MKL\r
+# Find the MKL libraries\r
+#\r
+# Options:\r
+#\r
+#   MKL_STATAIC       :   use static linking\r
+#   MKL_MULTI_THREADED:   use multi-threading\r
+#   MKL_SDL           :   Single Dynamic Library interface\r
+#\r
+# This module defines the following variables:\r
+#\r
+#   MKL_FOUND            : True if MKL_INCLUDE_DIR are found\r
+#   MKL_INCLUDE_DIR      : where to find mkl.h, etc.\r
+#   MKL_INCLUDE_DIRS     : set when MKL_INCLUDE_DIR found\r
+#   MKL_LIBRARIES        : the library to link against.\r
+\r
+\r
+include(FindPackageHandleStandardArgs)\r
+\r
+set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs")\r
+set(MKL_ROOT ${INTEL_ROOT}/mkl CACHE PATH "Folder contains MKL")\r
+\r
+# Find include dir\r
+find_path(MKL_INCLUDE_DIR mkl.h\r
+    PATHS ${MKL_ROOT}/include)\r
+\r
+# Find include directory\r
+#  There is no include folder under linux\r
+if(WIN32)\r
+    find_path(INTEL_INCLUDE_DIR omp.h\r
+        PATHS ${INTEL_ROOT}/include)\r
+    set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} ${INTEL_INCLUDE_DIR})\r
+endif()\r
+\r
+# Find libraries\r
+\r
+# Handle suffix\r
+set(_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})\r
+\r
+if(WIN32)\r
+    if(MKL_STATAIC)\r
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .lib)\r
+    else()\r
+        set(CMAKE_FIND_LIBRARY_SUFFIXES _dll.lib)\r
+    endif()\r
+else()\r
+    if(MKL_STATAIC)\r
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .a)\r
+    else()\r
+        set(CMAKE_FIND_LIBRARY_SUFFIXES .so)\r
+    endif()\r
+endif()\r
+\r
+\r
+# MKL is composed by four layers: Interface, Threading, Computational and RTL\r
+\r
+if(MKL_SDL)\r
+    find_library(MKL_LIBRARY mkl_rt\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+\r
+    set(MKL_MINIMAL_LIBRARY ${MKL_LIBRARY})\r
+else()\r
+    ######################### Interface layer #######################\r
+    if(WIN32)\r
+        set(MKL_INTERFACE_LIBNAME mkl_intel_c)\r
+    else()\r
+        set(MKL_INTERFACE_LIBNAME mkl_intel)\r
+    endif()\r
+\r
+    find_library(MKL_INTERFACE_LIBRARY ${MKL_INTERFACE_LIBNAME}\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+\r
+    ######################## Threading layer ########################\r
+    if(MKL_MULTI_THREADED)\r
+        set(MKL_THREADING_LIBNAME mkl_intel_thread)\r
+    else()\r
+        set(MKL_THREADING_LIBNAME mkl_sequential)\r
+    endif()\r
+\r
+    find_library(MKL_THREADING_LIBRARY ${MKL_THREADING_LIBNAME}\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+\r
+    ####################### Computational layer #####################\r
+    find_library(MKL_CORE_LIBRARY mkl_core\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+    find_library(MKL_FFT_LIBRARY mkl_cdft_core\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+    find_library(MKL_SCALAPACK_LIBRARY mkl_scalapack_core\r
+        PATHS ${MKL_ROOT}/lib/ia32/)\r
+\r
+    ############################ RTL layer ##########################\r
+    if(WIN32)\r
+        set(MKL_RTL_LIBNAME libiomp5md)\r
+    else()\r
+        set(MKL_RTL_LIBNAME libiomp5)\r
+    endif()\r
+    find_library(MKL_RTL_LIBRARY ${MKL_RTL_LIBNAME}\r
+        PATHS ${INTEL_RTL_ROOT}/lib)\r
+\r
+    set(MKL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_FFT_LIBRARY} ${MKL_SCALAPACK_LIBRARY} ${MKL_RTL_LIBRARY})\r
+    set(MKL_MINIMAL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_RTL_LIBRARY})\r
+endif()\r
+\r
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})\r
+\r
+find_package_handle_standard_args(MKL DEFAULT_MSG\r
+    MKL_INCLUDE_DIR MKL_LIBRARY MKL_MINIMAL_LIBRARY)\r
+\r
+if(MKL_FOUND)\r
+    set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR})\r
+    set(MKL_LIBRARIES ${MKL_LIBRARY})\r
+    set(MKL_MINIMAL_LIBRARIES ${MKL_LIBRARY})\r
+endif()\r
diff --git a/CMakeScripts/FindOpenBLAS.cmake b/CMakeScripts/FindOpenBLAS.cmake
new file mode 100644 (file)
index 0000000..297a7b6
--- /dev/null
@@ -0,0 +1,62 @@
+
+
+SET(Open_BLAS_INCLUDE_SEARCH_PATHS
+  /usr/include
+  /usr/include/openblas-base
+  /usr/local/include
+  /usr/local/include/openblas-base
+  /opt/OpenBLAS/include
+  $ENV{OpenBLAS_HOME}
+  $ENV{OpenBLAS_HOME}/include
+)
+
+SET(Open_BLAS_LIB_SEARCH_PATHS
+        /lib/
+        /lib/openblas-base
+        /lib64/
+        /usr/lib
+        /usr/lib/openblas-base
+        /usr/lib64
+        /usr/local/lib
+        /usr/local/lib64
+        /opt/OpenBLAS/lib
+        $ENV{OpenBLAS}cd
+        $ENV{OpenBLAS}/lib
+        $ENV{OpenBLAS_HOME}
+        $ENV{OpenBLAS_HOME}/lib
+ )
+
+FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${ATLAS_POSSIBLE_INCLUDE_PATHS})
+FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS})
+
+SET(OpenBLAS_FOUND ON)
+
+#    Check include files
+IF(NOT OpenBLAS_INCLUDE_DIR)
+    SET(OpenBLAS_FOUND OFF)
+    MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off")
+ENDIF()
+
+#    Check libraries
+IF(NOT OpenBLAS_LIB)
+    SET(OpenBLAS_FOUND OFF)
+    MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off")
+ENDIF()
+
+IF (OpenBLAS_FOUND)
+  IF (NOT OpenBLAS_FIND_QUIETLY)
+    MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}")
+    MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}")
+  ENDIF (NOT OpenBLAS_FIND_QUIETLY)
+ELSE (OpenBLAS_FOUND)
+  IF (OpenBLAS_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find OpenBLAS")
+  ENDIF (OpenBLAS_FIND_REQUIRED)
+ENDIF (OpenBLAS_FOUND)
+
+MARK_AS_ADVANCED(
+    OpenBLAS_INCLUDE_DIR
+    OpenBLAS_LIB
+    OpenBLAS
+)
+
index 287120a..2c3ce54 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -512,12 +512,12 @@ proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER)
 
 $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \
                $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR)
-       protoc --proto_path=src --cpp_out=$(BUILD_DIR)/src $<
+       protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
        @ echo
 
 $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \
                $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR)
-       protoc --proto_path=src --python_out=python $<
+       protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<
        @ echo
 
 $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR)
diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f6a03ee
--- /dev/null
@@ -0,0 +1 @@
+project( Matlab )
\ No newline at end of file
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e09257c
--- /dev/null
@@ -0,0 +1,20 @@
+project( Python )
+
+#    Python
+find_package(PythonLibs REQUIRED)
+include_directories(${PYTHON_INCLUDE_DIRS})
+
+#    Boost.Python
+find_package(Boost 1.49 COMPONENTS python REQUIRED)
+include_directories(${Boost_INCLUDE_DIRS})
+
+file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+
+add_library(pycaffe SHARED ${Python_SOURCES})
+target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES})
+
+###    Install    #################################################################################
+
+install(DIRECTORY caffe DESTINATION python)
+install(FILES requirements.txt DESTINATION python)
+install(TARGETS pycaffe DESTINATION python/caffe)
\ No newline at end of file
diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt
new file mode 100644 (file)
index 0000000..d953d0b
--- /dev/null
@@ -0,0 +1,105 @@
+project( CaffeSrc )
+
+#    Threads
+find_package(Threads REQUIRED)
+
+#      Google-glog
+find_package(Glog REQUIRED)
+include_directories(${GLOG_INCLUDE_DIRS})
+
+#    CUDA
+set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}
+        -gencode arch=compute_20,code=sm_20
+               -gencode arch=compute_20,code=sm_21
+               -gencode arch=compute_30,code=sm_30
+               -gencode arch=compute_35,code=sm_35
+)
+
+#   BLAS
+if(BLAS STREQUAL "atlas")
+
+    find_package(Atlas REQUIRED)
+    include_directories(${Atlas_INCLUDE_DIR})
+    set(BLAS_LIBRARIES ${Atlas_LIBRARIES})
+
+elseif(BLAS STREQUAL "open")
+
+    find_package(OpenBLAS REQUIRED)
+    include_directories(${OpenBLAS_INCLUDE_DIR})
+    set(BLAS_LIBRARIES ${OpenBLAS_LIB})
+
+elseif(BLAS STREQUAL "mkl")
+
+    find_package(MKL REQUIRED)
+    include_directories(${MKL_INCLUDE_DIR})
+    set(BLAS_LIBRARIES ${MKL_LIBRARIES})
+
+endif()
+
+#    HDF5
+find_package(HDF5 COMPONENTS HL REQUIRED)
+include_directories(${HDF5_INCLUDE_DIRS})
+
+#    OpenCV
+find_package(OpenCV COMPONENTS core highgui imgproc REQUIRED)
+include_directories(${OpenCV_INCLUDE_DIRS})
+
+#    LevelDB
+find_package(LevelDB REQUIRED)
+include_directories(${LEVELDB_INCLUDE})
+
+#    LMDB
+find_package(LMDB REQUIRED)
+include_directories(${LMDB_INCLUDE_DIR})
+
+#    Boost
+find_package(Boost 1.46 COMPONENTS system REQUIRED)
+include_directories( ${Boost_INCLUDE_DIR} )
+link_directories( ${Boost_LIBRARY_DIRS} )
+
+add_subdirectory(proto)
+
+#    Recursively find source files
+
+#    cuda sources
+file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu)
+
+#    test sources
+file(GLOB_RECURSE TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp)
+
+#    all cpp sources
+file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+
+#    remove test sources from cpp sources
+list(REMOVE_ITEM CPP_SOURCES ${TEST_SOURCES})
+
+add_library(caffe ${CPP_SOURCES})
+cuda_add_library(caffe_cu ${CU_SOURCES})
+
+# both depend on proto
+add_dependencies(caffe proto)
+add_dependencies(caffe_cu proto)
+
+target_link_libraries(caffe caffe_cu proto
+        ${GLOG_LIBRARIES}
+        ${CUDA_curand_LIBRARY}
+        ${HDF5_LIBRARIES}
+        ${OpenCV_LIBS}
+        ${LEVELDB_LIBS}
+        ${LMDB_LIBRARIES} 
+        ${CUDA_CUBLAS_LIBRARIES}
+        ${BLAS_LIBRARIES}
+        ${CMAKE_THREAD_LIBS_INIT}
+)
+
+#set output directory
+set_target_properties(caffe PROPERTIES
+        ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
+        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
+)
+
+add_subdirectory(test)
+
+###    Install    #################################################################################
+
+install(TARGETS caffe DESTINATION lib)
diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt
new file mode 100644 (file)
index 0000000..a4b2c00
--- /dev/null
@@ -0,0 +1,35 @@
+cmake_minimum_required(VERSION 2.8)
+project( Proto )
+
+#      Google Protocol Buffers
+find_package( Protobuf REQUIRED )
+
+# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package and should be installed
+# separately as in: sudo apt-get install protobuf-compiler
+if(PROTOBUF_PROTOC_EXECUTABLE)
+       message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}")
+else()
+       message(FATAL_ERROR "Could not find PROTOBUF Compiler")
+endif()
+
+include_directories(${PROTOBUF_INCLUDE_DIR})
+file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto")
+PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles})
+
+add_library(proto
+        ${ProtoSources}
+        ${ProtoHeaders}
+)
+
+target_link_libraries(proto ${PROTOBUF_LIBRARIES})
+
+# Copy proto headers to include/caffe/proto/
+foreach(header ${ProtoHeaders})
+
+    ADD_CUSTOM_COMMAND(TARGET proto
+        COMMAND cmake -E copy ${header}
+        ${Caffe_INCLUDE_DIRS}/caffe/proto/
+        DEPENDS ${header}
+)
+
+endforeach(header)
index 225138a..6f0a5f6 100644 (file)
@@ -2,7 +2,7 @@ syntax = "proto2";
 
 package caffe;
 
-import "caffe/proto/caffe.proto";
+import "caffe.proto";
 
 // A near-duplicate of NetParameter with fields re-numbered to beautify
 // automatic prototext dumps.  The main practical purpose is to print inputs
diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt
new file mode 100644 (file)
index 0000000..721df27
--- /dev/null
@@ -0,0 +1,46 @@
+#
+#
+#    All test files' names must begin with a "test_" prefix
+#
+#
+cmake_minimum_required(VERSION 2.8)
+project( Test )
+
+#    Set CUDA Device number and CMAKE_SOURCE_DIR
+add_definitions(-DCMAKE_BUILD)
+configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in
+    ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake
+)
+
+configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in
+    ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake
+)
+
+include_directories(
+        ${Caffe_SOURCE_DIR}
+)
+
+set(TEST_MAIN test_caffe_main.cpp)
+list(REMOVE_ITEM TEST_SOURCES ${TEST_MAIN})
+
+
+foreach(source ${TEST_SOURCES})
+
+    get_filename_component(name ${source} NAME_WE)
+    add_executable(${name}.test ${TEST_MAIN} ${source} ../blob.cpp)
+    target_link_libraries(${name}.test gtest caffe)
+    add_test(${name} ${name}.test)
+
+    #    output dir
+    set_target_properties(${name}.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)
+
+endforeach()
+
+add_executable(test_all.test ${TEST_SOURCES} ${TEST_MAIN})
+target_link_libraries(test_all.test gtest caffe)
+
+#    output dir
+set_target_properties(test_all.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test)
+
diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in
new file mode 100644 (file)
index 0000000..617968d
--- /dev/null
@@ -0,0 +1,5 @@
+
+#define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@
+#define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/"
+#define Examples_SOURCE_DIR "@Examples_SOURCE_DIR@/"
+#define CMAKE_EXT ".gen.cmake"
\ No newline at end of file
index df188fd..ad6e189 100644 (file)
@@ -26,6 +26,10 @@ int main(int argc, char** argv) {
     device = atoi(argv[1]);
     cudaSetDevice(device);
     cout << "Setting to use device " << device << endl;
+  } else if (CUDA_TEST_DEVICE >= 0) {
+
+         // Use the device assigned in build configuration; but with a lower priority
+         device = CUDA_TEST_DEVICE;
   }
   cudaGetDevice(&device);
   cout << "Current device id: " << device << endl;
diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp
new file mode 100644 (file)
index 0000000..76f50be
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2014 BVLC and contributors.
+
+// The main caffe test code. Your test cpp code should include this hpp
+// to allow a main function to be compiled into the binary.
+#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_
+#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_
+
+#include <cuda_runtime.h>
+#include <glog/logging.h>
+#include <gtest/gtest.h>
+
+#include <cstdlib>
+#include <cstdio>
+
+using std::cout;
+using std::endl;
+
+#ifdef CMAKE_BUILD
+       #include "cmake_test_defines.hpp.gen.cmake"
+#else
+       #define CUDA_TEST_DEVICE -1
+       #define CMAKE_SOURCE_DIR "src/"
+       #define Examples_SOURCE_DIR "examples/"
+       #define CMAKE_EXT ""
+#endif
+
+int main(int argc, char** argv);
+
+#endif  // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_
diff --git a/src/caffe/test/test_data/sample_data_list.txt.in b/src/caffe/test/test_data/sample_data_list.txt.in
new file mode 100644 (file)
index 0000000..9860ef5
--- /dev/null
@@ -0,0 +1,2 @@
+@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data.h5
+@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data_2_gzip.h5
\ No newline at end of file
index 696165c..f3ddfcd 100644 (file)
@@ -23,7 +23,7 @@ class HDF5OutputLayerTest : public MultiDeviceTest<TypeParam> {
  protected:
   HDF5OutputLayerTest()
       : output_file_name_(tmpnam(NULL)),
-        input_file_name_("src/caffe/test/test_data/sample_data.h5"),
+        input_file_name_(CMAKE_SOURCE_DIR  "caffe/test/test_data/sample_data.h5"),
         blob_data_(new Blob<Dtype>()),
         blob_label_(new Blob<Dtype>()),
         num_(5),
index f903afb..1de8233 100644 (file)
@@ -31,7 +31,7 @@ class HDF5DataLayerTest : public MultiDeviceTest<TypeParam> {
     blob_top_vec_.push_back(blob_top_label_);
 
     // Check out generate_sample_data.py in the same directory.
-    filename = new string("src/caffe/test/test_data/sample_data_list.txt");
+    filename = new string(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data_list.txt" CMAKE_EXT);
     LOG(INFO) << "Using sample HDF5 data file " << filename;
   }
 
index 5232c11..17d67bd 100644 (file)
@@ -37,7 +37,7 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> {
     std::ofstream outfile(filename_->c_str(), std::ofstream::out);
     LOG(INFO) << "Using temporary file " << *filename_;
     for (int i = 0; i < 5; ++i) {
-      outfile << "examples/images/cat.jpg " << i;
+      outfile << Examples_SOURCE_DIR "images/cat.jpg " << i;
     }
     outfile.close();
   }
diff --git a/src/gtest/CMakeLists.txt b/src/gtest/CMakeLists.txt
new file mode 100644 (file)
index 0000000..82a4120
--- /dev/null
@@ -0,0 +1,6 @@
+project(gtest CXX C)
+cmake_minimum_required(VERSION 2.6.2)
+
+add_library(gtest gtest-all.cpp)
+add_library(gtest_main gtest_main.cc)
+target_link_libraries(gtest_main gtest)
\ No newline at end of file
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
new file mode 100644 (file)
index 0000000..81ecf7c
--- /dev/null
@@ -0,0 +1,18 @@
+project( Tools )
+
+#    Find all source files
+file(GLOB_RECURSE Tools_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+
+#    Build each source file independently
+foreach(source ${Tools_SOURCES})
+    get_filename_component(name ${source} NAME_WE)
+    add_executable(${name} ${source})
+    target_link_libraries(${name} caffe)
+
+###    Install    #################################################################################
+
+    install(TARGETS ${name} DESTINATION tools)
+
+
+endforeach(source)
+