Merge pull request #1261 from kmatzen/minor_changes
[platform/upstream/caffeonacl.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.8)
2 project( Caffe )
3
4 ###    Build Options     ##########################################################################
5
6 option(CPU_ONLY "Build Caffe without GPU support" OFF)
7 option(BUILD_PYTHON "Build Python wrapper" OFF)
8 option(BUILD_MATLAB "Build Matlab wrapper" OFF)
9 option(BUILD_EXAMPLES "Build examples" ON)
10 option(BUILD_SHARED_LIBS "Build SHARED libs if ON and STATIC otherwise" OFF)
11
12 if(NOT BLAS)
13     set(BLAS atlas)
14 endif()
15
16 if(NOT CUDA_TEST_DEVICE)
17     set(CUDA_TEST_DEVICE -1)
18 endif()
19
20 #    Install Prefix
21 if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
22     set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE )
23 endif()
24
25 ###    Configuration    ###########################################################################
26 #    Compiler Flags
27 set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall)
28 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) # set global flags
29 set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # set debug flags
30 set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) # set release flags
31
32 #    Link Flags
33 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")  # clang++
34   set(CAFFE_STATIC_LINK -Wl,-force_load $(STATIC_NAME))
35 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")  # g++
36   set(CAFFE_STATIC_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive)
37 endif()
38
39 #    Global Definitions
40 if(CPU_ONLY)
41     add_definitions(-DCPU_ONLY)
42 endif()
43
44 #    Include Directories
45 set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include)
46 include_directories(${${PROJECT_NAME}_INCLUDE_DIRS})
47 include_directories(${CMAKE_SOURCE_DIR}/src)
48
49 #    CMake Scripts dir
50 set(CMAKE_SCRIPT_DIR ${CMAKE_SOURCE_DIR}/CMakeScripts)
51
52 #        CMake module path for custom module finding
53 set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SCRIPT_DIR})
54
55 ###    Dependencies    ##########################################################################
56
57 #    Boost
58 find_package(Boost 1.46 COMPONENTS system thread REQUIRED)
59 include_directories(${Boost_INCLUDE_DIR})
60 link_directories(${Boost_LIBRARY_DIRS})
61
62 #    CUDA
63 if(NOT CPU_ONLY)
64     find_package(CUDA 5.5 REQUIRED)
65     include_directories(${CUDA_INCLUDE_DIRS})
66
67     set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}
68             -gencode arch=compute_20,code=sm_20
69             -gencode arch=compute_20,code=sm_21
70             -gencode arch=compute_30,code=sm_30
71             -gencode arch=compute_35,code=sm_35
72     )
73
74     # https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt
75     # work-arounds
76     if(Boost_VERSION EQUAL 105500)
77         # see https://svn.boost.org/trac/boost/ticket/9392
78         message(STATUS "Boost: Applying noinline work around")
79         # avoid warning for CMake >= 2.8.12
80         set(CUDA_NVCC_FLAGS
81           "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ")
82     endif(Boost_VERSION EQUAL 105500)
83 endif()
84
85 #    Threads
86 find_package(Threads REQUIRED)
87
88 #        Google-glog
89 find_package(Glog REQUIRED)
90 include_directories(${GLOG_INCLUDE_DIRS})
91
92 #    Google-gflags
93 find_package(GFlags REQUIRED)
94 include_directories(${GFLAGS_INCLUDE_DIRS})
95
96 #    BLAS
97 if(BLAS STREQUAL "atlas")
98
99     find_package(Atlas REQUIRED)
100     include_directories(${Atlas_INCLUDE_DIR})
101     set(BLAS_LIBRARIES ${Atlas_LIBRARIES})
102
103 elseif(BLAS STREQUAL "open")
104
105     find_package(OpenBLAS REQUIRED)
106     include_directories(${OpenBLAS_INCLUDE_DIR})
107     set(BLAS_LIBRARIES ${OpenBLAS_LIB})
108
109 elseif(BLAS STREQUAL "mkl")
110
111     find_package(MKL REQUIRED)
112     include_directories(${MKL_INCLUDE_DIR})
113     set(BLAS_LIBRARIES ${MKL_LIBRARIES})
114
115 endif()
116
117 #    HDF5
118 find_package(HDF5 COMPONENTS HL REQUIRED)
119 include_directories(${HDF5_INCLUDE_DIRS})
120
121 #    LevelDB
122 find_package(LevelDB REQUIRED)
123 include_directories(${LEVELDB_INCLUDE})
124 if(LEVELDB_FOUND)
125     find_package(Snappy REQUIRED)
126     include_directories(${SNAPPY_INCLUDE_DIR})
127     set(LEVELDB_LIBS
128         ${LEVELDB_LIBS}
129         ${SNAPPY_LIBS}
130     )
131 endif()
132
133 #    LMDB
134 find_package(LMDB REQUIRED)
135 include_directories(${LMDB_INCLUDE_DIR})
136
137 #    OpenCV
138 find_package(OpenCV REQUIRED)
139 include_directories(${OpenCV_INCLUDE_DIRS})
140
141 ###    Subdirectories    ##########################################################################
142
143 add_subdirectory(src/gtest)
144 add_subdirectory(src/caffe)
145 add_subdirectory(tools)
146
147 if(BUILD_EXAMPLES)
148     message(STATUS "Examples enabled")
149     add_subdirectory(examples)
150 endif()
151
152 if(BUILD_PYTHON)
153     message(STATUS "Python enabled")
154     add_subdirectory(python)
155 endif()
156
157 if(BUILD_MATLAB)
158     message(STATUS "Matlab enabled")
159     add_subdirectory(matlab)
160 endif()
161
162 ###    Lint Target Setup    ##########################################################################
163
164 set(LINT_TARGET lint)
165 set(LINT_SCRIPT ${CMAKE_SCRIPT_DIR}/lint.cmake)
166 add_custom_target(
167     ${LINT_TARGET}
168     COMMAND ${CMAKE_COMMAND} -P ${LINT_SCRIPT}
169 )
170
171 ###    Install    #################################################################################
172
173 #    Install Includes
174 file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*)
175 install(DIRECTORY ${folders} DESTINATION include)
176
177