cmake_minimum_required(VERSION 3.4...3.31)

project(cairo C)

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)
    if(NOT EMSCRIPTEN)
        set(CAIRO_HAS_FC_FONT 1)
    endif()
    set(CAIRO_HAS_FT_FONT 1)
    if(NOT DEFINED $ENV{VERBOSE})
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-attributes -Wno-cpp")
    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-macro-redefined -Wno-absolute-value -Wno-tautological-constant-out-of-range-compare -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_BINARY_DIR}/src/cairo-features.h)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-features.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/config.h)

file(GLOB ${PROJECT_NAME}_SOURCES
        src/*.c
        boilerplate/*.c
)

if (WIN32)
    file(GLOB ${PROJECT_NAME}_SOURCES_WIN32
            src/win32/*.c
    )
endif()

list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-cogl.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-drm.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-glx.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-directfb.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-egl.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-script.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-skia.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-test-surfaces.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-vg.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-wgl.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-xcb.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-xlib.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-screen.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-visual.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-display.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-os2-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/check-has-hidden-symbols.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-glitz-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-directfb-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/check-link.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/test-fallback-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/test-meta-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_FCURRENT_SOURCE_DIR}/src/test-paginated-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-glx-context.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-script-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-tee-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-wgl-context.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-core.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-render.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection-shm.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-connection.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-screen.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-shm.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-cairo.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-core.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-surface-render.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xcb-resources.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-xcb-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-render-compositor.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-source.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-core-compositor.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-fallback-compositor.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xlib-surface-shm.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-gradient.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-utils.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-cogl-context.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-xml-surface.c)
list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-image-mask-compositor.c)

if (NOT WITH_CAIRO_EGL)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-egl-context.c)
endif()
if (NOT WITH_CAIRO_GL AND NOT WITH_CAIRO_GLESV2)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-composite.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-device.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-dispatch.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-glyphs.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-gradient.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-info.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-msaa-compositor.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-operand.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-shaders.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-source.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-spans-compositor.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-surface.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-traps-compositor.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-gl-surface-legacy.c)

endif()

if (NOT WITH_CAIRO_VG)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-vg-surface.c)
endif()

if(NOT WIN32)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-win32.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-surface.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-printing-surface.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-font-surface.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-win32-font.c)
endif()
if (NOT APPLE)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boilerplate/cairo-boilerplate-quartz.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-image-surface.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-font.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-quartz-surface.c)
endif()
if (NOT UNIX OR APPLE)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-ft-font.c)
endif()

if (APPLE)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-fixed.c)
    list(REMOVE_ITEM ${PROJECT_NAME}_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/cairo-freed-pool.c)
endif()

add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_SOURCES_WIN32})
target_include_directories(${PROJECT_NAME} SYSTEM
        PUBLIC src
        PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/src
        PRIVATE boilerplate
)
target_link_libraries(${PROJECT_NAME}
        PUBLIC pixman
        PUBLIC png)
target_compile_options(${PROJECT_NAME}
        PRIVATE -DHAVE_STDINT_H
        PRIVATE -DHAVE_UINT64_T)
if (NOT MSVC)
    target_compile_definitions(${PROJECT_NAME}
        PRIVATE -DHAVE_UNISTD_H)
else()
    target_compile_definitions(${PROJECT_NAME}
        PUBLIC -DCAIRO_WIN32_STATIC_BUILD)
endif()
if (EMSCRIPTEN)
    target_compile_definitions(${PROJECT_NAME}
        PRIVATE -DCAIRO_NO_MUTEX)
    target_compile_options(${PROJECT_NAME}
        PRIVATE -Wno-incompatible-pointer-types)
else()
    if (NOT MSVC)
        target_compile_definitions(${PROJECT_NAME}
            PRIVATE -DHAVE_UNISTD_H
            PRIVATE -DCAIRO_HAS_PTHREAD)
     else()
        target_compile_definitions(${PROJECT_NAME}
            PUBLIC -DCAIRO_WIN32_STATIC_BUILD)
    endif()
endif()
if(APPLE)
    target_link_libraries(${PROJECT_NAME} PUBLIC "-framework CoreFoundation -framework ApplicationServices")
endif()
if(WIN32)
    target_link_libraries(${PROJECT_NAME} PUBLIC msimg32 gdi32)
endif()

if (EMSCRIPTEN)
    target_link_libraries(${PROJECT_NAME} PUBLIC freetype)
else()
    if (UNIX AND NOT APPLE)
        target_link_libraries(${PROJECT_NAME} PUBLIC freetype fontconfig)
        target_include_directories(${PROJECT_NAME} PRIVATE /usr/include/freetype2)
    endif()
endif()

message(STATUS "Using local version of ${PROJECT_NAME}")
