"tools/vscode:/vscode.git/clone" did not exist on "396d16cb96babda5c0b2f39475d34e3d031bea1d"
CMakeLists.txt 34.9 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
11
12
13

include(cmake_utils/set_compiler_specific_options.cmake)


David Seifert's avatar
David Seifert committed
14
15
16
# Adhere to GNU filesystem layout conventions
include(GNUInstallDirs)

17
# default to a Release build (except if CMAKE_BUILD_TYPE is set)
18
19
include(cmake_utils/release_build_by_default)
include(cmake_utils/use_cpp_11.cmake)
20

21

Davis King's avatar
Davis King committed
22
set(CPACK_PACKAGE_VERSION_MAJOR "19")
Davis King's avatar
Davis King committed
23
set(CPACK_PACKAGE_VERSION_MINOR "7")
24
set(CPACK_PACKAGE_VERSION_PATCH "99")
25
set(VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH})
26
27
28
29
# 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)
30
31
32
   if (NOT DEFINED DLIB_IN_PROJECT_BUILD)
      set(DLIB_IN_PROJECT_BUILD true)
   endif()
33
endif()
34

35
36
37
38
39
40
41
42
if (CMAKE_VERSION VERSION_LESS "3.9.0")
   # 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.  In newer versions of CMake we can instead set CUDA_LINK_LIBRARIES_KEYWORD which fixes this issue.
   cmake_policy(SET CMP0023 OLD)
else()
   set(CUDA_LINK_LIBRARIES_KEYWORD PUBLIC)
endif()
43

44

45
46
47
macro (enable_preprocessor_switch option_name)
   list(APPEND active_preprocessor_switches "-D${option_name}")
endmacro()
48

49
50
51
macro (disable_preprocessor_switch option_name)
   if (active_preprocessor_switches)
      list(REMOVE_ITEM active_preprocessor_switches "-D${option_name}")
52
   endif()
53
endmacro()
54

55
56
macro (toggle_preprocessor_switch option_name)
   if (${option_name})
57
      enable_preprocessor_switch(${option_name})
58
   else()
59
      disable_preprocessor_switch(${option_name})
60
61
   endif()
endmacro()
62

63

64

65
66
67
68
69
70
71
72
# 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()

73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 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_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" )
91
92
   set (DLIB_USE_CUDA_STR
   "Disable this if you don't want to use NVIDIA CUDA" )
93
   set (DLIB_PNG_SUPPORT_STR
94
   "Disable this if you don't want to link against libpng" )
95
96
   set (DLIB_GIF_SUPPORT_STR
   "Disable this if you don't want to link against libgif" )
97
   set (DLIB_JPEG_SUPPORT_STR
98
99
100
   "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" )
101
   #set (DLIB_USE_FFTW_STR "Disable this if you don't want to link against fftw" )
Duncan Palmer's avatar
Duncan Palmer committed
102
103
   set (DLIB_USE_MKL_FFT_STR
   "Disable this is you don't want to use the MKL DFTI FFT implementation" )
104
105
106
   set (DLIB_ENABLE_ASSERTS_STR
   "Enable this if you want to turn on the DLIB_ASSERT macro" )

107

108
   option(DLIB_ENABLE_ASSERTS ${DLIB_ENABLE_ASSERTS_STR} OFF)
109
   option(DLIB_ISO_CPP_ONLY ${DLIB_ISO_CPP_ONLY_STR} OFF)
110
   toggle_preprocessor_switch(DLIB_ISO_CPP_ONLY)
111
   option(DLIB_NO_GUI_SUPPORT ${DLIB_NO_GUI_SUPPORT_STR} OFF)
112
   toggle_preprocessor_switch(DLIB_NO_GUI_SUPPORT)
113
   option(DLIB_ENABLE_STACK_TRACE ${DLIB_ENABLE_STACK_TRACE_STR} OFF)
114
   toggle_preprocessor_switch(DLIB_ENABLE_STACK_TRACE)
115

116
   if(DLIB_ENABLE_ASSERTS)
117
118
119
120
      # 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) 
121
122
      enable_preprocessor_switch(ENABLE_ASSERTS)
      disable_preprocessor_switch(DLIB_DISABLE_ASSERTS)
