CMakeLists.txt 32 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.12)
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
set(CPACK_PACKAGE_VERSION_MAJOR "19")
Davis King's avatar
Davis King committed
16
17
set(CPACK_PACKAGE_VERSION_MINOR "4")
set(CPACK_PACKAGE_VERSION_PATCH "0")
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
26
27
28
# Set only because there are old target_link_libraries() statements in the
# FindCUDA.cmake file that comes with CMake that error out if the new behavior
# is used.
cmake_policy(SET CMP0023 OLD)
29

30
include(cmake_utils/add_global_compiler_switch.cmake)
31
32


33
34
35
36
37
38
39
40
41
42
43
44
if (DLIB_IN_PROJECT_BUILD)
   # Make sure ENABLE_ASSERTS is defined for debug builds, but only for uses
   # who are building an application.  If they are just building dlib as a
   # stand alone library then don't set this because it will conflict with the
   # settings in config.h if we did.
   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()
endif()

45
46
47
48
49
50
51
macro (toggle_preprocessor_switch option_name)
   if (${option_name})
      add_global_define(${option_name})
   else()
      remove_global_define(${option_name})
   endif()
endmacro()
52

53
54
55
56
57
58
59
60
# Suppress superfluous randlib warnings about libdlib.a having no symbols on MacOSX.
if (APPLE)
    set(CMAKE_C_ARCHIVE_CREATE   "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
    set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
    set(CMAKE_C_ARCHIVE_FINISH   "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
    set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
endif()

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 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" )
81
82
   set (DLIB_USE_CUDA_STR
   "Disable this if you don't want to use NVIDIA CUDA" )
83
   set (DLIB_PNG_SUPPORT_STR
84
   "Disable this if you don't want to link against libpng" )
85
86
   set (DLIB_GIF_SUPPORT_STR
   "Disable this if you don't want to link against libgif" )
87
   set (DLIB_JPEG_SUPPORT_STR
88
89
90
   "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" )
91
   #set (DLIB_USE_FFTW_STR "Disable this if you don't want to link against fftw" )
Duncan Palmer's avatar
Duncan Palmer committed
92
93
   set (DLIB_USE_MKL_FFT_STR
   "Disable this is you don't want to use the MKL DFTI FFT implementation" )
94
95

   option(DLIB_ISO_CPP_ONLY ${DLIB_ISO_CPP_ONLY_STR} OFF)
96
   toggle_preprocessor_switch(DLIB_ISO_CPP_ONLY)
97
   option(DLIB_NO_GUI_SUPPORT ${DLIB_NO_GUI_SUPPORT_STR} OFF)
98
   toggle_preprocessor_switch(DLIB_NO_GUI_SUPPORT)
99
   option(DLIB_ENABLE_STACK_TRACE ${DLIB_ENABLE_STACK_TRACE_STR} OFF)
100
   toggle_preprocessor_switch(DLIB_ENABLE_STACK_TRACE)
101

102
103
   option(DLIB_ENABLE_ASSERTS ${DLIB_ENABLE_ASSERTS_STR} OFF)
   if(DLIB_ENABLE_ASSERTS)
104
105
106
107
      # 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) 
108
      add_global_define(ENABLE_ASSERTS)
109
      remove_global_define(DLIB_DISABLE_ASSERTS)
110
111
112
113
114
   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) 
115
      remove_global_define(ENABLE_ASSERTS)
116
117
118
119
120
121
122
123
      # Never force the asserts off when doing an in project build.  Instead,
      # let the debug/release mode setting toggle asserts on or off (or the
      # DLIB_ENABLE_ASSERTS option obviously).  That is, even if the
      # DLIB_ENABLE_ASSERTS option is off debug mode can still cause the
      # asserts to turn on when using an in project build. 
      if (NOT DLIB_IN_PROJECT_BUILD)
         add_global_define(DLIB_DISABLE_ASSERTS)
      endif()
124
125
126
127
128
129
130
131
132
   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)
133
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} OFF)
134
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} OFF)
Duncan Palmer's avatar
Duncan Palmer committed
135
      option(DLIB_USE_MKL_FFT ${DLIB_USE_MKL_FFT_STR} OFF)
136
   else()
137
138
139
140
141
142
      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)
143
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} ON)
144
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} ON)
Duncan Palmer's avatar
Duncan Palmer committed
145
      option(DLIB_USE_MKL_FFT ${DLIB_USE_MKL_FFT_STR} ON)
146
   endif()
147
148
149
150
151
   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) 
152
   toggle_preprocessor_switch(DLIB_GIF_SUPPORT) 
