cmake_minimum_required(VERSION 3.24)

# use GNU23
set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)

set(APP_NAME "zdwm")
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")
set(BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}")

add_compile_definitions(LOG_FILE="$ENV{HOME}/${APP_NAME}-log.txt")

# generate compile_commands.json for clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# compile flags
add_compile_options(-g)
add_compile_options(-Wall)
# add_link_options(-fsanitize=address)

project(${APP_NAME}
    VERSION 0.0.1
    LANGUAGES C
)

option(BUILD_TESTING "Build tests" OFF)

add_executable(${APP_NAME}
    ${SOURCE_DIR}/wm.c
    ${SOURCE_DIR}/utils.c
    ${SOURCE_DIR}/buffer.c
    ${SOURCE_DIR}/backtrace.c
    ${SOURCE_DIR}/monitor.c
    ${SOURCE_DIR}/client.c
    ${SOURCE_DIR}/text.c
    ${SOURCE_DIR}/color.c
    ${SOURCE_DIR}/xcursor.c
    ${SOURCE_DIR}/xwindow.c
    ${SOURCE_DIR}/event.c
    ${SOURCE_DIR}/action.c
    ${SOURCE_DIR}/xkb.c
    ${SOURCE_DIR}/atoms.c
    ${SOURCE_DIR}/layout.c
    ${SOURCE_DIR}/xres.c
    ${SOURCE_DIR}/status.c
    ${SOURCE_DIR}/audio.c
    ${SOURCE_DIR}/rect.c
    ${SOURCE_DIR}/wallpaper.c
    ${SOURCE_DIR}/config.c
    ${SOURCE_DIR}/renderer.c
    ${SOURCE_DIR}/image.c
    ${SOURCE_DIR}/tray.c
)

find_package(PkgConfig REQUIRED)

pkg_check_modules(deps REQUIRED
    glib-2.0

    x11
    xcb
    xcb-aux
    xcb-cursor
    xcb-icccm
    xcb-keysyms
    xcb-randr
    xcb-xfixes
    xcb-xinerama
    xcb-xkb
    xcb-xrm
    xkbcommon-x11

    cairo
    cairo-xcb
    pango
    pangocairo
    imlib2

    libpulse-mainloop-glib
)

target_include_directories(${APP_NAME} SYSTEM
    PRIVATE ${deps_INCLUDE_DIRS}
)
target_include_directories(${APP_NAME}
    PRIVATE ${SOURCE_DIR}
    PRIVATE ${BUILD_DIR}
)

target_link_libraries(${APP_NAME}
    PRIVATE m
    PRIVATE ${deps_LIBRARIES}
)

## 配置项
# Check for backtrace_symbols()
include(CheckSymbolExists)
check_symbol_exists(backtrace_symbols execinfo.h HAS_EXECINFO)
if(NOT HAS_EXECINFO)
    find_library(LIB_EXECINFO execinfo)
    if(LIB_EXECINFO)
        set(HAS_EXECINFO TRUE)
        target_link_libraries(${APP_NAME} ${LIB_EXECINFO})
    endif()
endif()
if(HAS_EXECINFO)
    message(STATUS "checking for execinfo -- found")
else()
    message(STATUS "checking for execinfo -- not found")
endif()

configure_file("${SOURCE_DIR}/app.h.in"
    "${BUILD_DIR}/app.h"
    ESCAPE_QUOTES
    @ONLY
)

set(ATOM_LIST_FILE "${SOURCE_DIR}/atoms-list.txt")
add_custom_command(
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-utils/atoms-extern.sh
    ARGS ${ATOM_LIST_FILE} > ${BUILD_DIR}/atoms-extern.h
    OUTPUT ${BUILD_DIR}/atoms-extern.h
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    DEPENDS ${ATOM_LIST_FILE}
    COMMENT "Generating atoms-extern.h"
    VERBATIM
)
add_custom_command(
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/build-utils/atoms-intern.sh
    ARGS ${ATOM_LIST_FILE} > ${BUILD_DIR}/atoms-intern.h
    OUTPUT ${BUILD_DIR}/atoms-intern.h
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    DEPENDS ${ATOM_LIST_FILE}
    COMMENT "Generating atoms-intern.h"
    VERBATIM
)
add_custom_target(generate_atoms
    DEPENDS ${BUILD_DIR}/atoms-extern.h ${BUILD_DIR}/atoms-intern.h
)
add_dependencies(${APP_NAME} generate_atoms)

if(BUILD_TESTING)
    enable_testing()
    add_subdirectory(tests)
endif()