123
124
125
126
127
   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) 
128
      disable_preprocessor_switch(ENABLE_ASSERTS)
129
130
131
132
133
134
135
136
137
138
139
140
141
142
      # Never force the asserts off when doing an in project build.  The only
      # time this matters is when using visual studio.  The visual studio IDE
      # has a drop down that lets the user select either release or debug
      # builds.  The DLIB_ASSERT macro is setup to enable/disable automatically
      # based on this drop down (via preprocessor magic).  However, if
      # DLIB_DISABLE_ASSERTS is defined it permanently disables asserts no
      # matter what, which would defeat the visual studio drop down.  So here
      # we make a point to not do that kind of severe disabling when in a
      # project build.  It should also be pointed out that DLIB_DISABLE_ASSERTS
      # is only needed when building and installing dlib as a separately
      # installed library.  It doesn't matter when doing an in project build. 
      if (NOT DLIB_IN_PROJECT_BUILD)
         enable_preprocessor_switch(DLIB_DISABLE_ASSERTS)
      endif()
143
144
145
146
147
148
149
150
151
   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)
152
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} OFF)
153
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} OFF)
Duncan Palmer's avatar
Duncan Palmer committed
154
      option(DLIB_USE_MKL_FFT ${DLIB_USE_MKL_FFT_STR} OFF)
155
   else()
156
157
158
159
160
161
      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)
162
      option(DLIB_GIF_SUPPORT ${DLIB_GIF_SUPPORT_STR} ON)
163
      #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} ON)
Duncan Palmer's avatar
Duncan Palmer committed
164
      option(DLIB_USE_MKL_FFT ${DLIB_USE_MKL_FFT_STR} ON)
165
   endif()
166
167
168
169
170
   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) 
171
   toggle_preprocessor_switch(DLIB_GIF_SUPPORT) 
172
   #toggle_preprocessor_switch(DLIB_USE_FFTW)
Duncan Palmer's avatar
Duncan Palmer committed
173
   toggle_preprocessor_switch(DLIB_USE_MKL_FFT)
174

175

176
177
178
179
180
181
182
183
184
185
186
187
   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
188
         data_io/image_dataset_metadata.cpp
Davis King's avatar
Davis King committed
189
         data_io/mnist.cpp
190
         dnn/cpu_dlib.cpp
191
         dnn/tensor_tools.cpp
Davis King's avatar
merged  
Davis King committed
192
   )
Davis King's avatar
Davis King committed
193

194

195
196
197
   set(dlib_needed_libraries)
   set(dlib_needed_includes)

198
   if (DLIB_ISO_CPP_ONLY)
199
       add_library(dlib STATIC ${source_files} )
200
       if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
201
           add_library(dlib_shared SHARED ${source_files} )
202
           add_dependencies(dlib_shared dlib)
203
       endif()
204
   else()
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230

      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
231
         threads/async.cpp
232
233
234
235
         timer/timer.cpp
         stack_trace.cpp
         )

236
237
238
239
240
241
      if(UNIX)
         set(CMAKE_THREAD_PREFER_PTHREAD ON)
         find_package(Threads REQUIRED)
         set(dlib_needed_libraries ${dlib_needed_libraries} ${CMAKE_THREAD_LIBS_INIT})
      endif()

242
243
244
      # we want to link to the right stuff depending on our platform.  
      if (WIN32 AND NOT CYGWIN) ###############################################################################
         if (DLIB_NO_GUI_SUPPORT)
245
            set (dlib_needed_libraries ws2_32 winmm)
246
         else()
247
            set (dlib_needed_libraries ws2_32 winmm comctl32 gdi32 imm32)
248
249
         endif()
      elseif(APPLE) ############################################################################
Davis King's avatar
Davis King committed
250
         set(CMAKE_MACOSX_RPATH 1)
251
         if (NOT DLIB_NO_GUI_SUPPORT)
252
253
            find_package(X11 QUIET)
            if (X11_FOUND)
254
               # If both X11 and anaconda are installed, it's possible for the
Davis King's avatar
merged  
Davis King committed
255
256
               # anaconda path to appear before /opt/X11, so we remove anaconda.
               foreach (ITR ${X11_INCLUDE_DIR})
