CMakeLists.txt 19.3 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
# setting this makes CMake allow normal looking if else statements
7
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
8

9
cmake_minimum_required(VERSION 2.4)
10

11
12
13
14
15
16
project(dlib)

set(CPACK_PACKAGE_VERSION_MAJOR "18")
set(CPACK_PACKAGE_VERSION_MINOR "17")
set(CPACK_PACKAGE_VERSION_PATCH "99")

17
set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
18
# Suppress cmake warnings about changes in new versions.
19
20
if(COMMAND cmake_policy) 
   cmake_policy(SET CMP0003 NEW) 
21
22
23
   if (POLICY CMP0054)
      cmake_policy(SET CMP0054 NEW)
   endif()
24
endif()
25

26
27
28
29

# make macros that can add #define directives to the entire project.  Not just 
# to the dlib library itself.  I.e. to dlib and to any projects that depend
# on dlib.
30
macro ( add_global_define def_name )
31
32
33
34
35
   if (NOT CMAKE_CXX_FLAGS MATCHES "-D${def_name}")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${def_name}" 
         CACHE STRING "Flags used by the compiler during all C++ builds." 
         FORCE)
   endif ()
36
37
endmacro()
macro ( remove_global_define def_name )
38
39
40
41
42
43
   if (CMAKE_CXX_FLAGS MATCHES " -D${def_name}")
      string (REGEX REPLACE " -D${def_name}" "" temp_var ${CMAKE_CXX_FLAGS}) 
      set (CMAKE_CXX_FLAGS "${temp_var}" 
         CACHE STRING "Flags used by the compiler during all C++ builds." 
         FORCE)
   endif ()
44
endmacro()
45
46
47
48
49
50
51
52
53


# Make sure ENABLE_ASSERTS is defined for debug builds
if (NOT CMAKE_CXX_FLAGS_DEBUG MATCHES "-DENABLE_ASSERTS")
   set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLE_ASSERTS" 
      CACHE STRING "Flags used by the compiler during C++ debug builds." 
      FORCE)
endif ()

54
55
56
if(UNIX AND NOT CMAKE_BUILD_TYPE MATCHES DEBUG)
    set (RELEASE_MODE true)
endif()
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

# 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" )
78
   set (DLIB_PNG_SUPPORT_STR
79
   "Disable this if you don't want to link against libpng" )
80
   set (DLIB_JPEG_SUPPORT_STR
81
82
83
   "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" )
84
   #set (DLIB_USE_FFTW_STR "Disable this if you don't want to link against fftw" )
85
86
87
88

   option(DLIB_ISO_CPP_ONLY ${DLIB_ISO_CPP_ONLY_STR} OFF)
   option(DLIB_NO_GUI_SUPPORT ${DLIB_NO_GUI_SUPPORT_STR} OFF)
   option(DLIB_ENABLE_STACK_TRACE ${DLIB_ENABLE_STACK_TRACE_STR} OFF)
89

90
91
92
93
94
95
96
   option(DLIB_ENABLE_ASSERTS ${DLIB_ENABLE_ASSERTS_STR} OFF)

   if(DLIB_ENABLE_ASSERTS)
       set (DLIB_DISABLE_ASSERTS false)
       set (ENABLE_ASSERTS true) # we need the CMake variable to properly configure config.h.in
   else()
       set (DLIB_DISABLE_ASSERTS true)
97
98
   endif()

99
100
   option(DLIB_USE_BLAS ${DLIB_USE_BLAS_STR} ON)
   option(DLIB_USE_LAPACK ${DLIB_USE_LAPACK_STR} ON)
101
102
   option(DLIB_PNG_SUPPORT ${DLIB_PNG_SUPPORT_STR} ON)
   option(DLIB_JPEG_SUPPORT ${DLIB_JPEG_SUPPORT_STR} ON)
103
   option(DLIB_LINK_WITH_SQLITE3 ${DLIB_LINK_WITH_SQLITE3_STR} ON)
104
   #option(DLIB_USE_FFTW ${DLIB_USE_FFTW_STR} ON)
105

106
107
108
109
110
111
112
113
114
115
116
117
118
   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
         data_io/image_dataset_metadata.cpp)
119

120
   if (DLIB_ISO_CPP_ONLY)
121
122
123
124
125
       if (RELEASE_MODE)
           add_library(dlib SHARED ${source_files} )
       else()
           add_library(dlib STATIC ${source_files} )
       endif()
126
   else()
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

      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
         timer/timer.cpp
         stack_trace.cpp
         )

157
158
159
      # we want to link to the right stuff depending on our platform.  
      if (WIN32 AND NOT CYGWIN) ###############################################################################
         if (DLIB_NO_GUI_SUPPORT)
