CMakeLists.txt 26.5 KB
Newer Older
1
2
3
4
5
#
# This is a CMake makefile.  You can find the cmake utility and
# information about it at http://www.cmake.org
#

6

7
cmake_minimum_required(VERSION 2.8.4)
8
project(dlib)
9

10
# default to a Release build (except if CMAKE_BUILD_TYPE is set)
11
12
include(cmake_utils/release_build_by_default)
include(cmake_utils/use_cpp_11.cmake)
13

14

Davis King's avatar
Davis King committed
15
16
set(CPACK_PACKAGE_VERSION_MAJOR "19")
set(CPACK_PACKAGE_VERSION_MINOR "0")
17
set(CPACK_PACKAGE_VERSION_PATCH "99")
18
set(VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
19
20
21
22
23
# Set DLIB_VERSION in the including CMake file so they can use it to do whatever they want. 
get_directory_property(has_parent PARENT_DIRECTORY)
if(has_parent)
   set(DLIB_VERSION ${VERSION} PARENT_SCOPE)
endif()
24

25
set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
26
# Suppress cmake warnings about changes in new versions.
27
28
if(COMMAND cmake_policy) 
   cmake_policy(SET CMP0003 NEW) 
29
30
31
   if (POLICY CMP0054)
      cmake_policy(SET CMP0054 NEW)
   endif()
32
endif()
33

34
include(cmake_utils/add_global_compiler_switch.cmake)
35
36
37
38
39
40
41
42


# Make sure ENABLE_ASSERTS is defined for debug builds
if (NOT CMAKE_CXX_FLAGS_DEBUG MATCHES "-DENABLE_ASSERTS")
   set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLE_ASSERTS" 
      CACHE STRING "Flags used by the compiler during C++ debug builds." 
      FORCE)
endif ()
43
44
45
46
47
48
49
macro (toggle_preprocessor_switch option_name)
   if (${option_name})
      add_global_define(${option_name})
   else()
      remove_global_define(${option_name})
   endif()
endmacro()
50

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Don't try to call add_library(dlib) and setup dlib's stuff if it has already
# been done by some other part of the current cmake project.  We do this
# because it avoids getting warnings/errors about cmake policy CMP0002.  This
# happens when a project tries to call add_subdirectory() on dlib more than
# once.  This most often happens when the top level of a project depends on two
# or more other things which both depend on dlib. 
if (NOT TARGET dlib)

   set (DLIB_ISO_CPP_ONLY_STR 
   "Enable this if you don't want to compile any non-ISO C++ code (i.e. you don't use any of the API Wrappers)" )
   set (DLIB_NO_GUI_SUPPORT_STR 
   "Enable this if you don't want to compile any of the dlib GUI code" )
   set (DLIB_ENABLE_STACK_TRACE_STR 
   "Enable this if you want to turn on the DLIB_STACK_TRACE macros" )
   set (DLIB_ENABLE_ASSERTS_STR 
   "Enable this if you want to turn on the DLIB_ASSERT macro" )
   set (DLIB_USE_BLAS_STR
   "Disable this if you don't want to use a BLAS library" )
   set (DLIB_USE_LAPACK_STR
   "Disable this if you don't want to use a LAPACK library" )
71
72
   set (DLIB_USE_CUDA_STR
   "Disable this if you don't want to use NVIDIA CUDA" )
73
   set (DLIB_PNG_SUPPORT_STR
74
   "Disable this if you don't want to link against libpng" )
75
76
   set (DLIB_GIF_SUPPORT_STR
   "Disable this if you don't want to link against libgif" )
77
   set (DLIB_JPEG_SUPPORT_STR
78
79
80
   "Disable this if you don't want to link against libjpeg" )
   set (DLIB_LINK_WITH_SQLITE3_STR
   "Disable this if you don't want to link against sqlite3" )
81
   #set (DLIB_USE_FFTW_STR "Disable this if you don't want to link against fftw" )
82
83

   option(DLIB_ISO_CPP_ONLY ${DLIB_ISO_CPP_ONLY_STR} OFF)
84
   toggle_preprocessor_switch(DLIB_ISO_CPP_ONLY)
85
   option(DLIB_NO_GUI_SUPPORT ${DLIB_NO_GUI_SUPPORT_STR} OFF)
