cmake_minimum_required(VERSION 3.5)

project(kyburnengine VERSION 1.0.0 LANGUAGES CXX)

# Set C++ standard
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()


# Enable Qt MOC
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

# Setup the environment
find_package(Qt5 COMPONENTS Core REQUIRED)

# Set output directories
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

add_subdirectory(src/xorriso)


# Add examples (optional)
option(BUILD_EXAMPLES "Build example applications" OFF)
if(BUILD_EXAMPLES)
    add_subdirectory(examples)
endif()

# Create combined shared library
set(COMBINED_LIB_NAME kyburnengine)

# Collect all source files
# CMAKE_CONFIGURE_DEPENDS ensures CMake re-globs when files are added/removed
file(GLOB_RECURSE KY_BURN_ENGINE_SRCS
    CONFIGURE_DEPENDS
    "${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/*.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/*.h"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/engine/include/*.h"
)

# Audit log module (src/engine/src/common/auditlog.cpp + src/engine/include/auditlog.h)
# are picked up by the glob above; listed here for documentation clarity.
set(KY_AUDIT_LOG_SRCS
    "${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/common/auditlog.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/engine/include/auditlog.h"
)

file(GLOB_RECURSE KY_DISC_INFO_SRCS
    CONFIGURE_DEPENDS
    "${CMAKE_CURRENT_SOURCE_DIR}/src/disc/src/*"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/disc/include/*"
)

file(GLOB_RECURSE KY_UDF_IMAGE_SRCS
    CONFIGURE_DEPENDS
    "${CMAKE_CURRENT_SOURCE_DIR}/src/udf/src/*"
    "${CMAKE_CURRENT_SOURCE_DIR}/src/udf/include/*"
)

file(GLOB_RECURSE XORRISO_SRCS
    "${CMAKE_CURRENT_SOURCE_DIR}/src/xorriso/*"
)

source_group("engine/common" FILES
    ${KY_AUDIT_LOG_SRCS}
)

source_group("engine" FILES
    ${KY_BURN_ENGINE_SRCS}
)

source_group("udf" FILES
    ${KY_UDF_IMAGE_SRCS}
)

source_group("disc" FILES
    ${KY_DISC_INFO_SRCS}
)

# Create shared library
add_library(${COMBINED_LIB_NAME} SHARED
    ${KY_BURN_ENGINE_SRCS}
    ${KY_DISC_INFO_SRCS}
    ${KY_UDF_IMAGE_SRCS}
)

# Link libraries
target_link_libraries(${COMBINED_LIB_NAME}
    PUBLIC Qt5::Core
    PRIVATE xorriso
)

# Include directories
target_include_directories(${COMBINED_LIB_NAME}
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/engine/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/disc/include>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/udf/include>
        $<INSTALL_INTERFACE:include/kyburnengine/engine>
        $<INSTALL_INTERFACE:include/kyburnengine/disc>
        $<INSTALL_INTERFACE:include/kyburnengine/udf>
    PRIVATE
        # Internal engine source directories (for headers local to each sub-module)
        ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/engine
        ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/common
        ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/src/utils
)


# Install targets
install(TARGETS ${COMBINED_LIB_NAME}
    EXPORT ${COMBINED_LIB_NAME}Targets
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    RUNTIME DESTINATION bin
    PUBLIC_HEADER DESTINATION include/${COMBINED_LIB_NAME}
)

# Install headers
# auditlog.h is installed here alongside all other public engine headers
install(DIRECTORY src/engine/include/
    DESTINATION include/${COMBINED_LIB_NAME}/engine
    FILES_MATCHING PATTERN "*.h"
)

install(DIRECTORY src/disc/include/
    DESTINATION include/${COMBINED_LIB_NAME}/disc
    FILES_MATCHING PATTERN "*.h"
)

install(DIRECTORY src/udf/include/
    DESTINATION include/${COMBINED_LIB_NAME}/udf
    FILES_MATCHING PATTERN "*.h"
)

# Create and install CMake config files
# 用于 find_package 查找时的版本兼容性判断
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}ConfigVersion.cmake"
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY AnyNewerVersion
)

include(CMakePackageConfigHelpers)
configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${COMBINED_LIB_NAME}Config.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}Config.cmake"
     INSTALL_DESTINATION lib/cmake/${COMBINED_LIB_NAME}
)


# 安装CMake配置文件和导出目标文件，方便其他项目通过CMake查找和链接本库。
install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}Config.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}ConfigVersion.cmake"
    DESTINATION lib/cmake/${COMBINED_LIB_NAME}
)

install(EXPORT ${COMBINED_LIB_NAME}Targets
    FILE ${COMBINED_LIB_NAME}Targets.cmake
    NAMESPACE ${COMBINED_LIB_NAME}::
    DESTINATION lib/cmake/${COMBINED_LIB_NAME}
)

# Create pkg-config file
configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${COMBINED_LIB_NAME}.pc.in"
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}.pc"
    @ONLY
)

install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/${COMBINED_LIB_NAME}.pc"
    DESTINATION lib/pkgconfig
)