153
   #toggle_preprocessor_switch(DLIB_USE_FFTW)
Duncan Palmer's avatar
Duncan Palmer committed
154
   toggle_preprocessor_switch(DLIB_USE_MKL_FFT)
155

156

157
158
159
160
161
162
163
164
165
166
167
168
   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
169
         data_io/image_dataset_metadata.cpp
Davis King's avatar
Davis King committed
170
         data_io/mnist.cpp
171
         dnn/cpu_dlib.cpp
172
         dnn/tensor_tools.cpp
Davis King's avatar
merged  
Davis King committed
173
   )
Davis King's avatar
Davis King committed
174

175

176
   if (DLIB_ISO_CPP_ONLY)
177
       add_library(dlib STATIC ${source_files} )
178
       if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
179
           add_library(dlib_shared SHARED ${source_files} )
180
           add_dependencies(dlib_shared dlib)
181
       endif()
182
   else()
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208

      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
209
         threads/async.cpp
210
211
212
213
         timer/timer.cpp
         stack_trace.cpp
         )

214
      set(dlib_needed_libraries)
215
      set(dlib_needed_includes)
216
217
218
219
220
221
      if(UNIX)
         set(CMAKE_THREAD_PREFER_PTHREAD ON)
         find_package(Threads REQUIRED)
         set(dlib_needed_libraries ${dlib_needed_libraries} ${CMAKE_THREAD_LIBS_INIT})
      endif()

222
223
224
      # we want to link to the right stuff depending on our platform.  
      if (WIN32 AND NOT CYGWIN) ###############################################################################
         if (DLIB_NO_GUI_SUPPORT)
225
            set (dlib_needed_libraries ws2_32 winmm)
226
         else()
227
            set (dlib_needed_libraries ws2_32 winmm comctl32 gdi32 imm32)
228
229
         endif()
      elseif(APPLE) ############################################################################
Davis King's avatar
Davis King committed
230
         set(CMAKE_MACOSX_RPATH 1)
231
         if (NOT DLIB_NO_GUI_SUPPORT)
232
233
            find_package(X11 QUIET)
            if (X11_FOUND)
234
               # If both X11 and anaconda are installed, it's possible for the
Davis King's avatar
merged  
Davis King committed
235
236
237
               # anaconda path to appear before /opt/X11, so we remove anaconda.
               foreach (ITR ${X11_INCLUDE_DIR})
                  if ("${ITR}" MATCHES "(.*)anaconda(.*)")
238
                     list (REMOVE_ITEM X11_INCLUDE_DIR ${ITR})
Davis King's avatar
merged  
Davis King committed
239
                  endif ()
240
               endforeach(ITR)
241
242
               include_directories(${X11_INCLUDE_DIR})
               set (dlib_needed_libraries ${dlib_needed_libraries} ${X11_LIBRARIES})
243
            else()
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
               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)
262
263
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
264
265
               message(" *** Make sure XQuartz is installed if you want GUI support.               ***")
               message(" *** You can download XQuartz from: http://xquartz.macosforge.org/landing/ ***")
266
               message(" *****************************************************************************")
267
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
268
               add_global_define(DLIB_NO_GUI_SUPPORT)
269
            endif()
270
271
         endif()

272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
         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()
292
293
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
294
295
               message(" *** Make sure libx11-dev is installed if you want GUI support.            ***")
               message(" *** On Ubuntu run: sudo apt-get install libx11-dev                        ***")
296
               message(" *****************************************************************************")
297
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
298
               add_global_define(DLIB_NO_GUI_SUPPORT)
299
            endif()
300
301
         endif()

302
303
         mark_as_advanced(nsllib pthreadlib socketlib)
      endif () ##################################################################################
304

305
306
307
308
309
310
311
312
313
314
315
316
      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()
317

318
      INCLUDE (CheckFunctionExists)
319

320
321
322
      if (DLIB_GIF_SUPPORT)
         find_package(GIF QUIET)
         if (GIF_FOUND)
323
            set (dlib_needed_includes ${dlib_needed_includes} ${GIF_INCLUDE_DIR})
324
325
326
327
328
329
330
            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()

331
      if (DLIB_PNG_SUPPORT)
332
         # try to find libpng 
Davis King's avatar
Davis King committed
333
         find_package(PNG QUIET)
334
335
         # Make sure there isn't something wrong with the version of LIBPNG
         # installed on this system.  
336
337
338
339
         if (PNG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${PNG_LIBRARY})
            CHECK_FUNCTION_EXISTS(png_create_read_struct LIBPNG_IS_GOOD)
         endif()