86
   toggle_preprocessor_switch(DLIB_NO_GUI_SUPPORT)
87
   option(DLIB_ENABLE_STACK_TRACE ${DLIB_ENABLE_STACK_TRACE_STR} OFF)
88
   toggle_preprocessor_switch(DLIB_ENABLE_STACK_TRACE)
89

90
91
   option(DLIB_ENABLE_ASSERTS ${DLIB_ENABLE_ASSERTS_STR} OFF)
   if(DLIB_ENABLE_ASSERTS)
92
93
94
95
      # Set these variables so they are set in the config.h.in file when dlib
      # is installed.
      set (DLIB_DISABLE_ASSERTS false)
      set (ENABLE_ASSERTS true) 
96
      add_global_define(ENABLE_ASSERTS)
97
98
99
100
101
   else()
      # Set these variables so they are set in the config.h.in file when dlib
      # is installed.
      set (DLIB_DISABLE_ASSERTS true)
      set (ENABLE_ASSERTS false) 
102
      remove_global_define(ENABLE_ASSERTS)
103
104
105
106
107
108
109
110
111
   endif()

   if (DLIB_ISO_CPP_ONLY)
      option(DLIB_JPEG_SUPPORT ${DLIB_JPEG_SUPPORT_STR} OFF)
      option(DLIB_LINK_WITH_SQLITE3 ${DLIB_LINK_WITH_SQLITE3_STR} OFF)
      option(DLIB_USE_BLAS ${DLIB_USE_BLAS_STR} OFF)
      option(DLIB_USE_LAPACK ${DLIB_USE_LAPACK_STR} OFF)
      option(DLIB_USE_CUDA ${DLIB_USE_CUDA_STR} OFF)
      option(DLIB_PNG_SUPPORT ${DLIB_PNG_SUPPORT_STR} OFF)
112
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} OFF)
113
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} OFF)
114
   else()
115
116
117
118
119
120
      option(DLIB_JPEG_SUPPORT ${DLIB_JPEG_SUPPORT_STR} ON)
      option(DLIB_LINK_WITH_SQLITE3 ${DLIB_LINK_WITH_SQLITE3_STR} ON)
      option(DLIB_USE_BLAS ${DLIB_USE_BLAS_STR} ON)
      option(DLIB_USE_LAPACK ${DLIB_USE_LAPACK_STR} ON)
      option(DLIB_USE_CUDA ${DLIB_USE_CUDA_STR} ON)
      option(DLIB_PNG_SUPPORT ${DLIB_PNG_SUPPORT_STR} ON)
121
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} ON)
122
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} ON)
123
   endif()
124
125
126
127
128
   toggle_preprocessor_switch(DLIB_JPEG_SUPPORT)
   toggle_preprocessor_switch(DLIB_USE_BLAS)
   toggle_preprocessor_switch(DLIB_USE_LAPACK)
   toggle_preprocessor_switch(DLIB_USE_CUDA)
   toggle_preprocessor_switch(DLIB_PNG_SUPPORT) 
129
   toggle_preprocessor_switch(DLIB_GIF_SUPPORT) 
130
   #toggle_preprocessor_switch(DLIB_USE_FFTW)
131

132

133
134
135
136
137
138
139
140
141
142
143
144
   set(source_files 
         base64/base64_kernel_1.cpp
         bigint/bigint_kernel_1.cpp
         bigint/bigint_kernel_2.cpp
         bit_stream/bit_stream_kernel_1.cpp
         entropy_decoder/entropy_decoder_kernel_1.cpp
         entropy_decoder/entropy_decoder_kernel_2.cpp
         entropy_encoder/entropy_encoder_kernel_1.cpp
         entropy_encoder/entropy_encoder_kernel_2.cpp
         md5/md5_kernel_1.cpp
         tokenizer/tokenizer_kernel_1.cpp
         unicode/unicode.cpp
Davis King's avatar
Davis King committed
145
146
         data_io/image_dataset_metadata.cpp
         data_io/mnist.cpp)
147

148
149
150
   if (COMPILER_CAN_DO_CPP_11)
      set(source_files ${source_files}
         dnn/cpu_dlib.cpp
151
         dnn/tensor_tools.cpp
152
153
154
         )
   endif()

