CMakeLists.txt 35.2 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
192
         global_optimization/global_function_search.cpp
Davis King's avatar
merged  
Davis King committed
193
   )
Davis King's avatar
Davis King committed
194

195

196
197
198
   set(dlib_needed_libraries)
   set(dlib_needed_includes)

199
   if (DLIB_ISO_CPP_ONLY)
200
       add_library(dlib STATIC ${source_files} )
201
       if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
202
           add_library(dlib_shared SHARED ${source_files} )
203
           add_dependencies(dlib_shared dlib)
204
       endif()
205
   else()
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
231

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

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

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

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

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

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

339
      INCLUDE (CheckFunctionExists)
340

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

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

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

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

489

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

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

503
504
505
         if (DLIB_USE_LAPACK)
            if (lapack_found)
               set (dlib_needed_libraries ${dlib_needed_libraries} ${lapack_libraries})
506
507
508
509
510
511
512
               if (lapack_with_underscore)
                  set(LAPACK_FORCE_UNDERSCORE 1)
                  enable_preprocessor_switch(LAPACK_FORCE_UNDERSCORE)
               elseif (lapack_without_underscore)
                  set(LAPACK_FORCE_NOUNDERSCORE 1)
                  enable_preprocessor_switch(LAPACK_FORCE_NOUNDERSCORE)
               endif ()
513
514
            else()
               set(DLIB_USE_LAPACK OFF CACHE STRING ${DLIB_USE_LAPACK_STR} FORCE )
515
               toggle_preprocessor_switch(DLIB_USE_LAPACK)
516
            endif()
517
         endif()
518

519
         if (DLIB_USE_MKL_FFT)
520
            if (found_intel_mkl AND found_intel_mkl_headers)
521
               set (dlib_needed_includes ${dlib_needed_includes} ${mkl_include_dir})
522
523
524
525
526
527
               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
528
529
      endif()

530

531
      if (DLIB_USE_CUDA)
532
         find_package(CUDA 7.5)
533

534
535
536
537
         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()
538

539
         if (CUDA_FOUND AND (NOT USING_OLD_VISUAL_STUDIO_COMPILER))
540

541
542
543
544
            # 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.
545
            if (APPLE)
546
               set(CUDA_PROPAGATE_HOST_FLAGS OFF)
547
548
               # Grab all the -D flags from CMAKE_CXX_FLAGS so we can pass them
               # to nvcc.
549
               string(REGEX MATCHALL "-D[^ ]*" FLAGS_FOR_NVCC "${CMAKE_CXX_FLAGS}")
550
551
            endif()

552

553
            set(CUDA_HOST_COMPILATION_CPP ON)
554
555
556
            # 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).
557
            list(APPEND CUDA_NVCC_FLAGS "-arch=sm_30;-D__STRICT_ANSI__;-D_MWAITXINTRIN_H_INCLUDED;-D_FORCE_INLINES;${FLAGS_FOR_NVCC}")
558
            list(APPEND CUDA_NVCC_FLAGS ${active_preprocessor_switches})
559
560
561
            if (NOT MSVC)
               list(APPEND CUDA_NVCC_FLAGS "-std=c++11")
            endif()
562
563
564
            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.
565
566
567
               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()
568
            endif()
569

570
            include(cmake_utils/test_for_cudnn/find_cudnn.txt)
571

572
            if (cudnn AND cudnn_include AND NOT DEFINED cuda_test_compile_worked AND NOT DEFINED cudnn_test_compile_worked)
573
574
               # 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...")
575
576
577
578
579

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

580
               if (NOT MSVC) # see https://github.com/davisking/dlib/issues/363
581
582
583
                  list(APPEND CUDA_TEST_CMAKE_FLAGS "-DCUDA_HOST_COMPILER=${CUDA_HOST_COMPILER}")
               endif()

584
               try_compile(cuda_test_compile_worked ${PROJECT_BINARY_DIR}/cuda_test_build 
585
                           ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cuda cuda_test
586
                           CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
587
                           )
588
               if (NOT cuda_test_compile_worked)
589
590
591
592
                  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 
593
                              ${PROJECT_SOURCE_DIR}/cmake_utils/test_for_cudnn cudnn_test
594
                              CMAKE_FLAGS ${CUDA_TEST_CMAKE_FLAGS}
595
                                          )
596
597
598
599
                  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.                ***")
600
                  endif()
601
602
               endif()
            endif()
603

604
605
            # Find where cuSOLVER is since the FindCUDA cmake package doesn't
            # bother to look for it.
606
            get_filename_component(cuda_blas_path "${CUDA_CUBLAS_LIBRARIES}" DIRECTORY)
607
            find_library(cusolver cusolver HINTS ${cuda_blas_path})
608
609
610
611
612
613
            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.
614
615
616
617
            if (NOT openmp_libarires AND NOT MSVC)
               find_package(OpenMP)
               if (OPENMP_FOUND)
                  set(openmp_libarires ${OpenMP_CXX_FLAGS}) 
618
               else()
619
620
                  message(STATUS "*** Didn't find OpenMP, which is required to use CUDA. ***")
                  set(CUDA_FOUND 0)
621
               endif()
622
623
            endif()
         endif()
624

625
         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)
626
            set(source_files ${source_files} 
Davis King's avatar
Davis King committed
627
628
629
               dnn/cuda_dlib.cu 
               dnn/cudnn_dlibapi.cpp
               dnn/cublas_dlibapi.cpp
630
               dnn/cusolver_dlibapi.cu
Davis King's avatar
Davis King committed
631
               dnn/curand_dlibapi.cpp
632
               dnn/cuda_data_ptr.cpp
633
               dnn/gpu_data.cpp
634
               )
