cmake_minimum_required(VERSION 3.10)
project (
  ark
  VERSION 0.1
  LANGUAGES C)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_BUILD_TYPE Debug)

if(NOT TARGET wlroots_build)
  set(WLROOTS_VERSION "0.18")
  set(WLROOTS_URL "https://gitlab.freedesktop.org/wlroots/wlroots/-/archive/${WLROOTS_VERSION}/wlroots-${WLROOTS_VERSION}.tar.gz")
  set(WLROOTS_SOURCE_DIR "${CMAKE_BINARY_DIR}/wlroots-src")
  set(WLROOTS_BUILD_DIR "${CMAKE_BINARY_DIR}/wlroots")
  set(WLROOTS_LIB_STATIC "${WLROOTS_BUILD_DIR}/libwlroots-${WLROOTS_VERSION}.a")
  set(WLROOTS_LIB_LINK "${WLROOTS_BUILD_DIR}/libwlroots.a")

  add_custom_command(
    OUTPUT "${WLROOTS_LIB_LINK}"
    COMMAND sh -c "if [ ! -d \"$1\" ]; then mkdir -p \"$1\" && curl -L \"$2\" | tar xzf - --strip-components=1 -C \"$1\"; fi" sh "${WLROOTS_SOURCE_DIR}" "${WLROOTS_URL}"
    COMMAND "${CMAKE_COMMAND}" -E make_directory "${WLROOTS_BUILD_DIR}"
    COMMAND meson setup --reconfigure -Ddefault_library=static "${WLROOTS_BUILD_DIR}" "${WLROOTS_SOURCE_DIR}"
    COMMAND meson compile -C "${WLROOTS_BUILD_DIR}"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "${WLROOTS_LIB_STATIC}" "${WLROOTS_LIB_LINK}"
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    COMMENT "Building wlroots via Meson (static)"
    VERBATIM
  )

  add_custom_target(wlroots_build ALL DEPENDS "${WLROOTS_LIB_LINK}")
endif()

include_directories(include/ /usr/include/pixman-1
  ${CMAKE_CURRENT_BINARY_DIR}/
  ${WLROOTS_SOURCE_DIR}/include
  ${WLROOTS_BUILD_DIR}/include
  ${WLROOTS_BUILD_DIR}/protocol
)

add_definitions(-DWLR_USE_UNSTABLE)

execute_process(
  COMMAND pkg-config --variable=pkgdatadir wayland-protocols
  OUTPUT_VARIABLE WAYLAND_PROTOCOLS
  RESULT_VARIABLE ec
  OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${ec} EQUAL 0)
else()
  message(FATAL_ERROR "Failed to execute pkg-config")
endif()

execute_process(
  COMMAND pkg-config --variable=wayland_scanner wayland-scanner
  OUTPUT_VARIABLE WAYLAND_SCANNER
  RESULT_VARIABLE ec
  OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${ec} EQUAL 0)
else()
  message(FATAL_ERROR "Failed to execute pkg-config")
endif()

add_custom_command(
  OUTPUT xdg-shell-protocol.h
  COMMAND ${WAYLAND_SCANNER} server-header
    ${WAYLAND_PROTOCOLS}/stable/xdg-shell/xdg-shell.xml
    xdg-shell-protocol.h
)

add_custom_command(
  OUTPUT xdg-shell-protocol.c
  COMMAND ${WAYLAND_SCANNER} private-code
    ${WAYLAND_PROTOCOLS}/stable/xdg-shell/xdg-shell.xml
    xdg-shell-protocol.c
  DEPENDS xdg-shell-protocol.h
)

file (GLOB_RECURSE SOURCES src/*.c)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(PkgConfig REQUIRED)

pkg_check_modules(WLREQ REQUIRED IMPORTED_TARGET
  wayland-server
  wayland-client
  wayland-egl
  wayland-cursor
  xkbcommon
  pixman-1
  libinput
  libudev
  libseat
  libdrm
  gbm
  egl
  glesv2
)

add_executable (ark ${SOURCES} ${WLROOTS_LIB_LINK}
  xdg-shell-protocol.c)

target_link_libraries(ark PRIVATE PkgConfig::WLREQ dl pthread ${WLROOTS_LIB_LINK})

pkg_check_modules(WLOPT IMPORTED_TARGET
  cairo
  lcms2
  libdisplay-info
  libliftoff
  vulkan
  xwayland
  xcb
  xcb-composite
  xcb-dri3
  xcb-errors
  xcb-ewmh
  xcb-icccm
  xcb-present
  xcb-render
  xcb-renderutil
  xcb-res
  xcb-shm
  xcb-xfixes
  xcb-xinput
)

if(WLOPT_FOUND)
  target_link_libraries(ark PRIVATE PkgConfig::WLOPT)
  target_compile_definitions(ark PRIVATE ARK_HAVE_CAIRO)
endif()

target_link_directories(ark PUBLIC
  "${WLROOTS_BUILD_DIR}")
target_link_options(ark PRIVATE -rdynamic)
