cmake_minimum_required(VERSION 3.20)
project(jellyframe_mpv LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(GODOT_CPP_PATH "" CACHE PATH "Path to godot-cpp godot-4.5-stable")
set(MPV_ROOT "" CACHE PATH "Path to the libmpv development archive")
if(NOT GODOT_CPP_PATH)
    message(FATAL_ERROR "Set GODOT_CPP_PATH. See tools/build-pc-video.ps1 or tools/build-pc-video.sh.")
endif()
set(GODOTCPP_TARGET template_release CACHE STRING "" FORCE)
set(GODOTCPP_BUILD_PROFILE "${CMAKE_CURRENT_SOURCE_DIR}/build_profile.json" CACHE FILEPATH "" FORCE)
add_subdirectory("${GODOT_CPP_PATH}" godot-cpp)
if(MINGW)
    target_compile_options(godot-cpp PRIVATE -include cstdlib)
endif()
if(WIN32)
    if(NOT MPV_ROOT)
        message(FATAL_ERROR "Set MPV_ROOT to the Windows libmpv development archive.")
    endif()
    find_path(MPV_INCLUDE_DIR mpv/client.h PATHS "${MPV_ROOT}/include" REQUIRED NO_DEFAULT_PATH)
    find_library(MPV_LIBRARY NAMES mpv mpv.dll libmpv.dll PATHS "${MPV_ROOT}" "${MPV_ROOT}/lib" REQUIRED NO_DEFAULT_PATH)
    add_library(jellyframe_mpv_dependency UNKNOWN IMPORTED)
    set_target_properties(jellyframe_mpv_dependency PROPERTIES
        IMPORTED_LOCATION "${MPV_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${MPV_INCLUDE_DIR}")
    set(MPV_TARGET jellyframe_mpv_dependency)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(MPV REQUIRED IMPORTED_TARGET mpv>=2.0)
    set(MPV_TARGET PkgConfig::MPV)
else()
    message(FATAL_ERROR "The PC video plugin supports Windows and Linux.")
endif()
find_package(Threads REQUIRED)

add_library(jellyframe_mpv SHARED mpv_video.cpp render_worker.cpp render_gl.cpp render_gl_worker.cpp gl_functions.cpp register_types.cpp)
target_link_libraries(jellyframe_mpv PRIVATE godot-cpp ${MPV_TARGET} Threads::Threads)
if(WIN32)
    target_sources(jellyframe_mpv PRIVATE shared_gl_context_windows.cpp)
    target_link_libraries(jellyframe_mpv PRIVATE opengl32)
else()
    target_sources(jellyframe_mpv PRIVATE shared_gl_context_linux.cpp)
    target_link_libraries(jellyframe_mpv PRIVATE ${CMAKE_DL_LIBS})
endif()
if(MINGW)
    target_link_options(jellyframe_mpv PRIVATE -static -static-libgcc -static-libstdc++)
endif()
set_target_properties(jellyframe_mpv PROPERTIES PREFIX "" OUTPUT_NAME "jellyframe_mpv")
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    get_target_property(JELLYFRAME_ARCH godot-cpp GODOTCPP_ARCH)
    if(NOT JELLYFRAME_ARCH MATCHES "^(x86_64|arm64)$")
        message(FATAL_ERROR "Unsupported Linux architecture: ${JELLYFRAME_ARCH}")
    endif()
    set_target_properties(jellyframe_mpv PROPERTIES OUTPUT_NAME "jellyframe_mpv.linux.${JELLYFRAME_ARCH}")
endif()
