# This is a CMake file meant to be included via include()
# It will trigger a compilation of dlib *in the project* 
# including it

cmake_minimum_required(VERSION 2.8.12)

set(DLIB_IN_PROJECT_BUILD true)

if (POLICY CMP0054)
    cmake_policy(SET CMP0054 NEW)
endif()


# Determine the path to dlib.
set(dlib_path ${CMAKE_CURRENT_LIST_DIR})
include(${dlib_path}/cmake_utils/add_global_compiler_switch.cmake)
include(${dlib_path}/cmake_utils/use_cpp_11.cmake)

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_global_compiler_switch(-Wreturn-type)
endif()

if ("Clang" MATCHES ${CMAKE_CXX_COMPILER_ID})
    # Increase clang's default tempalte recurision depth so the dnn examples don't error out.
    add_definitions(-ftemplate-depth=500)
endif()


set(gcc_like_compilers GNU Clang  Intel)
set(intel_archs x86_64 i386 i686 AMD64 x86)


# Setup some options to allow a user to enable SSE and AVX instruction use.  
if ((";${gcc_like_compilers};" MATCHES ";${CMAKE_CXX_COMPILER_ID};")  AND
    (";${intel_archs};"        MATCHES ";${CMAKE_SYSTEM_PROCESSOR};") AND NOT USE_AUTO_VECTOR)
    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)
        message(STATUS "Enabling AVX instructions")
    elseif (USE_SSE4_INSTRUCTIONS)
        add_definitions(-msse4)
        message(STATUS "Enabling SSE4 instructions")
    elseif(USE_SSE2_INSTRUCTIONS)
        add_definitions(-msse2)
        message(STATUS "Enabling SSE2 instructions")
    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)
        message(STATUS "Enabling AVX instructions")
    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()
        message(STATUS "Enabling SSE4 instructions")
        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()
        message(STATUS "Enabling SSE2 instructions")
        add_definitions(-DDLIB_HAVE_SSE2)
    endif()

   # By default Visual Studio does not support .obj files with more than 65k sections
   # Code generated by file_to_code_ex and code using DNN module can have them
   # this flag enables > 65k sections, but produces .obj files that will not be readable by
   # VS 2005
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
endif()


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


# Don't add dlib if it's already been added to the cmake project
if (NOT TARGET dlib)
    add_subdirectory(${dlib_path} dlib_build)
endif()