155
   if (DLIB_ISO_CPP_ONLY)
156
       add_library(dlib STATIC ${source_files} )
157
       if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
158
           add_library(dlib_shared SHARED ${source_files} )
159
       endif()
160
   else()
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186

      set(source_files ${source_files}
         sockets/sockets_kernel_1.cpp
         bsp/bsp.cpp
         dir_nav/dir_nav_kernel_1.cpp
         dir_nav/dir_nav_kernel_2.cpp
         dir_nav/dir_nav_extensions.cpp
         linker/linker_kernel_1.cpp
         logger/extra_logger_headers.cpp
         logger/logger_kernel_1.cpp
         logger/logger_config_file.cpp
         misc_api/misc_api_kernel_1.cpp
         misc_api/misc_api_kernel_2.cpp
         sockets/sockets_extensions.cpp
         sockets/sockets_kernel_2.cpp
         sockstreambuf/sockstreambuf.cpp
         sockstreambuf/sockstreambuf_unbuffered.cpp
         server/server_kernel.cpp
         server/server_iostream.cpp
         server/server_http.cpp
         threads/multithreaded_object_extension.cpp
         threads/threaded_object_extension.cpp
         threads/threads_kernel_1.cpp
         threads/threads_kernel_2.cpp
         threads/threads_kernel_shared.cpp
         threads/thread_pool_extension.cpp
187
         threads/async.cpp
188
189
190
191
         timer/timer.cpp
         stack_trace.cpp
         )

192
193
194
195
196
197
198
      set(dlib_needed_libraries)
      if(UNIX)
         set(CMAKE_THREAD_PREFER_PTHREAD ON)
         find_package(Threads REQUIRED)
         set(dlib_needed_libraries ${dlib_needed_libraries} ${CMAKE_THREAD_LIBS_INIT})
      endif()

199
200
201
      # we want to link to the right stuff depending on our platform.  
      if (WIN32 AND NOT CYGWIN) ###############################################################################
         if (DLIB_NO_GUI_SUPPORT)
202
            set (dlib_needed_libraries ws2_32 winmm)
203
         else()
204
            set (dlib_needed_libraries ws2_32 winmm comctl32 gdi32 imm32)
205
206
207
         endif()
      elseif(APPLE) ############################################################################
         if (NOT DLIB_NO_GUI_SUPPORT)
208
209
210
211
            find_package(X11 QUIET)
            if (X11_FOUND)
               include_directories(${X11_INCLUDE_DIR})
               set (dlib_needed_libraries ${dlib_needed_libraries} ${X11_LIBRARIES})
212
            else()
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
               find_library(xlib X11)
               # Make sure X11 is in the include path.  Note that we look for
               # Xlocale.h rather than Xlib.h because it avoids finding a partial
               # copy of the X11 headers on systems with anaconda installed.
               find_path(xlib_path Xlocale.h
                  PATHS 
                  /Developer/SDKs/MacOSX10.4u.sdk/usr/X11R6/include
                  /opt/local/include
                  PATH_SUFFIXES X11
                  )
               if (xlib AND xlib_path)
                  get_filename_component(x11_path ${xlib_path} PATH CACHE)
                  include_directories(${x11_path})
                  set(dlib_needed_libraries ${dlib_needed_libraries} ${xlib} )
                  set(X11_FOUND 1)
               endif()
            endif()
            if (NOT X11_FOUND)
231
232
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
233
234
               message(" *** Make sure XQuartz is installed if you want GUI support.               ***")
               message(" *** You can download XQuartz from: http://xquartz.macosforge.org/landing/ ***")
235
               message(" *****************************************************************************")
236
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
237
               add_global_define(DLIB_NO_GUI_SUPPORT)
238
            endif()
239
240
         endif()

241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
         mark_as_advanced(pthreadlib xlib xlib_path x11_path)
      else () ##################################################################################
         # link to the nsl library if it exists.  this is something you need sometimes 
         find_library(nsllib nsl)
         if (nsllib)
            set (dlib_needed_libraries ${dlib_needed_libraries} ${nsllib})
         endif ()

         # link to the socket library if it exists.  this is something you need on solaris
         find_library(socketlib socket)
         if (socketlib)
            set (dlib_needed_libraries ${dlib_needed_libraries} ${socketlib})
         endif ()

         if (NOT DLIB_NO_GUI_SUPPORT)
            include(FindX11)
            if (X11_FOUND)
               include_directories(${X11_INCLUDE_DIR})
               set (dlib_needed_libraries ${dlib_needed_libraries} ${X11_LIBRARIES})
            else()