340
         if (PNG_FOUND AND LIBPNG_IS_GOOD)
341
342
            include_directories(${PNG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARY})
343
            set(REQUIRES_LIBS " libpng")
344
         else()
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
            # 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
               )
379
380
381
382
383
384
385
386
387
            if (NEON)
               enable_language(ASM)
               set(source_files ${source_files}
                  external/libpng/arm/arm_init.c
                  external/libpng/arm/filter_neon_intrinsics.c
                  external/libpng/arm/filter_neon.S
                  )
               set_source_files_properties(external/libpng/arm/filter_neon.S PROPERTIES COMPILE_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_CXX_FLAGS} -x assembler-with-cpp")
            endif()
388
            set(REQUIRES_LIBS "")
389
         endif()
390
391
392
393
         set(source_files ${source_files}
            image_loader/png_loader.cpp
            image_saver/save_png.cpp
            )
394
      endif()
395

396
      if (DLIB_JPEG_SUPPORT)
397
         # try to find libjpeg 
398
         find_package(JPEG QUIET)
399
         # Make sure there isn't something wrong with the version of libjpeg 
400
401
         # 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).
402
403
404
405
         if (JPEG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARY})
            CHECK_FUNCTION_EXISTS(jpeg_read_header LIBJPEG_IS_GOOD)
         endif()
406
         if (JPEG_FOUND AND LIBJPEG_IS_GOOD AND NOT APPLE)
407
408
409
            include_directories(${JPEG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${JPEG_LIBRARY})
         else()
410
            # If we can't find libjpeg then statically compile it in.
411
            add_definitions(-DDLIB_JPEG_STATIC)
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
            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
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
                  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
                  )
458
         endif()
459
460
         set(source_files ${source_files}
            image_loader/jpeg_loader.cpp
Davis King's avatar
Davis King committed
461
            image_saver/save_jpeg.cpp
462
            )
463
464
      endif()

465

466
467
      if (DLIB_USE_BLAS OR DLIB_USE_LAPACK OR DLIB_USE_MKL_FFT)
          # Try to find BLAS, LAPACK and MKL
468
         include(cmake_utils/cmake_find_blas.txt)
469

470
471
472
473
474
         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 )
475
               toggle_preprocessor_switch(DLIB_USE_BLAS)
476
            endif()
477
478
         endif()

479
480
481
482
483
         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 )
484
               toggle_preprocessor_switch(DLIB_USE_LAPACK)
485
            endif()
486
         endif()
487

488
         if (DLIB_USE_MKL_FFT)
489
            if (found_intel_mkl AND found_intel_mkl_headers)
490
               set (dlib_needed_includes ${dlib_needed_includes} ${mkl_include_dir})
491
492
493
494
495
496
               set (dlib_needed_libraries ${dlib_needed_libraries} ${mkl_libraries})
            else()
               set(DLIB_USE_MKL_FFT OFF CACHE STRING ${DLIB_USE_MKL_FFT_STR} FORCE )
               toggle_preprocessor_switch(DLIB_USE_MKL_FFT)
            endif()
         endif()
Duncan Palmer's avatar
Duncan Palmer committed
497
498
      endif()

499

500
      if (DLIB_USE_CUDA)
501
         find_package(CUDA 7.5)
502