257
                  if ("${ITR}" MATCHES "(.*)(Ana|ana|mini)conda(.*)")
258
                     list (REMOVE_ITEM X11_INCLUDE_DIR ${ITR})
Davis King's avatar
merged  
Davis King committed
259
                  endif ()
260
               endforeach(ITR)
261
262
               include_directories(${X11_INCLUDE_DIR})
               set (dlib_needed_libraries ${dlib_needed_libraries} ${X11_LIBRARIES})
263
            else()
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
               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)
282
283
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
284
285
               message(" *** Make sure XQuartz is installed if you want GUI support.               ***")
               message(" *** You can download XQuartz from: http://xquartz.macosforge.org/landing/ ***")
286
               message(" *****************************************************************************")
287
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
288
               enable_preprocessor_switch(DLIB_NO_GUI_SUPPORT)
289
            endif()
290
291
         endif()

292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
         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()
312
313
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
314
315
               message(" *** Make sure libx11-dev is installed if you want GUI support.            ***")
               message(" *** On Ubuntu run: sudo apt-get install libx11-dev                        ***")
316
               message(" *****************************************************************************")
317
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
318
               enable_preprocessor_switch(DLIB_NO_GUI_SUPPORT)
319
            endif()
320
321
         endif()

322
323
         mark_as_advanced(nsllib pthreadlib socketlib)
      endif () ##################################################################################
324

325
326
327
328
329
330
331
332
333
334
335
336
      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()
337

338
      INCLUDE (CheckFunctionExists)
339

340
341
342
      if (DLIB_GIF_SUPPORT)
         find_package(GIF QUIET)
         if (GIF_FOUND)
343
            set (dlib_needed_includes ${dlib_needed_includes} ${GIF_INCLUDE_DIR})
344
345
346
347
348
349
350
            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()

351
      if (DLIB_PNG_SUPPORT)
352
         # try to find libpng 
Davis King's avatar
Davis King committed
353
         find_package(PNG QUIET)
354
355
         # Make sure there isn't something wrong with the version of LIBPNG
         # installed on this system.  
356
         if (PNG_FOUND)
357
            set(CMAKE_REQUIRED_LIBRARIES ${PNG_LIBRARIES})
358
359
            CHECK_FUNCTION_EXISTS(png_create_read_struct LIBPNG_IS_GOOD)
         endif()
360
         if (PNG_FOUND AND LIBPNG_IS_GOOD)
361
            include_directories(${PNG_INCLUDE_DIR})
362
            set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARIES})
363
            set(REQUIRES_LIBS " libpng")
364
         else()
365
366
367
368
369
370
371
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
398
            # 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
               )
399
400

            include(cmake_utils/check_if_neon_available.cmake)
401
402
            if (ARM_NEON_IS_AVAILABLE)
               message (STATUS "NEON instructions will be used for libpng.")
403
404
405
406
407
408
409
410
               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()
411
            set(REQUIRES_LIBS "")
412
         endif()
413
414
415
416
         set(source_files ${source_files}
            image_loader/png_loader.cpp
            image_saver/save_png.cpp
            )
417
      endif()
418

419
      if (DLIB_JPEG_SUPPORT)
420
         # try to find libjpeg 
421
         find_package(JPEG QUIET)
422
         # Make sure there isn't something wrong with the version of libjpeg 
423
424
         # 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).
425
         if (JPEG_FOUND AND NOT ("${JPEG_INCLUDE_DIR}" MATCHES "(.*)(Ana|ana|mini)conda(.*)"))
426
427
428
            set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARY})
            CHECK_FUNCTION_EXISTS(jpeg_read_header LIBJPEG_IS_GOOD)
         endif()
429
         if (JPEG_FOUND AND LIBJPEG_IS_GOOD AND NOT APPLE)
430
431
432
            include_directories(${JPEG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${JPEG_LIBRARY})
         else()
433
            # If we can't find libjpeg then statically compile it in.
434
            add_definitions(-DDLIB_JPEG_STATIC)
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
            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
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
                  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
                  )
481
         endif()