261
262
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
263
264
               message(" *** Make sure libx11-dev is installed if you want GUI support.            ***")
               message(" *** On Ubuntu run: sudo apt-get install libx11-dev                        ***")
265
               message(" *****************************************************************************")
266
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
267
               add_global_define(DLIB_NO_GUI_SUPPORT)
268
            endif()
269
270
         endif()

271
272
         mark_as_advanced(nsllib pthreadlib socketlib)
      endif () ##################################################################################
273

274
275
276
277
278
279
280
281
282
283
284
285
      if (NOT DLIB_NO_GUI_SUPPORT)
         set(source_files ${source_files}
            gui_widgets/fonts.cpp
            gui_widgets/widgets.cpp
            gui_widgets/drawable.cpp
            gui_widgets/canvas_drawing.cpp
            gui_widgets/style.cpp
            gui_widgets/base_widgets.cpp
            gui_core/gui_core_kernel_1.cpp
            gui_core/gui_core_kernel_2.cpp
            )
      endif()
286

287
      INCLUDE (CheckFunctionExists)
288

289
290
291
292
293
294
295
296
297
298
299
      if (DLIB_GIF_SUPPORT)
         find_package(GIF QUIET)
         if (GIF_FOUND)
            include_directories(${GIF_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${GIF_LIBRARY})
         else()
            set(DLIB_GIF_SUPPORT OFF CACHE STRING ${DLIB_GIF_SUPPORT_STR} FORCE )
            toggle_preprocessor_switch(DLIB_GIF_SUPPORT)
         endif()
      endif()

300
      if (DLIB_PNG_SUPPORT)
301
         # try to find libpng 
Davis King's avatar
Davis King committed
302
         find_package(PNG QUIET)
303
304
         # Make sure there isn't something wrong with the version of LIBPNG
         # installed on this system.  
305
306
307
308
         if (PNG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${PNG_LIBRARY})
            CHECK_FUNCTION_EXISTS(png_create_read_struct LIBPNG_IS_GOOD)
         endif()
309
         if (PNG_FOUND AND LIBPNG_IS_GOOD)
310
311
            include_directories(${PNG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARY})
312
            set(REQUIRES_LIBS " libpng")
313
         else()
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
            # If we can't find libpng then statically compile it in.
            include_directories(external/libpng external/zlib)
            set(source_files ${source_files}
               external/libpng/png.c
               external/libpng/pngerror.c
               external/libpng/pngget.c
               external/libpng/pngmem.c
               external/libpng/pngpread.c
               external/libpng/pngread.c
               external/libpng/pngrio.c
               external/libpng/pngrtran.c
               external/libpng/pngrutil.c
               external/libpng/pngset.c
               external/libpng/pngtrans.c
               external/libpng/pngwio.c
               external/libpng/pngwrite.c
               external/libpng/pngwtran.c
               external/libpng/pngwutil.c
               external/zlib/adler32.c
               external/zlib/compress.c
               external/zlib/crc32.c
               external/zlib/deflate.c
               external/zlib/gzclose.c
               external/zlib/gzlib.c
               external/zlib/gzread.c
               external/zlib/gzwrite.c
               external/zlib/infback.c
               external/zlib/inffast.c
               external/zlib/inflate.c
               external/zlib/inftrees.c
               external/zlib/trees.c
               external/zlib/uncompr.c
               external/zlib/zutil.c
               )
348
            set(REQUIRES_LIBS "")
349
         endif()
350
351
352
353
         set(source_files ${source_files}
            image_loader/png_loader.cpp
            image_saver/save_png.cpp
            )
354
      endif()
355

356
      if (DLIB_JPEG_SUPPORT)
357
         # try to find libjpeg 
358
         find_package(JPEG QUIET)
359
         # Make sure there isn't something wrong with the version of libjpeg 
360
361
         # installed on this system.  Also don't use the installed libjpeg
         # if this is an APPLE system because apparently it's broken (as of 2015/01/01).
362
363
364
365
         if (JPEG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARY})
            CHECK_FUNCTION_EXISTS(jpeg_read_header LIBJPEG_IS_GOOD)
         endif()