Davis King's avatar
Davis King committed
635
636
637
638
            set(dlib_needed_libraries ${dlib_needed_libraries} 
                                      ${CUDA_CUBLAS_LIBRARIES} 
                                      ${cudnn}
                                      ${CUDA_curand_LIBRARY}
639
                                      ${cusolver}
640
                                      ${openmp_libarires}
Davis King's avatar
Davis King committed
641
                                      )
642
            include_directories(${cudnn_include})
643
            message(STATUS "Enabling CUDA support for dlib.  DLIB WILL USE CUDA")
644
645
         else()
            set(DLIB_USE_CUDA OFF CACHE STRING ${DLIB_USE_BLAS_STR} FORCE )
646
            toggle_preprocessor_switch(DLIB_USE_CUDA)
647
            if (USING_OLD_VISUAL_STUDIO_COMPILER)
648
               message(STATUS "*** Dlib CUDA support requires C++11 but your compiler doesn't support it. ***")
649
            endif()
650
            message(STATUS "Disabling CUDA support for dlib.  DLIB WILL NOT USE CUDA")
651
652
653
         endif()
      endif()
      
654

655
656
657
658
659
      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)
660
            set(dlib_needed_includes ${dlib_needed_includes} ${sqlite_path})
661
662
663
664
            set(dlib_needed_libraries ${dlib_needed_libraries} ${sqlite} )
         else()
            set(DLIB_LINK_WITH_SQLITE3 OFF CACHE STRING ${DLIB_LINK_WITH_SQLITE3_STR} FORCE )
         endif()
665
         mark_as_advanced(sqlite sqlite_path)
666
667
668
      endif()


669

670
      if (DLIB_USE_FFTW)
671
672
673
674
         find_library(fftw fftw3)
         # make sure fftw3.h is in the include path
         find_path(fftw_path fftw3.h)
         if (fftw AND fftw_path)
675
            set(dlib_needed_includes ${dlib_needed_includes} ${fftw_path})
676
677
            set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
         else()
678
679
            set(DLIB_USE_FFTW OFF CACHE STRING ${DLIB_USE_FFTW_STR} FORCE )
            toggle_preprocessor_switch(DLIB_USE_FFTW)
680
         endif()
681
         mark_as_advanced(fftw fftw_path)
682
683
      endif()

684

685
686
687

      # Tell CMake to build dlib via add_library()/cuda_add_library()
      if (DLIB_USE_CUDA)
688
689
690
         # 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})
691
692
693
694
         cuda_add_library(dlib STATIC ${source_files} )
      else()
         add_library(dlib STATIC ${source_files} )
      endif()
695
      if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
696
         if (DLIB_USE_CUDA)
697
            cuda_add_library(dlib_shared SHARED ${source_files} )
698
            add_dependencies(dlib_shared dlib)
699
         else()
700
            add_library(dlib_shared SHARED ${source_files} )
701
            add_dependencies(dlib_shared dlib)
702
         endif()
703
      endif()
704

705
   endif ()  ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################
706

707

708
709
710
   target_include_directories(dlib
                              INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                              INTERFACE $<INSTALL_INTERFACE:include>
711
                              PUBLIC ${dlib_needed_includes}
712
                              )
713
714
715
716
717
718
   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()
719
   if (UNIX AND NOT DLIB_IN_PROJECT_BUILD)
720
721
722
723
724
      target_include_directories(dlib_shared
                                 INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
                                 INTERFACE $<INSTALL_INTERFACE:include>
                                 PUBLIC ${dlib_needed_includes}
                                 )
725
      target_link_libraries(dlib_shared PUBLIC ${dlib_needed_libraries})
726
      target_compile_options(dlib_shared PRIVATE ${active_preprocessor_switches})
727
   endif()
728
729


730
731
   # 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)
732
      add_library(dlib_all_source_cpp STATIC all/source.cpp) 
733
      target_link_libraries(dlib_all_source_cpp dlib)
734
      target_compile_options(dlib_all_source_cpp PUBLIC ${active_preprocessor_switches})
735
736
737
738
739
740
741
742
743
744
      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})
745
746
   endif()

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

David Seifert's avatar
David Seifert committed
766
       install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dlib
767
               FILES_MATCHING PATTERN "*.h" PATTERN "*.cmake"
768
769
               REGEX "${CMAKE_CURRENT_BINARY_DIR}" EXCLUDE)

770

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

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

778
779
       ## Config.cmake generation and installation

David Seifert's avatar
David Seifert committed
780
       set(ConfigPackageLocation "${CMAKE_INSTALL_LIBDIR}/cmake/dlib")
781
782
783
784
       install(EXPORT dlib
            NAMESPACE dlib::
            DESTINATION ${ConfigPackageLocation})

785
       configure_file(cmake_utils/dlibConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" @ONLY)
786
787
788

       include(CMakePackageConfigHelpers)
       write_basic_package_version_file(
789
           "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake"
790
791
792
793
794
           VERSION ${VERSION}
           COMPATIBILITY AnyNewerVersion
           )

       install(FILES 
795
796
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfig.cmake" 
                    "${CMAKE_CURRENT_BINARY_DIR}/config/dlibConfigVersion.cmake" 
797
               DESTINATION ${ConfigPackageLocation})
798
799
800

       ## dlib-1.pc generation and installation

801
       configure_file("cmake_utils/dlib.pc.in" "dlib-1.pc" @ONLY)
802
       install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlib-1.pc"
David Seifert's avatar
David Seifert committed
803
           DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
804

805
806
   endif()

807
endif()
808
809

add_library(dlib::dlib ALIAS dlib)