482
483
         set(source_files ${source_files}
            image_loader/jpeg_loader.cpp
Davis King's avatar
Davis King committed
484
            image_saver/save_jpeg.cpp
485
            )
486
487
      endif()

488

489
490
      if (DLIB_USE_BLAS OR DLIB_USE_LAPACK OR DLIB_USE_MKL_FFT)
          # Try to find BLAS, LAPACK and MKL
491
         include(cmake_utils/cmake_find_blas.txt)
492

493
494
495
496
497
         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 )
498
               toggle_preprocessor_switch(DLIB_USE_BLAS)
499
            endif()
500
501
         endif()

502
503
504
505
506
         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 )
507
               toggle_preprocessor_switch(DLIB_USE_LAPACK)
508
            endif()
509
         endif()
510

511
         if (DLIB_USE_MKL_FFT)
512
            if (found_intel_mkl AND found_intel_mkl_headers)
513
               set (dlib_needed_includes ${dlib_needed_includes} ${mkl_include_dir})
514
515
516
517
518
519
               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
520
521
      endif()

522

523
      if (DLIB_USE_CUDA)
524
         find_package(CUDA 7.5)
525

526
527
528
529
         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()
530

531
         if (CUDA_FOUND AND (NOT USING_OLD_VISUAL_STUDIO_COMPILER))
532

533
534
535
536
            # 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.
537
            if (APPLE)
538
               set(CUDA_PROPAGATE_HOST_FLAGS OFF)
539
540
               # Grab all the -D flags from CMAKE_CXX_FLAGS so we can pass them
               # to nvcc.
541
               string(REGEX MATCHALL "-D[^ ]*" FLAGS_FOR_NVCC "${CMAKE_CXX_FLAGS}")
542
543
            endif()

544

545
            set(CUDA_HOST_COMPILATION_CPP ON)
546
547
548
            # 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).
549
            list(APPEND CUDA_NVCC_FLAGS "-arch=sm_30;-D__STRICT_ANSI__;-D_MWAITXINTRIN_H_INCLUDED;-D_FORCE_INLINES;${FLAGS_FOR_NVCC}")
550
            list(APPEND CUDA_NVCC_FLAGS ${active_preprocessor_switches})
551
552
553
            if (NOT MSVC)
               list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
            endif()
554
555
556
            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.
557
558
559
               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()
560
            endif()
561

562
            include(cmake_utils/test_for_cudnn/find_cudnn.txt)
563

564
            if (cudnn AND cudnn_include AND NOT DEFINED cuda_test_compile_worked AND NOT DEFINED cudnn_test_compile_worked)
565
566
               # 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...")
567
568
569
570
571

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

572
               if (NOT MSVC) # see https://github.com/davisking/dlib/issues/363
573
574
575
                  list(APPEND CUDA_TEST_CMAKE_FLAGS "-DCUDA_HOST_COMPILER=${CUDA_HOST_COMPILER}")
               endif()

576
               try_compile(cuda_test_compile_worked ${PROJECT_BINARY_DIR}/cuda_test_build 
577
                           ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cuda cuda_test
578
                           CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
579
                           )
580
               if (NOT cuda_test_compile_worked)
581
582
583
584
                  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 
585
                              ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cudnn cudnn_test
586
                              CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
587
                                          )
588
589
590
591
                  if (NOT cudnn_test_compile_worked)
                     message(STATUS "*** Found cuDNN, but it looks like the wrong version so dlib will not use it.              ***")
                     message(STATUS "*** Dlib requires cuDNN V5.0 OR GREATER.  Since cuDNN is not found DLIB WILL NOT USE CUDA. ***")
                     message(STATUS "*** If you have cuDNN then set CMAKE_PREFIX_PATH to include cuDNN's folder.                ***")
592
                  endif()
593
594
               endif()
            endif()
595

596
597
            # Find where cuSOLVER is since the FindCUDA cmake package doesn't
            # bother to look for it.
598
            get_filename_component(cuda_blas_path "${CUDA_CUBLAS_LIBRARIES}" DIRECTORY)
599
            find_library(cusolver cusolver HINTS ${cuda_blas_path})