503
504
505
506
         if (CUDA_FOUND AND MSVC AND NOT CUDA_CUBLAS_LIBRARIES AND "${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
            message(WARNING "You have CUDA installed, but we can't use it unless you put visual studio in 64bit mode.")
            set(CUDA_FOUND 0)
         endif()
507

508
         if (CUDA_FOUND AND COMPILER_CAN_DO_CPP_11)
509

510
511
512
513
            # There is some bug in cmake that causes it to mess up the
            # -std=c++11 option if you let it propagate it to nvcc in some
            # cases.  So instead we disable this and manually include
            # things from CMAKE_CXX_FLAGS in the CUDA_NVCC_FLAGS list below.
514
            if (APPLE)
515
               set(CUDA_PROPAGATE_HOST_FLAGS OFF)
516
517
518
               # Grab all the -D flags from CMAKE_CXX_FLAGS so we can pass them
               # to nvcc.
               string(REGEX MATCHALL "-D[^ ]*" FLAGS_FOR_NVCC ${CMAKE_CXX_FLAGS})
519
520
            endif()

521

522
            set(CUDA_HOST_COMPILATION_CPP ON)
523
524
525
            # 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).
526
527
528
529
            list(APPEND CUDA_NVCC_FLAGS "-arch=sm_30;-D__STRICT_ANSI__;-D_MWAITXINTRIN_H_INCLUDED;-D_FORCE_INLINES;${FLAGS_FOR_NVCC}")
            if (NOT MSVC)
               list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
            endif()
530
531
532
            if (CMAKE_POSITION_INDEPENDENT_CODE)
               # sometimes this setting isn't propagated to NVCC, which then causes the
               # compile to fail.  So make sure it's propagated.
533
534
535
               if (NOT MSVC) # Visual studio doesn't have -fPIC so don't do it in that case.
                  list(APPEND CUDA_NVCC_FLAGS "-Xcompiler -fPIC")
               endif()
536
            endif()
537

538
            include(cmake_utils/test_for_cudnn/find_cudnn.txt)
539

540
            if (cudnn AND NOT DEFINED cuda_test_compile_worked AND NOT DEFINED cudnn_test_compile_worked)
541
542
               # 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...")
543
544
545
546
547

               set(CUDA_TEST_CMAKE_FLAGS "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}"
                                         "-DCMAKE_INCLUDE_PATH=${CMAKE_INCLUDE_PATH}"
                                         "-DCMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH}")

548
               if (NOT MSVC) # see https://github.com/davisking/dlib/issues/363
549
550
551
                  list(APPEND CUDA_TEST_CMAKE_FLAGS "-DCUDA_HOST_COMPILER=${CUDA_HOST_COMPILER}")
               endif()

552
               try_compile(cuda_test_compile_worked ${PROJECT_BINARY_DIR}/cuda_test_build 
553
                           ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cuda cuda_test
554
                           CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
555
                           )
556
               if (NOT cuda_test_compile_worked)
557
558
559
560
                  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 
561
                              ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cudnn cudnn_test
562
                              CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
563
                                          )
564
565
566
567
568
                  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()
569
570
               endif()
            endif()
571
572
         endif()

573

574
         if (CUDA_FOUND AND cudnn AND cudnn_include AND COMPILER_CAN_DO_CPP_11 AND cuda_test_compile_worked AND cudnn_test_compile_worked)
575
            set(source_files ${source_files} 
Davis King's avatar
Davis King committed
576
577
578
               dnn/cuda_dlib.cu 
               dnn/cudnn_dlibapi.cpp
               dnn/cublas_dlibapi.cpp
Davis King's avatar
Davis King committed
579
               dnn/curand_dlibapi.cpp
580
               dnn/gpu_data.cpp
581
               )
Davis King's avatar
Davis King committed
582
583
584
585
586
            set(dlib_needed_libraries ${dlib_needed_libraries} 
                                      ${CUDA_CUBLAS_LIBRARIES} 
                                      ${cudnn}
                                      ${CUDA_curand_LIBRARY}
                                      )
587
588
589
            include_directories(${cudnn_include})
         else()
            set(DLIB_USE_CUDA OFF CACHE STRING ${DLIB_USE_BLAS_STR} FORCE )
590
            toggle_preprocessor_switch(DLIB_USE_CUDA)
591
592
593
594
595
596
            if (COMPILER_CAN_DO_CPP_11)
               if (NOT cudnn OR NOT cudnn_include OR NOT cudnn_test_compile_worked)
                  message(STATUS "*** cuDNN V5.0 OR GREATER NOT FOUND.  DLIB WILL NOT USE CUDA. ***")
                  message(STATUS "*** If you have cuDNN then set CMAKE_PREFIX_PATH to include cuDNN's folder.")
               endif()
            else ()
597
               message(STATUS "*** Dlib CUDA support requires C++11 but your compiler doesn't support it. ***")
598
            endif()
599
600
601
         endif()
      endif()
      
602

603
604
605
606
607
608
      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)
609
            set(dlib_needed_includes ${dlib_needed_includes} ${sqlite_path2})
610
611
612
613
614
            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)
615
616
617
      endif()


618

619
      if (DLIB_USE_FFTW)
620
621
622
623
         find_library(fftw fftw3)
         # make sure fftw3.h is in the include path
         find_path(fftw_path fftw3.h)
         if (fftw AND fftw_path)
624
            set(dlib_needed_includes ${dlib_needed_includes} ${fftw_path})
625
626
            set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
         else()
627
628
            set(DLIB_USE_FFTW OFF CACHE STRING ${DLIB_USE_FFTW_STR} FORCE )
            toggle_preprocessor_switch(DLIB_USE_FFTW)
629
         endif()
630
         mark_as_advanced(fftw fftw_path)
631
632
      endif()

633

634
635
636

      # Tell CMake to build dlib via add_library()/cuda_add_library()
      if (DLIB_USE_CUDA)