160
            set (dlib_needed_libraries ws2_32 winmm)
161
         else()
162
            set (dlib_needed_libraries ws2_32 winmm comctl32 gdi32 imm32)
163
164
165
166
167
168
169
         endif()
      elseif(APPLE) ############################################################################
         find_library(pthreadlib pthread)
         set (dlib_needed_libraries ${pthreadlib})

         if (NOT DLIB_NO_GUI_SUPPORT)
            find_library(xlib X11)
Davis King's avatar
Davis King committed
170
171
172
173
            # 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
174
175
               PATHS 
               /Developer/SDKs/MacOSX10.4u.sdk/usr/X11R6/include
Davis King's avatar
Davis King committed
176
               /opt/local/include
177
178
179
180
181
182
183
               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} )
            else()
184
185
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
186
187
               message(" *** Make sure XQuartz is installed if you want GUI support.               ***")
               message(" *** You can download XQuartz from: http://xquartz.macosforge.org/landing/ ***")
188
               message(" *****************************************************************************")
189
190
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
            endif()
191
192
         endif()

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
         mark_as_advanced(pthreadlib xlib xlib_path x11_path)
      else () ##################################################################################
         find_library(pthreadlib pthread)
         set (dlib_needed_libraries ${pthreadlib})

         # 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()
216
217
               message(" *****************************************************************************")
               message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
218
219
               message(" *** Make sure libx11-dev is installed if you want GUI support.            ***")
               message(" *** On Ubuntu run: sudo apt-get install libx11-dev                        ***")
220
               message(" *****************************************************************************")
221
222
               set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
            endif()
223
224
         endif()

225
226
         mark_as_advanced(nsllib pthreadlib socketlib)
      endif () ##################################################################################
227

228
229
230
231
232
233
234
235
236
237
238
239
      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()
240

241
      INCLUDE (CheckFunctionExists)
242

243
      if (DLIB_PNG_SUPPORT)
244
         # try to find libpng 
Davis King's avatar
Davis King committed
245
         find_package(PNG QUIET)
246
247
         # Make sure there isn't something wrong with the version of LIBPNG
         # installed on this system.  
248
249
250
251
         if (PNG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${PNG_LIBRARY})
            CHECK_FUNCTION_EXISTS(png_create_read_struct LIBPNG_IS_GOOD)
         endif()
252
         if (PNG_FOUND AND LIBPNG_IS_GOOD)
253
254
255
            include_directories(${PNG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARY})
         else()
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
            # 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
               )
290
         endif()
291
292
293
294
         set(source_files ${source_files}
            image_loader/png_loader.cpp
            image_saver/save_png.cpp
            )
295
      endif()
296

297
      if (DLIB_JPEG_SUPPORT)
298
         # try to find libjpeg 
299
         find_package(JPEG QUIET)
300
         # Make sure there isn't something wrong with the version of libjpeg 
301
302
         # 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).
303
304
305
306
         if (JPEG_FOUND)
            set(CMAKE_REQUIRED_LIBRARIES ${JPEG_LIBRARY})
            CHECK_FUNCTION_EXISTS(jpeg_read_header LIBJPEG_IS_GOOD)
         endif()
307
         if (JPEG_FOUND AND LIBJPEG_IS_GOOD AND NOT APPLE)
308
309
310
            include_directories(${JPEG_INCLUDE_DIR})
            set (dlib_needed_libraries ${dlib_needed_libraries} ${JPEG_LIBRARY})
         else()
311
            # If we can't find libjpeg then statically compile it in.
312
            add_definitions(-DDLIB_JPEG_STATIC)
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
            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
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
                  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
                  )
359
         endif()
360
361
         set(source_files ${source_files}
            image_loader/jpeg_loader.cpp
Davis King's avatar
Davis King committed
362
            image_saver/save_jpeg.cpp
363
            )
364
365
      endif()

366

367
368
369
      if (DLIB_USE_BLAS OR DLIB_USE_LAPACK)
         # Try to find BLAS and LAPACK 
         include(cmake_find_blas.txt)
370

371
372
373
374
375
376
         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 )
            endif()
377
378
         endif()

379
380
381
382
383
384
         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 )
            endif()
385
         endif()
386
387
388
      endif()


389