600
601
602
603
604
605
            mark_as_advanced(cusolver)
            # Also find OpenMP since cuSOLVER needs it.  Importantly, we only
            # look for one to link to if our use of BLAS, specifically the
            # Intel MKL, hasn't already decided what to use.  This is because
            # it makes the MKL bug out if you link to another openmp lib other
            # than Intel's when you use the MKL.
606
607
608
609
            if (NOT openmp_libarires AND NOT MSVC)
               find_package(OpenMP)
               if (OPENMP_FOUND)
                  set(openmp_libarires ${OpenMP_CXX_FLAGS}) 
610
               else()
611
612
                  message(STATUS "*** Didn't find OpenMP, which is required to use CUDA. ***")
                  set(CUDA_FOUND 0)
613
               endif()
614
615
            endif()
         endif()
616

617
         if (CUDA_FOUND AND cudnn AND (NOT USING_OLD_VISUAL_STUDIO_COMPILER) AND cuda_test_compile_worked AND cudnn_test_compile_worked AND cudnn_include)
618
            set(source_files ${source_files} 
Davis King's avatar
Davis King committed
619
620
621
               dnn/cuda_dlib.cu 
               dnn/cudnn_dlibapi.cpp
               dnn/cublas_dlibapi.cpp
622
               dnn/cusolver_dlibapi.cu
Davis King's avatar
Davis King committed
623
               dnn/curand_dlibapi.cpp
624
               dnn/cuda_data_ptr.cpp
625
               dnn/gpu_data.cpp
626
               )
Davis King's avatar
Davis King committed
627
628
629
630
            set(dlib_needed_libraries ${dlib_needed_libraries} 
                                      ${CUDA_CUBLAS_LIBRARIES} 
                                      ${cudnn}
                                      ${CUDA_curand_LIBRARY}
631
                                      ${cusolver}
632
                                      ${openmp_libarires}
Davis King's avatar
Davis King committed
633
                                      )
634
            include_directories(${cudnn_include})
635
            message(STATUS "Enabling CUDA support for dlib.  DLIB WILL USE CUDA")
636
637
         else()
            set(DLIB_USE_CUDA OFF CACHE STRING ${DLIB_USE_BLAS_STR} FORCE )
638
            toggle_preprocessor_switch(DLIB_USE_CUDA)
639
            if (USING_OLD_VISUAL_STUDIO_COMPILER)
640
               message(STATUS "*** Dlib CUDA support requires C++11 but your compiler doesn't support it. ***")
641
            endif()
642
            message(STATUS "Disabling CUDA support for dlib.  DLIB WILL NOT USE CUDA")
643
644
645
         endif()
      endif()
      
646

647
648
649
650
651
652
      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)
653
            set(dlib_needed_includes ${dlib_needed_includes} ${sqlite_path2})
654
655
656
657
658
            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)
659
660
661
      endif()


662

663
      if (DLIB_USE_FFTW)
664
665
666
667
         find_library(fftw fftw3)
         # make sure fftw3.h is in the include path
         find_path(fftw_path fftw3.h)
         if (fftw AND fftw_path)
668
            set(dlib_needed_includes ${dlib_needed_includes} ${fftw_path})
669
670
            set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
         else()
671
672
            set(DLIB_USE_FFTW OFF CACHE STRING ${DLIB_USE_FFTW_STR} FORCE )
            toggle_preprocessor_switch(DLIB_USE_FFTW)
673
         endif()
674
         mark_as_advanced(fftw fftw_path)
675
676
      endif()

677

678
679
680

      # Tell CMake to build dlib via add_library()/cuda_add_library()
      if (DLIB_USE_CUDA)
681
682
683
         # 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})
684
685
686
687
         cuda_add_library(dlib STATIC ${source_files} )
      else()
         add_library(dlib STATIC ${source_files} )
      endif()
688
      if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
689
         if (DLIB_USE_CUDA)
690
            cuda_add_library(dlib_shared SHARED ${source_files} )
691
            add_dependencies(dlib_shared dlib)
692
         else()
693
            add_library(dlib_shared SHARED ${source_files} )
694
            add_dependencies(dlib_shared dlib)
695
         endif()
696
      endif()
697

698
   endif ()  ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################
699

700

