
cmake_minimum_required(VERSION 2.6.4)


set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required
if (POLICY CMP0054)
    cmake_policy(SET CMP0054 NEW)
endif()

# Don't add dlib if it's already been added to the cmake project
if (NOT TARGET dlib)

    # Determine the path to dlib.
    string(REGEX REPLACE "cmake$" "" dlib_path ${CMAKE_CURRENT_LIST_FILE})

    if (CMAKE_COMPILER_IS_GNUCXX)
        # By default, g++ won't warn or error if you forget to return a value in a
        # function which requires you to do so.  This option makes it give a warning
        # for doing this. 
        add_definitions("-Wreturn-type")
    endif()

    # Setup some options to allow a user to enable SSE and AVX instruction use.  
    if (CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" 
                                 OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"
                                 OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
        option(USE_SSE2_INSTRUCTIONS "Compile your program with SSE2 instructions" OFF)
        option(USE_SSE4_INSTRUCTIONS "Compile your program with SSE4 instructions" OFF)
        option(USE_AVX_INSTRUCTIONS  "Compile your program with AVX instructions"  OFF)
        if(USE_AVX_INSTRUCTIONS)
            add_definitions(-mavx)
        elseif (USE_SSE4_INSTRUCTIONS)
            add_definitions(-msse4)
        elseif(USE_SSE2_INSTRUCTIONS)
            add_definitions(-msse2)
        endif()
    elseif (MSVC OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # else if using Visual Studio 
        # Use SSE2 by default when using Visual Studio.
        option(USE_SSE2_INSTRUCTIONS "Compile your program with SSE2 instructions" ON)
        # Visual Studio 2005 didn't support SSE4 
        if (NOT MSVC80)
            option(USE_SSE4_INSTRUCTIONS "Compile your program with SSE4 instructions" OFF)
        endif()
        # Visual Studio 2005 and 2008 didn't support AVX
        if (NOT MSVC80 AND NOT MSVC90)
            option(USE_AVX_INSTRUCTIONS  "Compile your program with AVX instructions"  OFF)
        endif() 
        include(CheckTypeSize)
        check_type_size( "void*" SIZE_OF_VOID_PTR)
        if(USE_AVX_INSTRUCTIONS)
            add_definitions(/arch:AVX)
        elseif (USE_SSE4_INSTRUCTIONS)
            # Visual studio doesn't have an /arch:SSE2 flag when building in 64 bit modes.
            # So only give it when we are doing a 32 bit build.
            if (SIZE_OF_VOID_PTR EQUAL 4)
                add_definitions(/arch:SSE2)  
            endif()
            add_definitions(-DDLIB_HAVE_SSE2)
            add_definitions(-DDLIB_HAVE_SSE3)
            add_definitions(-DDLIB_HAVE_SSE41)
        elseif(USE_SSE2_INSTRUCTIONS)
            # Visual studio doesn't have an /arch:SSE2 flag when building in 64 bit modes.
            # So only give it when we are doing a 32 bit build.
            if (SIZE_OF_VOID_PTR EQUAL 4)
                add_definitions(/arch:SSE2)
            endif()
            add_definitions(-DDLIB_HAVE_SSE2)
        endif()
    endif()


    # Add folder containing dlib to the include search path.
    INCLUDE_DIRECTORIES(${dlib_path}/..)

    # This is really optional, but nice.  It will make sure the build mode 
    # created by cmake is always release by default.
    include(${dlib_path}/release_build_by_default)

    add_subdirectory(${dlib_path} dlib_build)
endif()