366
         if (JPEG_FOUND AND LIBJPEG_IS_GOOD AND NOT APPLE)
367
368
369
            include_directories(${JPEG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${JPEG_LIBRARY})
         else()
370
            # If we can't find libjpeg then statically compile it in.
371
            add_definitions(-DDLIB_JPEG_STATIC)
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
            set(source_files ${source_files}
                  external/libjpeg/jcomapi.cpp
                  external/libjpeg/jdapimin.cpp
                  external/libjpeg/jdapistd.cpp
                  external/libjpeg/jdatasrc.cpp
                  external/libjpeg/jdcoefct.cpp
                  external/libjpeg/jdcolor.cpp
                  external/libjpeg/jddctmgr.cpp
                  external/libjpeg/jdhuff.cpp
                  external/libjpeg/jdinput.cpp
                  external/libjpeg/jdmainct.cpp
                  external/libjpeg/jdmarker.cpp
                  external/libjpeg/jdmaster.cpp
                  external/libjpeg/jdmerge.cpp
                  external/libjpeg/jdphuff.cpp
                  external/libjpeg/jdpostct.cpp
                  external/libjpeg/jdsample.cpp
                  external/libjpeg/jerror.cpp
                  external/libjpeg/jidctflt.cpp
                  external/libjpeg/jidctfst.cpp
                  external/libjpeg/jidctint.cpp
                  external/libjpeg/jidctred.cpp
                  external/libjpeg/jmemmgr.cpp
                  external/libjpeg/jmemnobs.cpp
                  external/libjpeg/jquant1.cpp
                  external/libjpeg/jquant2.cpp
Davis King's avatar
Davis King committed
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
                  external/libjpeg/jutils.cpp  
                  external/libjpeg/jcapimin.cpp
                  external/libjpeg/jdatadst.cpp
                  external/libjpeg/jcparam.cpp
                  external/libjpeg/jcapistd.cpp
                  external/libjpeg/jcmarker.cpp
                  external/libjpeg/jcinit.cpp
                  external/libjpeg/jcmaster.cpp
                  external/libjpeg/jcdctmgr.cpp
                  external/libjpeg/jccoefct.cpp  
                  external/libjpeg/jccolor.cpp  
                  external/libjpeg/jchuff.cpp  
                  external/libjpeg/jcmainct.cpp  
                  external/libjpeg/jcphuff.cpp  
                  external/libjpeg/jcprepct.cpp  
                  external/libjpeg/jcsample.cpp
                  external/libjpeg/jfdctint.cpp
                  external/libjpeg/jfdctflt.cpp
                  external/libjpeg/jfdctfst.cpp
                  )
418
         endif()
419
420
         set(source_files ${source_files}
            image_loader/jpeg_loader.cpp
Davis King's avatar
Davis King committed
421
            image_saver/save_jpeg.cpp
422
            )
423
424
      endif()

425

426
427
      if (DLIB_USE_BLAS OR DLIB_USE_LAPACK)
         # Try to find BLAS and LAPACK 
428
         include(cmake_utils/cmake_find_blas.txt)
429

430
431
432
433
434
         if (DLIB_USE_BLAS)
            if (blas_found)
               set (dlib_needed_libraries ${dlib_needed_libraries} ${blas_libraries})
            else()
               set(DLIB_USE_BLAS OFF CACHE STRING ${DLIB_USE_BLAS_STR} FORCE )
435
               toggle_preprocessor_switch(DLIB_USE_BLAS)
436
            endif()
437
438
         endif()

439
440
441
442
443
         if (DLIB_USE_LAPACK)
            if (lapack_found)
               set (dlib_needed_libraries ${dlib_needed_libraries} ${lapack_libraries})
            else()
               set(DLIB_USE_LAPACK OFF CACHE STRING ${DLIB_USE_LAPACK_STR} FORCE )
444
               toggle_preprocessor_switch(DLIB_USE_LAPACK)
445
            endif()
446
         endif()
447
448
449
      endif()


450
      if (DLIB_USE_CUDA)
451
         find_package(CUDA 7.5)
452
453


454
         if (CUDA_FOUND AND COMPILER_CAN_DO_CPP_11)
455

456
            set(CUDA_HOST_COMPILATION_CPP ON)
457
458
459
460
            # Note that we add __STRICT_ANSI__ to avoid freaking out nvcc with gcc specific
            # magic in the standard C++ header files (since nvcc uses gcc headers on
            # linux).
            list(APPEND CUDA_NVCC_FLAGS "-arch=sm_30;-std=c++11;-D__STRICT_ANSI__")
461

462
            include(cmake_utils/test_for_cudnn/find_cudnn.txt)
463

464
            if (cudnn AND NOT DEFINED cuda_test_compile_worked AND NOT DEFINED cudnn_test_compile_worked)
465
466
467
               # make sure cuda is really working by doing a test compile
               message(STATUS "Building a CUDA test project to see if your compiler is compatible with CUDA...")
               try_compile(cuda_test_compile_worked ${PROJECT_BINARY_DIR}/cuda_test_build 
468
                           ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cuda cuda_test
469
470
471
472
                           CMAKE_FLAGS "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
                                       "-DCMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH}"
                                       "-DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}"
                           )
473
               if (NOT cuda_test_compile_worked)
474
475
476
477
                  message(STATUS "*** CUDA was found but your compiler failed to compile a simple CUDA program so dlib isn't going to use CUDA. ***")
               else()
                  message(STATUS "Checking if you have the right version of cuDNN installed.")
                  try_compile(cudnn_test_compile_worked ${PROJECT_BINARY_DIR}/cudnn_test_build 
478
                              ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cudnn cudnn_test
479
480
481
482
                              CMAKE_FLAGS "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
                                          "-DCMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH}"
                                          "-DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}"
                                          )
483
484
485
486
487
                  if (cudnn_test_compile_worked)
                     message(STATUS "Found cuDNN: " ${cudnn})
                  else()
                     message(STATUS "*** Found cuDNN, but it looks like the wrong version so dlib will not use it. ***")
                  endif()
488
489
               endif()
            endif()
490
491
         endif()

492

493
         if (CUDA_FOUND AND cudnn AND cudnn_include AND COMPILER_CAN_DO_CPP_11 AND cuda_test_compile_worked AND cudnn_test_compile_worked)
494
            set(source_files ${source_files} 
Davis King's avatar
Davis King committed
495
496
497
               dnn/cuda_dlib.cu 
               dnn/cudnn_dlibapi.cpp
               dnn/cublas_dlibapi.cpp
Davis King's avatar
Davis King committed
498
               dnn/curand_dlibapi.cpp
499
               dnn/gpu_data.cpp
500
               )
Davis King's avatar
Davis King committed
501
502
503
504
505
            set(dlib_needed_libraries ${dlib_needed_libraries} 
                                      ${CUDA_CUBLAS_LIBRARIES} 
                                      ${cudnn}
                                      ${CUDA_curand_LIBRARY}
                                      )
506
507
508
            include_directories(${cudnn_include})
         else()
            set(DLIB_USE_CUDA OFF CACHE STRING ${DLIB_USE_BLAS_STR} FORCE )
509
            toggle_preprocessor_switch(DLIB_USE_CUDA)
510
            if (NOT cudnn OR NOT cudnn_include OR NOT cudnn_test_compile_worked)
511
               message(STATUS "*** cuDNN V5.0 OR GREATER NOT FOUND.  DLIB WILL NOT USE CUDA. ***")
512
               message(STATUS "*** If you have cuDNN then set CMAKE_PREFIX_PATH to include cuDNN's folder.")
513
514
            endif()
            if (NOT COMPILER_CAN_DO_CPP_11)
515
               message(STATUS "*** Dlib CUDA support requires C++11 but your compiler doesn't support it. ***")
516
            endif()
517
518
519
         endif()
      endif()
      
520

521
522
523
524
525
526
527
528
529
530
531
532
      if (DLIB_LINK_WITH_SQLITE3)
         find_library(sqlite sqlite3)
         # make sure sqlite3.h is in the include path
         find_path(sqlite_path sqlite3.h)
         if (sqlite AND sqlite_path)
            get_filename_component(sqlite_path2 ${sqlite_path} PATH CACHE)
            include_directories(${sqlite_path2})
            set(dlib_needed_libraries ${dlib_needed_libraries} ${sqlite} )
         else()
            set(DLIB_LINK_WITH_SQLITE3 OFF CACHE STRING ${DLIB_LINK_WITH_SQLITE3_STR} FORCE )
         endif()
         mark_as_advanced(sqlite sqlite_path sqlite_path2)
533
534
535
      endif()


536

537
      if (DLIB_USE_FFTW)
538
539
540
541
         find_library(fftw fftw3)
         # make sure fftw3.h is in the include path
         find_path(fftw_path fftw3.h)
         if (fftw AND fftw_path)
542
            include_directories(${fftw_path})
543
544
            set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
         else()
545
546
            set(DLIB_USE_FFTW OFF CACHE STRING ${DLIB_USE_FFTW_STR} FORCE )
            toggle_preprocessor_switch(DLIB_USE_FFTW)
547
         endif()
548
         mark_as_advanced(fftw fftw_path)
549
550
      endif()

551

552
553
554
555
556
557
558
559

      # Tell CMake to build dlib via add_library()/cuda_add_library()
      if (DLIB_USE_CUDA)
         cuda_add_library(dlib STATIC ${source_files} )
      else()
         add_library(dlib STATIC ${source_files} )
      endif()
      target_link_libraries(dlib ${dlib_needed_libraries} )
560
      if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
561
         if (DLIB_USE_CUDA)
562
            cuda_add_library(dlib_shared SHARED ${source_files} )
563
         else()
564
            add_library(dlib_shared SHARED ${source_files} )
565
         endif()
566
         target_link_libraries(dlib_shared ${dlib_needed_libraries} )
567
      endif()
568

569
   endif ()  ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################
570

571
   # Install the library
572
   if (NOT DLIB_IN_PROJECT_BUILD)
573
       set (LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries (e.g. lib32 or lib64 for multilib installations)")
574
       cmake_minimum_required(VERSION 2.8.8)
575
       if(UNIX)
576
           set_target_properties(dlib_shared PROPERTIES
577
578
                                        OUTPUT_NAME dlib 
                                        VERSION ${VERSION})
579
           install(TARGETS dlib dlib_shared
580
581
                   EXPORT dlib 
                   RUNTIME DESTINATION bin # Windows (including cygwin) considers .dll to be runtime artifacts
582
583
                   LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
                   ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
584
585
586
587
588
589
590
       else()
           install(TARGETS dlib
                   EXPORT dlib 
                   RUNTIME DESTINATION bin # Windows considers .dll to be runtime artifacts
                   LIBRARY DESTINATION lib
                   ARCHIVE DESTINATION lib)
       endif()
591

592
       install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION include/dlib
593
594
595
               FILES_MATCHING PATTERN "*.h"
               REGEX "${CMAKE_CURRENT_BINARY_DIR}" EXCLUDE)

596

Davis King's avatar
Davis King committed
597
       configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
598
599
600
       # overwrite config.h with the configured one
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION include/dlib)

601
       configure_file(${PROJECT_SOURCE_DIR}/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h)
602
603
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/revision.h DESTINATION include/dlib)

604
       install(FILES "LICENSE.txt" DESTINATION share/doc/dlib)
605

606
607
       ## Config.cmake generation and installation

608
       set(ConfigPackageLocation "${LIB_INSTALL_DIR}/cmake/dlib")
609
610
611
612
613
       install(EXPORT dlib
            NAMESPACE dlib::
            DESTINATION ${ConfigPackageLocation})

       set(CONF_INSTALL_PATH "\${dlib_CMAKE_DIR}/../../../")
614
       configure_file(cmake_utils/dlibConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" @ONLY)
615
616
617

       include(CMakePackageConfigHelpers)
       write_basic_package_version_file(
618
           "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake"
619
620
621
622
623
           VERSION ${VERSION}
           COMPATIBILITY AnyNewerVersion
           )

       install(FILES 
624
625
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" 
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake" 
626
               DESTINATION ${ConfigPackageLocation})
627
628
629

       ## dlib-1.pc generation and installation

630
       configure_file("cmake_utils/dlib.pc.in" "dlib-1.pc" @ONLY)
631
632
633
       install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlib-1.pc"
           DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")

634
635
   endif()

636
endif()