|
| 1 | +project (LBANN) |
| 2 | +cmake_minimum_required (VERSION 2.8.8) |
| 3 | +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules) |
| 4 | + |
| 5 | +# |
| 6 | +# Options |
| 7 | +# |
| 8 | +#option(CMAKE_INSTALL_RPATH_USE_LINK_PATH "Use Rpath for dependencies." TRUE) |
| 9 | +#option(HAVOQGT_BUILD_TEST "Build HAVOQGT tests." TRUE) |
| 10 | + |
| 11 | +################################################################################ |
| 12 | +# Always full RPATH |
| 13 | +################################################################################ |
| 14 | +# use, i.e. don't skip the full RPATH for the build tree |
| 15 | +SET(CMAKE_SKIP_BUILD_RPATH FALSE) |
| 16 | + |
| 17 | +# when building, don't use the install RPATH already |
| 18 | +# (but later on when installing) |
| 19 | +SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) |
| 20 | + |
| 21 | +SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") |
| 22 | + |
| 23 | +# add the automatically determined parts of the RPATH |
| 24 | +# which point to directories outside the build tree to the install RPATH |
| 25 | +SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
| 26 | + |
| 27 | +# the RPATH to be used when installing, but only if it's not a system directory |
| 28 | +LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) |
| 29 | +IF("${isSystemDir}" STREQUAL "-1") |
| 30 | + SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") |
| 31 | +ENDIF("${isSystemDir}" STREQUAL "-1") |
| 32 | +################################################################################ |
| 33 | + |
| 34 | +# Get the git version so that we can embed it into the executable |
| 35 | +execute_process(COMMAND git describe --abbrev=7 --dirty --always --tags OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 36 | +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVERSION=\\\"${GIT_VERSION}\\\"" ) |
| 37 | + |
| 38 | +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC" ) |
| 39 | + |
| 40 | +# |
| 41 | +# Main Include directory |
| 42 | +# |
| 43 | +include_directories("${PROJECT_SOURCE_DIR}/include") |
| 44 | +include_directories("${PROJECT_SOURCE_DIR}/include/lbann") |
| 45 | +include_directories("${PROJECT_SOURCE_DIR}") |
| 46 | + |
| 47 | +include(CheckSymbolExists) |
| 48 | + |
| 49 | +# |
| 50 | +# Link in CUDA,cuDNN |
| 51 | +# |
| 52 | +find_package(CUDA QUIET) |
| 53 | +if (CUDA_FOUND AND CMAKE_CUDNN_DIR) |
| 54 | + include(FindCUDA) |
| 55 | + include_directories("${CUDA_TOOLKIT_ROOT_DIR}/include") |
| 56 | + link_directories("${CUDA_TOOLKIT_ROOT_DIR}/lib64") |
| 57 | + include_directories("${CMAKE_CUDNN_DIR}/include") |
| 58 | + link_directories("${CMAKE_CUDNN_DIR}/lib64") |
| 59 | + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__LIB_CUDNN" ) |
| 60 | + #CUDA_LIBS = -lcudart -lcublas |
| 61 | + set(CUDNN_LIBRARIES -lcudnn) |
| 62 | +endif() |
| 63 | + |
| 64 | +macro(link_cudnn target) |
| 65 | + target_link_libraries(${target} ${CUDA_LIBRARIES} ${CUDNN_LIBRARIES}) |
| 66 | +endmacro() |
| 67 | + |
| 68 | +# |
| 69 | +# Build nested source lists |
| 70 | +# |
| 71 | +macro (add_sources) |
| 72 | + file (RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") |
| 73 | + foreach (_src ${ARGN}) |
| 74 | + if (_relPath) |
| 75 | + list (APPEND SRCS "${_relPath}/${_src}") |
| 76 | + else() |
| 77 | + list (APPEND SRCS "${_src}") |
| 78 | + endif() |
| 79 | + endforeach() |
| 80 | + if (_relPath) |
| 81 | + # propagate SRCS to parent directory |
| 82 | + set (SRCS ${SRCS} PARENT_SCOPE) |
| 83 | + endif() |
| 84 | +endmacro() |
| 85 | + |
| 86 | +# TBinf (Tensorboard interface) |
| 87 | +# This must come first so the right protobuf libraries are found. |
| 88 | +if(CMAKE_TBINF) |
| 89 | + include_directories(external/TBinf) |
| 90 | + add_sources(external/TBinf/TBinf.cpp) |
| 91 | + add_sources(external/TBinf/summary.pb.cc) |
| 92 | + add_sources(external/TBinf/event.pb.cc) |
| 93 | + set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__HAVE_TBINF" ) |
| 94 | + if(CMAKE_PROTOBUF) |
| 95 | + # Need to get ahead of the system protobuf version for now. |
| 96 | + include_directories(BEFORE "${CMAKE_PROTOBUF}/include") |
| 97 | + link_directories("${CMAKE_PROTOBUF}/lib") |
| 98 | + endif(CMAKE_PROTOBUF) |
| 99 | +endif(CMAKE_TBINF) |
| 100 | +macro(include_link_tbinf target) |
| 101 | + if(CMAKE_TBINF) |
| 102 | + target_link_libraries(${target} protobuf) |
| 103 | + endif(CMAKE_TBINF) |
| 104 | +endmacro() |
| 105 | + |
| 106 | +# Link in OpenCV |
| 107 | +include_directories("/usr/gapps/brain/installs/generic/include") |
| 108 | +link_directories("/usr/gapps/brain/installs/generic/lib") |
| 109 | +#CV_LIBS = -lopencv_core -lopencv_highgui |
| 110 | +set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__LIB_OPENCV" ) |
| 111 | + |
| 112 | +# |
| 113 | +# MPI is required |
| 114 | +# |
| 115 | +find_package( MPI REQUIRED ) |
| 116 | +macro(include_link_mpi target) |
| 117 | + include_directories(${MPI_INCLUDE_PATH}) |
| 118 | + target_link_libraries(${target} ${MPI_LIBRARIES}) |
| 119 | +endmacro() |
| 120 | + |
| 121 | +# |
| 122 | +# OpenCV is required |
| 123 | +# |
| 124 | +#set(OpenCV_STATIC ON) |
| 125 | +#set(OpenCV_CUDA OFF) |
| 126 | + |
| 127 | +find_package( OpenCV REQUIRED HINTS ${OpenCV_DIR}) |
| 128 | +#find_package( OpenCV REQUIRED HINTS ${CMAKE_OPENCV_DIR}) |
| 129 | +if(OpenCV_FOUND) |
| 130 | + include_directories("${OpenCV_INCLUDE_DIRS}") |
| 131 | + set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D__LIB_OPENCV" ) |
| 132 | + message("-- Found OpenCV version: ${OpenCV_VERSION} ${OpenCV_DIR}") |
| 133 | +endif() |
| 134 | + |
| 135 | +macro(link_opencv target) |
| 136 | + target_link_libraries(${target} ${OpenCV_LIBRARIES}) |
| 137 | +endmacro() |
| 138 | + |
| 139 | +if(NOT ${CMAKE_CXX_COMPILER} MATCHES "icpc") |
| 140 | + find_package( OpenBLAS HINTS ${OpenBLAS_DIR}) |
| 141 | + if(OpenBLAS_FOUND) |
| 142 | + include_directories("${OpenBLAS_INCLUDE_DIRS}") |
| 143 | + message("-- Found OpenBLAS version: ${OpenBLAS_VERSION} ${OpenBLAS_DIR}") |
| 144 | + endif() |
| 145 | +endif() |
| 146 | + |
| 147 | +macro(link_openblas target) |
| 148 | + target_link_libraries(${target} ${OpenBLAS_LIBRARIES}) |
| 149 | +endmacro() |
| 150 | + |
| 151 | +# |
| 152 | +# Doxygen |
| 153 | +# |
| 154 | +find_package(Doxygen) |
| 155 | +if(DOXYGEN_FOUND) |
| 156 | +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in |
| 157 | + ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile @ONLY) |
| 158 | +add_custom_target(doc |
| 159 | + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile |
| 160 | + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc |
| 161 | + COMMENT "Generating API documentation with Doxygen" VERBATIM |
| 162 | + ) |
| 163 | +endif(DOXYGEN_FOUND) |
| 164 | + |
| 165 | +# |
| 166 | +# Elemental is required |
| 167 | +# |
| 168 | + |
| 169 | +if(CMAKE_ELEMENTAL_DIR) |
| 170 | + include_directories("${CMAKE_ELEMENTAL_DIR}/include/") |
| 171 | + link_directories("${CMAKE_ELEMENTAL_DIR}/lib/") |
| 172 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__LIB_ELEMENTAL" ) |
| 173 | + message("-- Manually including Elemental Libraries: ${CMAKE_ELEMENTAL_DIR}") |
| 174 | +else() |
| 175 | +find_package(Elemental REQUIRED HINTS ${Elemental_ROOT_DIR}) |
| 176 | +if(Elemental_FOUND) |
| 177 | + set(CMAKE_CXX_FLAGS "${Elemental_COMPILE_FLAGS}") |
| 178 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__LIB_ELEMENTAL" ) |
| 179 | + include_directories(${Elemental_INCLUDE_DIRS}) |
| 180 | + add_definitions(${Elemental_DEFINITIONS}) |
| 181 | + message("-- Found Elemental Libraries: ${Elemental_LIBRARIES} ${Elemental_DIR}") |
| 182 | +else() |
| 183 | +# add_subdirectory(external/Elemental) |
| 184 | + message(FATAL_ERROR "Could not locate Elemental installation") |
| 185 | +endif() |
| 186 | + |
| 187 | +macro(link_elemental target) |
| 188 | + target_link_libraries(${target} ${Elemental_LIBRARIES}) |
| 189 | + if(Elemental_LINK_FLAGS) |
| 190 | + set_target_properties(${target} PROPERTIES LINK_FLAGS ${Elemental_LINK_FLAGS}) |
| 191 | + endif() |
| 192 | +endmacro() |
| 193 | +endif() |
| 194 | + |
| 195 | +include_directories(${MPI_CXX_INCLUDE_PATH}) |
| 196 | + |
| 197 | + |
| 198 | +# Build LBANN |
| 199 | + |
| 200 | +add_subdirectory (src) |
| 201 | +add_subdirectory (model_zoo) |
| 202 | +#enable_testing() |
| 203 | +#add_subdirectory (test) |
| 204 | + |
| 205 | +add_library(src OBJECT ${SRCS}) |
| 206 | +if(NOT CMAKE_ELEMENTAL_DIR) |
| 207 | + add_dependencies(src El) |
| 208 | +endif(NOT CMAKE_ELEMENTAL_DIR) |
| 209 | + |
| 210 | +set( LIBRARY_TYPE SHARED ) |
| 211 | +add_library(lbann ${LIBRARY_TYPE} $<TARGET_OBJECTS:src>) |
| 212 | + |
| 213 | +# Link in found libraries |
| 214 | +link_opencv(lbann) |
| 215 | + include_link_tbinf(lbann) |
| 216 | + if(CMAKE_ELEMENTAL_DIR) |
| 217 | + target_link_libraries(lbann El) |
| 218 | +else() |
| 219 | + link_elemental(lbann) |
| 220 | +endif() |
| 221 | + |
| 222 | +if(OpenBLAS_FOUND) |
| 223 | + link_openblas(lbann) |
| 224 | +endif() |
| 225 | + |
| 226 | +if(CUDA_FOUND) |
| 227 | + link_cudnn(lbann) |
| 228 | +endif() |
| 229 | + |
| 230 | +#link_directories(core) |
| 231 | +# |
| 232 | +# Configuration Summary |
| 233 | +# |
| 234 | +message("== Configuration Summary ==") |
| 235 | +message(" CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}") |
| 236 | +if(CMAKE_BUILD_TYPE MATCHES None) |
| 237 | + message(" - CXX FLAGS: ${CMAKE_CXX_FLAGS}") |
| 238 | +elseif(CMAKE_BUILD_TYPE MATCHES Release) |
| 239 | + message(" - CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}") |
| 240 | +elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo) |
| 241 | + message(" - CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") |
| 242 | +elseif(CMAKE_BUILD_TYPE MATCHES Debug) |
| 243 | + message(" - CXX FLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}") |
| 244 | +endif() |
| 245 | +#message(" LBANN_BUILD_TEST: ${LBANN_BUILD_TEST}") |
| 246 | +message(" MPI_FOUND: ${MPI_FOUND}") |
| 247 | +message(" DOXYGEN_FOUND: ${DOXYGEN_FOUND}") |
| 248 | +message(" Elemental_FOUND: ${Elemental_FOUND}") |
| 249 | +message(" OpenCV_FOUND: ${OpenCV_FOUND}") |
| 250 | +#MPI params found |
| 251 | +if(MPI_FOUND) |
| 252 | + message(" MPIEXEC: ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} PROCS |
| 253 | + ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS") |
| 254 | +endif(MPI_FOUND) |
| 255 | +if(CMAKE_TBINF) |
| 256 | + message(" TBinf: ${CMAKE_TBINF}") |
| 257 | +endif(CMAKE_TBINF) |
0 commit comments