701
702
703
   target_include_directories(dlib
                              INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                              INTERFACE $<INSTALL_INTERFACE:include>
704
                              PUBLIC ${dlib_needed_includes}
705
                              )
706
707
708
709
710
711
   target_link_libraries(dlib PRIVATE ${dlib_needed_libraries})
   if (DLIB_IN_PROJECT_BUILD)
      target_compile_options(dlib PUBLIC ${active_preprocessor_switches})
   else()
      target_compile_options(dlib PRIVATE ${active_preprocessor_switches})
   endif()
712
   if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
713
714
715
716
717
      target_include_directories(dlib_shared
                                 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                                 INTERFACE $<INSTALL_INTERFACE:include>
                                 PUBLIC ${dlib_needed_includes}
                                 )
718
      target_link_libraries(dlib_shared PUBLIC ${dlib_needed_libraries})
719
      target_compile_options(dlib_shared PRIVATE ${active_preprocessor_switches})
720
   endif()
721
722


723
724
   # 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)
725
      add_library(dlib_all_source_cpp STATIC all/source.cpp) 
726
      target_link_libraries(dlib_all_source_cpp dlib)
727
      target_compile_options(dlib_all_source_cpp PUBLIC ${active_preprocessor_switches})
728
729
730
731
732
733
734
735
736
737
      enable_cpp11_for_target(dlib_all_source_cpp)
   endif()

   if (TARGET dlib)
      enable_cpp11_for_target(dlib)
      target_compile_options(dlib PUBLIC ${active_compile_opts})
   endif()
   if (TARGET dlib_shared)
      enable_cpp11_for_target(dlib_shared)
      target_compile_options(dlib_shared PUBLIC ${active_compile_opts})
738
739
   endif()

740
   # Install the library
741
742
   if (NOT DLIB_IN_PROJECT_BUILD)
       if(UNIX)
743
           set_target_properties(dlib_shared PROPERTIES
744
745
                                        OUTPUT_NAME dlib 
                                        VERSION ${VERSION})
746
           install(TARGETS dlib dlib_shared
747
                   EXPORT dlib 
David Seifert's avatar
David Seifert committed
748
749
750
                   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # Windows (including cygwin) considers .dll to be runtime artifacts
                   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
                   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
751
752
753
       else()
           install(TARGETS dlib
                   EXPORT dlib 
David Seifert's avatar
David Seifert committed
754
755
756
                   RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # Windows considers .dll to be runtime artifacts
                   LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
                   ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
757
       endif()
758

David Seifert's avatar
David Seifert committed
759
       install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dlib
760
               FILES_MATCHING PATTERN "*.h" PATTERN "*.cmake"
761
762
               REGEX "${CMAKE_CURRENT_BINARY_DIR}" EXCLUDE)

763

Davis King's avatar
Davis King committed
764
       configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
765
       # overwrite config.h with the configured one
David Seifert's avatar
David Seifert committed
766
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dlib)
767

768
       configure_file(${PROJECT_SOURCE_DIR}/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h)
David Seifert's avatar
David Seifert committed
769
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/revision.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dlib)
770

771
772
       ## Config.cmake generation and installation

David Seifert's avatar
David Seifert committed
773
       set(ConfigPackageLocation "${CMAKE_INSTALL_LIBDIR}/cmake/dlib")
774
775
776
777
       install(EXPORT dlib
            NAMESPACE dlib::
            DESTINATION ${ConfigPackageLocation})

778
       configure_file(cmake_utils/dlibConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" @ONLY)
779
780
781

       include(CMakePackageConfigHelpers)
       write_basic_package_version_file(
782
           "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake"
783
784
785
786
787
           VERSION ${VERSION}
           COMPATIBILITY AnyNewerVersion
           )

       install(FILES 
788
789
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" 
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake" 
790
               DESTINATION ${ConfigPackageLocation})
791
792
793

       ## dlib-1.pc generation and installation

794
       configure_file("cmake_utils/dlib.pc.in" "dlib-1.pc" @ONLY)
795
       install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlib-1.pc"
David Seifert's avatar
David Seifert committed
796
           DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
797

798
799
   endif()

800
endif()
801
802

add_library(dlib::dlib ALIAS dlib)