    #
    # This is a CMake makefile.  You can find the cmake utility and
    # information about it at http://www.cmake.org
    #

    # setting this makes CMake allow normal looking if else statements
    SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)

    cmake_minimum_required(VERSION 2.4)

    # Suppress cmake warnings about changes in new versions.
    if(COMMAND cmake_policy)
       cmake_policy(SET CMP0003 NEW)
    endif()

    # 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.
    macro ( add_global_define def_name )
       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 ()
    endmacro()
    macro ( remove_global_define def_name )
       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 ()
    endmacro()

    # 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 ()

    # 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" )
       set (DLIB_LINK_WITH_LIBPNG_STR
       "Disable this if you don't want to link against libpng" )
       set (DLIB_LINK_WITH_LIBJPEG_STR
       "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" )
       set (DLIB_LINK_WITH_FFTW_STR
       "Disable this if you don't want to link against fftw" )

       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)
       option(DLIB_ENABLE_ASSERTS ${DLIB_ENABLE_ASSERTS_STR} OFF)
       option(DLIB_USE_BLAS ${DLIB_USE_BLAS_STR} ON)
       option(DLIB_USE_LAPACK ${DLIB_USE_LAPACK_STR} ON)
       option(DLIB_LINK_WITH_LIBPNG ${DLIB_LINK_WITH_LIBPNG_STR} ON)
       option(DLIB_LINK_WITH_LIBJPEG ${DLIB_LINK_WITH_LIBJPEG_STR} ON)
       option(DLIB_LINK_WITH_SQLITE3 ${DLIB_LINK_WITH_SQLITE3_STR} ON)
       option(DLIB_LINK_WITH_FFTW ${DLIB_LINK_WITH_FFTW_STR} ON)

       add_library(dlib STATIC all/source.cpp )

       if (NOT DLIB_ISO_CPP_ONLY)
          # we want to link to the right stuff depending on our platform.
          if (WIN32 AND NOT CYGWIN) ###############################################################################
             if (DLIB_NO_GUI_SUPPORT)
                set (dlib_needed_libraries ws2_32)
             else()
                set (dlib_needed_libraries ws2_32 comctl32 gdi32 imm32)
             endif()
          elseif(APPLE) ############################################################################
             find_library(pthreadlib pthread)
             set (dlib_needed_libraries ${pthreadlib})

             if (NOT DLIB_NO_GUI_SUPPORT)
                find_library(xlib X11)
                # make sure X11 is in the include path
                find_path(xlib_path Xlib.h
                   PATHS
                   /Developer/SDKs/MacOSX10.4u.sdk/usr/X11R6/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} )
                else()
                   message(" *****************************************************************************")
                   message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
                   message(" *** Make sure libx11-dev is installed if you want GUI support             ***")
                   message(" *****************************************************************************")
                   set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
                endif()
             endif()

             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()
                   message(" *****************************************************************************")
                   message(" *** DLIB GUI SUPPORT DISABLED BECAUSE X11 DEVELOPMENT LIBRARIES NOT FOUND ***")
                   message(" *** Make sure libx11-dev is installed if you want GUI support             ***")
                   message(" *****************************************************************************")
                   set(DLIB_NO_GUI_SUPPORT ON CACHE STRING ${DLIB_NO_GUI_SUPPORT_STR} FORCE )
                endif()
             endif()

             mark_as_advanced(nsllib pthreadlib socketlib)
          endif () ##################################################################################

          if (DLIB_LINK_WITH_LIBPNG)
             # try to find libpng
             set(ZLIB_FIND_QUIETLY ON)
             set(PNG_FIND_QUIETLY ON)
             include(FindPNG)
             if (PNG_FOUND)
                include_directories(${PNG_INCLUDE_DIR})
                set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARY})
             else()
                set(DLIB_LINK_WITH_LIBPNG OFF CACHE STRING ${DLIB_LINK_WITH_LIBPNG_STR} FORCE )
             endif()
          endif()

          if (DLIB_LINK_WITH_LIBJPEG)
             # try to find libjpeg
             include(FindJPEG)
             if (JPEG_FOUND)
                include_directories(${JPEG_INCLUDE_DIR})
                set (dlib_needed_libraries ${dlib_needed_libraries} ${JPEG_LIBRARY})
             else()
                set(DLIB_LINK_WITH_LIBJPEG OFF CACHE STRING ${DLIB_LINK_WITH_LIBJPEG_STR} FORCE )
             endif()
          endif()

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

             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()
             endif()

             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()
             endif()
          endif()

          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)
          endif()

          if (DLIB_LINK_WITH_FFTW)
             find_library(fftw fftw3)
             # make sure fftw3.h is in the include path
             find_path(fftw_path fftw3.h)
             if (fftw AND fftw_path)
                get_filename_component(fftw_path2 ${fftw_path} PATH CACHE)
                include_directories(${fftw_path2})
                set(dlib_needed_libraries ${dlib_needed_libraries} ${fftw} )
             else()
                set(DLIB_LINK_WITH_FFTW OFF CACHE STRING ${DLIB_LINK_WITH_SQLITE3_STR} FORCE )
             endif()
             mark_as_advanced(fftw fftw_path fftw_path2)
          endif()

          target_link_libraries(dlib ${dlib_needed_libraries} )

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

       #test for some things that really should be true about the compiler
       include(TestForSTDNamespace)
       include(TestForANSIStreamHeaders)

       if (DLIB_LINK_WITH_LIBPNG AND NOT DLIB_ISO_CPP_ONLY)
          add_global_define(DLIB_PNG_SUPPORT)
       else()
          remove_global_define(DLIB_PNG_SUPPORT)
       endif()

       if (DLIB_LINK_WITH_LIBJPEG AND NOT DLIB_ISO_CPP_ONLY)
          add_global_define(DLIB_JPEG_SUPPORT)
       else()
          remove_global_define(DLIB_JPEG_SUPPORT)
       endif()

       if (DLIB_USE_BLAS AND blas_found)
          add_global_define(DLIB_USE_BLAS)
       else()
          remove_global_define(DLIB_USE_BLAS)
       endif()

       if (DLIB_USE_LAPACK AND lapack_found)
          add_global_define(DLIB_USE_LAPACK)
       else()
          remove_global_define(DLIB_USE_LAPACK)
       endif()

       if (DLIB_ISO_CPP_ONLY)
          add_global_define(DLIB_ISO_CPP_ONLY)
       else()
          remove_global_define(DLIB_ISO_CPP_ONLY)
       endif()

       if (DLIB_NO_GUI_SUPPORT)
          add_global_define(DLIB_NO_GUI_SUPPORT)
       else()
          remove_global_define(DLIB_NO_GUI_SUPPORT)
       endif()

       if (DLIB_ENABLE_STACK_TRACE)
          add_global_define(DLIB_ENABLE_STACK_TRACE)
       else()
          remove_global_define(DLIB_ENABLE_STACK_TRACE)
       endif()

       if (DLIB_ENABLE_ASSERTS)
          add_global_define(ENABLE_ASSERTS)
       else()
          remove_global_define(ENABLE_ASSERTS)
       endif()

    endif()