cmake_minimum_required(VERSION 2.8)

project(Cairo C)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/../../common/cmake/)
if (USE_SYSTEM_CAIRO)
    find_package(CAIRO)
    if (NOT CAIRO_FOUND)
         MESSAGE(FATAL_ERROR "Cannot find system Cairo library")
     endif()
endif()
find_package(PIXMAN)
if (NOT CAIRO_FOUND)
    message(STATUS "Using local Cairo library")
    set(Cairo_headers_dir ${CMAKE_CURRENT_SOURCE_DIR}/src/)

    include_directories(${Cairo_headers_dir} ${Pixman_headers_dir})

    set(CAIRO_HAS_QUARTZ_FONT 0)
    set(CAIRO_HAS_QUARTZ_SURFACE 0)
    set(CAIRO_HAS_QUARTZ_IMAGE_SURFACE 0)
    set(CAIRO_HAS_WIN32_FONT 0)
    set(CAIRO_HAS_WIN32_SURFACE 0)
    set(CAIRO_HAS_FC_FONT 0)
    set(CAIRO_HAS_FT_FONT 0)
    set(CAIRO_HAS_GL_SURFACE 0)
    set(CAIRO_HAS_VG_SURFACE 0)
    set(CAIRO_HAS_GLX_FUNCTIONS 0)
    set(CAIRO_HAS_EGL_FUNCTIONS 0)
    set(CAIRO_HAS_GLESV2_SURFACE  0)
    set(CAIRO_WIN32_STATIC_BUILD 0)

    if(UNIX OR APPLE OR MINGW)
        add_definitions(-DHAVE_STDINT_H -DCAIRO_HAS_PTHREAD -D_GNU_SOURCE -DHAVE_UINT64_T)
    endif()
    if (UNIX AND NOT APPLE)
        set(CAIRO_HAS_FC_FONT 1)
        set(CAIRO_HAS_FT_FONT 1)
        if(NOT DEFINED $ENV{VERBOSE})
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-attributes")
        endif()
    endif()
    if (APPLE)
        set(CAIRO_HAS_QUARTZ_FONT 1)
        set(CAIRO_HAS_QUARTZ_SURFACE 1)
        set(CAIRO_HAS_QUARTZ_IMAGE_SURFACE 1)
        if(NOT DEFINED $ENV{VERBOSE})
            set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-enum-conversion -Wno-tautological-constant-out-of-range-compare -Wno-deprecated-declarations -Wno-return-type -Wno-parentheses-equality")
        endif()
    endif()
    if(MSVC)
        add_definitions(-DDISABLE_SOME_FLOATING_POINT) # Fix lround missing problem
    endif()
    if (MSVC OR MINGW)
        set(CAIRO_HAS_WIN32_FONT 1)
        set(CAIRO_HAS_WIN32_SURFACE 1)
        set(CAIRO_WIN32_STATIC_BUILD 1)
        file (GLOB CAIRO_WIN32_SOURCES src/win32/*.c)
    endif()
    if(WITH_CAIRO_VG)
        set(CAIRO_HAS_VG_SURFACE 1)
    endif()
    if(WITH_CAIRO_GL)
        set(CAIRO_HAS_GL_SURFACE 1)
    endif()
    if(WITH_CAIRO_EGL)
        set(CAIRO_HAS_EGL_FUNCTIONS 1)
    endif()
    if(WITH_CAIRO_GLESV2)
        set(CAIRO_HAS_GLESV2_SURFACE 1)
    endif()

    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-features.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-features.h)

    file (GLOB CAIRO_SOURCES src/*.c)
    file (GLOB CAIRO_HEADERS src/*.h)

    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-screen.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-visual.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-display.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-os2-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/check-has-hidden-symbols.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-glitz-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-directfb-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/check-link.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/test-fallback-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/test-meta-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_FCURRENT_SOURCE_DIR}/src/test-paginated-surface.c)
    if (NOT WITH_CAIRO_EGL)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-egl-context.c)
    endif()
    if (NOT WITH_CAIRO_GL AND NOT WITH_CAIRO_GLESV2)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-composite.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-device.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-dispatch.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-glyphs.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-gradient.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-info.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-msaa-compositor.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-operand.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-shaders.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-source.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-spans-compositor.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-surface.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-traps-compositor.c)
    endif()
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-glx-context.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-script-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-tee-surface.c)
    if (NOT WITH_CAIRO_VG)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-vg-surface.c)
    endif()
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-wgl-context.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-core.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-render.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-shm.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-screen.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-shm.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-cairo.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-core.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-render.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-xcb-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-render-compositor.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-source.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-core-compositor.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-fallback-compositor.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-surface-shm.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-gradient.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-surface.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-utils.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-context.c)
    list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xml-surface.c)

    if((NOT MSVC) AND (NOT MINGW))
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-surface.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-printing-surface.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-font-surface.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-font.c)
    endif()
    if (NOT APPLE)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-image-surface.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-font.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-surface.c)
    endif(NOT APPLE)
    if (APPLE)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-fixed.c)
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-freed-pool.c)
    endif()
    if((UNIX) AND (NOT APPLE))
        find_package(Freetype REQUIRED)
        if(NOT FREETYPE_FOUND)
            message(FATAL_ERROR "No Freetype found")
        endif()
        add_definitions(-DCAIRO_HAS_FT_FONT)
        add_definitions(-DCAIRO_HAS_FC_FONT)
        include_directories(${FREETYPE_INCLUDE_DIRS})
    else()
        list(REMOVE_ITEM CAIRO_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-ft-font.c)
    endif()

    include_directories(${PNG_INCLUDE_DIR})
    include_directories(${ZLib_HEADERS_DIR})

    if(MSVC AND NOT DEFINED $ENV{VERBOSE})
        add_definitions(/wd4244 /wd4146 /wd4267)
    endif()

    # To remove GLIBC_2.11 dependency
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0")

    if (MSVC)
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4244 /wd4146 /wd4334 /wd4267 /wd4101")
    endif()

    add_library(cairo STATIC  ${CAIRO_SOURCES} ${CAIRO_WIN32_SOURCES})

    set_target_properties(cairo PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS}")
    if(UNIX AND NOT APPLE)
        target_link_libraries(cairo freetype fontconfig)
    endif()
    if(MSVC OR MINGW)
        target_link_libraries(cairo msimg32)
    endif()
    if (WITH_CAIRO_GL)
        target_link_libraries(cairo GL)
    endif()
    if (WITH_CAIRO_VG)
        target_link_libraries(cairo OpenVG)
    endif()
    if (WITH_CAIRO_EGL)
        target_link_libraries(cairo egl)
    endif()
    if (WITH_CAIRO_GLESV2)
        target_link_libraries(cairo glesv2)
    endif()
    set_property(TARGET cairo PROPERTY FOLDER "third_party")
    if (NOT NO_STATIC)
        pack_static(cairo)
    endif()
else()
    set(Cairo_headers_dir ${CAIRO_INCLUDE_DIRS})
endif()