637
638
639
         # The old cuda_add_library() command doesn't support CMake's newer dependency
         # stuff, so we have to set the include path manually still, which we do here.
         include_directories(${dlib_needed_includes})
640
641
642
643
         cuda_add_library(dlib STATIC ${source_files} )
      else()
         add_library(dlib STATIC ${source_files} )
      endif()
644
645
646
647
648
649
      target_include_directories(dlib
                                 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                                 INTERFACE $<INSTALL_INTERFACE:include>
                                 PUBLIC ${dlib_needed_includes}
                                 )
      target_link_libraries(dlib PRIVATE ${dlib_needed_libraries})
650
      if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
651
         if (DLIB_USE_CUDA)
652
            cuda_add_library(dlib_shared SHARED ${source_files} )
653
            add_dependencies(dlib_shared dlib)
654
         else()
655
            add_library(dlib_shared SHARED ${source_files} )
656
            add_dependencies(dlib_shared dlib)
657
         endif()
658
659
660
661
662
663
         target_include_directories(dlib_shared
                                    INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                                    INTERFACE $<INSTALL_INTERFACE:include>
                                    PUBLIC ${dlib_needed_includes}
                                    )
         target_link_libraries(dlib_shared PRIVATE ${dlib_needed_libraries})
664
      endif()
665

666
   endif ()  ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################
667

668
669
670
   # Allow the unit tests to ask us to compile the all/source.cpp file just to make sure it compiles.
   if (DLIB_TEST_COMPILE_ALL_SOURCE_CPP)
      ADD_LIBRARY(dlib_all_source_cpp STATIC all/source.cpp) 
671
      target_link_libraries(dlib_all_source_cpp dlib)
672
673
   endif()

674
   # Install the library
675
   if (NOT DLIB_IN_PROJECT_BUILD)
676
       set (LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries (e.g. lib32 or lib64 for multilib installations)")
677
       cmake_minimum_required(VERSION 2.8.8)
678
       if(UNIX)
679
           set_target_properties(dlib_shared PROPERTIES
680
681
                                        OUTPUT_NAME dlib 
                                        VERSION ${VERSION})
682
           install(TARGETS dlib dlib_shared
683
684
                   EXPORT dlib 
                   RUNTIME DESTINATION bin # Windows (including cygwin) considers .dll to be runtime artifacts
685
686
                   LIBRARY DESTINATION "${LIB_INSTALL_DIR}"
                   ARCHIVE DESTINATION "${LIB_INSTALL_DIR}")
687
688
689
690
691
692
693
       else()
           install(TARGETS dlib
                   EXPORT dlib 
                   RUNTIME DESTINATION bin # Windows considers .dll to be runtime artifacts
                   LIBRARY DESTINATION lib
                   ARCHIVE DESTINATION lib)
       endif()
694

695
       install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION include/dlib
696
               FILES_MATCHING PATTERN "*.h" PATTERN "*.cmake"
697
698
               REGEX "${CMAKE_CURRENT_BINARY_DIR}" EXCLUDE)

699

Davis King's avatar
Davis King committed
700
       configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
701
702
703
       # overwrite config.h with the configured one
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION include/dlib)

704
       configure_file(${PROJECT_SOURCE_DIR}/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h)
705
706
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/revision.h DESTINATION include/dlib)

707
       install(FILES "LICENSE.txt" DESTINATION share/doc/dlib)
708

709
710
       ## Config.cmake generation and installation

711
       set(ConfigPackageLocation "${LIB_INSTALL_DIR}/cmake/dlib")
712
713
714
715
716
       install(EXPORT dlib
            NAMESPACE dlib::
            DESTINATION ${ConfigPackageLocation})

       set(CONF_INSTALL_PATH "\${dlib_CMAKE_DIR}/../../../")
717
       configure_file(cmake_utils/dlibConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" @ONLY)
718
719
720

       include(CMakePackageConfigHelpers)
       write_basic_package_version_file(
721
           "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake"
722
723
724
725
726
           VERSION ${VERSION}
           COMPATIBILITY AnyNewerVersion
           )

       install(FILES 
727
728
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" 
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake" 
729
               DESTINATION ${ConfigPackageLocation})
730
731
732

       ## dlib-1.pc generation and installation

733
       configure_file("cmake_utils/dlib.pc.in" "dlib-1.pc" @ONLY)
734
735
736
       install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlib-1.pc"
           DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")

737
738
   endif()

739
endif()
740
741

add_library(dlib::dlib ALIAS dlib)