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

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" )

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)


add_library(dlib 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 () ##### end of if NOT DLIB_ISO_CPP_ONLY ##########################################################



   # try to find libpng 
   SET(ZLIB_FIND_QUIETLY ON)
   SET(PNG_FIND_QUIETLY ON)
   INCLUDE(FindPNG)
   if (PNG_FOUND)
      INCLUDE_DIRECTORIES(${PNG_PNG_INCLUDE_DIR})
      set (dlib_needed_libraries ${dlib_needed_libraries} ${PNG_LIBRARY})
      add_global_define(DLIB_PNG_SUPPORT)
   endif()


   TARGET_LINK_LIBRARIES(dlib ${dlib_needed_libraries} )

ENDIF ()


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


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