390
391
392
393
394
395
396
397
398
399
400
401
      if (DLIB_LINK_WITH_SQLITE3)
         find_library(sqlite sqlite3)
         # make sure sqlite3.h is in the include path
         find_path(sqlite_path sqlite3.h)
         if (sqlite AND sqlite_path)
            get_filename_component(sqlite_path2 ${sqlite_path} PATH CACHE)
            include_directories(${sqlite_path2})
            set(dlib_needed_libraries ${dlib_needed_libraries} ${sqlite} )
         else()
            set(DLIB_LINK_WITH_SQLITE3 OFF CACHE STRING ${DLIB_LINK_WITH_SQLITE3_STR} FORCE )
         endif()
         mark_as_advanced(sqlite sqlite_path sqlite_path2)
402
403
404
      endif()


405

406
      if (DLIB_USE_FFTW)
407
408
409
410
         find_library(fftw fftw3)
         # make sure fftw3.h is in the include path
         find_path(fftw_path fftw3.h)
         if (fftw AND fftw_path)
411
            include_directories(${fftw_path})
412
413
            set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
         else()
414
            set(DLIB_USE_FFTW OFF CACHE STRING ${DLIB_LINK_WITH_SQLITE3_STR} FORCE )
415
         endif()
416
         mark_as_advanced(fftw fftw_path)
417
418
      endif()

419
420
421
422
423
      if (RELEASE_MODE)
          add_library(dlib SHARED ${source_files} )
      else()
          add_library(dlib STATIC ${source_files} )
      endif()
424

425
      target_link_libraries(dlib ${dlib_needed_libraries} )
426

427
   endif ()  ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################
428

429
430
431
432
433
434
435
436
   # Install the library
   if (RELEASE_MODE)
       install(TARGETS dlib LIBRARY DESTINATION lib)

       install(DIRECTORY ${CMAKE_SOURCE_DIR}/ DESTINATION include/dlib
               FILES_MATCHING PATTERN "*.h"
               REGEX "${CMAKE_CURRENT_BINARY_DIR}" EXCLUDE)

437
438
439
440
       configure_file(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
       # overwrite config.h with the configured one
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/config.h DESTINATION include/dlib)

441
442
443
       configure_file(${CMAKE_SOURCE_DIR}/../dlib/revision.h.in ${CMAKE_CURRENT_BINARY_DIR}/revision.h)
       install(FILES ${CMAKE_CURRENT_BINARY_DIR}/revision.h DESTINATION include/dlib)

444
       install(FILES "LICENSE.txt" DESTINATION share/doc/dlib)
445

446
447
   endif()

448

449
450
451
   #test for some things that really should be true about the compiler
   include(TestForSTDNamespace)
   include(TestForANSIStreamHeaders)
452
453


454
   if (DLIB_PNG_SUPPORT AND NOT DLIB_ISO_CPP_ONLY)
455
456
457
458
      add_global_define(DLIB_PNG_SUPPORT)
   else()
      remove_global_define(DLIB_PNG_SUPPORT)
   endif()
459

460
   if (DLIB_JPEG_SUPPORT AND NOT DLIB_ISO_CPP_ONLY)
461
462
463
464
      add_global_define(DLIB_JPEG_SUPPORT)
   else()
      remove_global_define(DLIB_JPEG_SUPPORT)
   endif()
465

466
   if (DLIB_USE_FFTW AND NOT DLIB_ISO_CPP_ONLY)
467
468
469
470
471
      add_global_define(DLIB_USE_FFTW)
   else()
      remove_global_define(DLIB_USE_FFTW)
   endif()

472

473
474
475
476
477
   if (DLIB_USE_BLAS AND blas_found)
      add_global_define(DLIB_USE_BLAS)
   else()
      remove_global_define(DLIB_USE_BLAS)
   endif()
478

479
480
481
482
483
   if (DLIB_USE_LAPACK AND lapack_found)
      add_global_define(DLIB_USE_LAPACK)
   else()
      remove_global_define(DLIB_USE_LAPACK)
   endif()
484

485

486
487
488
489
490
   if (DLIB_ISO_CPP_ONLY)
      add_global_define(DLIB_ISO_CPP_ONLY)
   else()
      remove_global_define(DLIB_ISO_CPP_ONLY)
   endif()
491
492


493
494
495
496
497
   if (DLIB_NO_GUI_SUPPORT)
      add_global_define(DLIB_NO_GUI_SUPPORT)
   else()
      remove_global_define(DLIB_NO_GUI_SUPPORT)
   endif()
498

499
500
501
502
503
   if (DLIB_ENABLE_STACK_TRACE)
      add_global_define(DLIB_ENABLE_STACK_TRACE)
   else()
      remove_global_define(DLIB_ENABLE_STACK_TRACE)
   endif()
504
505


506
507
508
509
510
   if (DLIB_ENABLE_ASSERTS)
      add_global_define(ENABLE_ASSERTS)
   else()
      remove_global_define(ENABLE_ASSERTS)
   endif()
511

512
513

endif()