cmake_minimum_required(VERSION 3.19)
project(soft_bus LANGUAGES CXX)

# 设置C++标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)
# 查找Qt6
find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets SerialPort Charts Sql)

# 检测编译平台
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
    set(PlatformDir "x86")
else()
    set(PlatformDir "x64")
endif()

# 设置ADS路径
SET(ADS_DIR "${PROJECT_SOURCE_DIR}/advanced_dock_system")

# 关键修改：添加ADS子目录
add_subdirectory(${ADS_DIR}/src)

# 添加Qt项目设置
qt_standard_project_setup()

# 添加可执行文件
qt_add_executable(soft_bus
    WIN32 MACOSX_BUNDLE
    main.cpp
    src/soft_bus_core/soft_bus_core.cpp
    src/soft_bus_core/soft_bus_core.h
    src/serial_manager/serial_manager.h
    src/serial_manager/serial_manager.cpp
    src/serial_manager/serial_data_buffer.h
    src/serial_manager/serial_data_buffer.cpp
    src/serial_manager/serial_storage_thread.h
    src/serial_manager/serial_storage_thread.cpp
    src/serial_manager/serial_parser_thread.h
    src/serial_manager/serial_parser_thread.cpp
    src/can_manager/can_manager.h
    src/can_manager/can_manager.cpp

    mainwindow.h
    mainwindow.cpp


    src/toolbar/toolbar.h src/toolbar/toolbar.cpp
    resource.qrc
    src/view_core/viewcore.h src/view_core/viewcore.cpp src/view_core/viewcore.ui
    src/view_serial/viewserial.h src/view_serial/viewserial.cpp src/view_serial/viewserial.ui
    src/view_serial/serial_settings_widget.h src/view_serial/serial_settings_widget.cpp src/view_serial/serial_settings_widget.ui
    src/view_can/viewcan.h src/view_can/viewcan.cpp src/view_can/viewcan.ui
    src/view_can/can_data_widget.h src/view_can/can_data_widget.cpp src/view_can/can_data_widget.ui
    src/device_config/device_tree_widget.h src/device_config/device_tree_widget.cpp src/device_config/device_tree_widget.ui
    src/libmodbus/modbus_config_widget.h src/libmodbus/modbus_config_widget.cpp src/libmodbus/modbus_config_widget.ui
    src/libmodbus/src/modbus.c src/libmodbus/src/modbus-data.c
    src/libmodbus/src/modbus-rtu.c src/libmodbus/src/modbus-tcp.c
    src/view_serial/serial_data_widget.h src/view_serial/serial_data_widget.cpp src/view_serial/serial_data_widget.ui
    src/message_viewer/raw_data_table_widget.h src/message_viewer/raw_data_table_widget.cpp src/message_viewer/raw_data_table_widget.ui
    src/message_viewer/bus_data_table_widget.h src/message_viewer/bus_data_table_widget.cpp src/message_viewer/bus_data_table_widget.ui
    src/message_viewer/message_viewer_widget.h src/message_viewer/message_viewer_widget.cpp
    src/my_dock_manager/mdockmanager.cpp src/my_dock_manager/mdockmanager.h
    src/database_manager/database_types.h
    src/database_manager/databaseconnectiondock.h src/database_manager/databaseconnectiondock.cpp
    src/database_manager/databasepage.h src/database_manager/databasepage.cpp
    src/database_manager/databasemodule.h src/database_manager/databasemodule.cpp
    src/database_manager/databasesearchdialog.h src/database_manager/databasesearchdialog.cpp

)

# 关键修改：链接ADS库（使用目标名称）
if(Qt6_VERSION_MAJOR EQUAL 6)
    target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt6)
else()
    target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt5)
endif()

# 设置CAN API库路径
set(CAN_API_DIR "${PROJECT_SOURCE_DIR}/libs/can_api")
# 转换为绝对路径以确保链接器能找到库
get_filename_component(CAN_API_LIB "${CAN_API_DIR}/lib/lib_emuc2_64.a" ABSOLUTE)

# 验证库文件是否存在
if(NOT EXISTS "${CAN_API_LIB}")
    message(FATAL_ERROR "CAN API library not found: ${CAN_API_LIB}")
endif()

# 创建导入的静态库目标
add_library(emuc2_static STATIC IMPORTED)
set_target_properties(emuc2_static PROPERTIES
    IMPORTED_LOCATION "${CAN_API_LIB}"
)

# 链接其他库
# 注意：静态库的链接顺序很重要
# CAN API库将在Linux部分通过target_link_options使用--whole-archive方式链接
target_link_libraries(soft_bus
    PRIVATE
        Qt6::Core
        Qt6::Widgets
        Qt6::SerialPort
        Qt6::Charts
        Qt6::Sql
        pthread
)

if(WIN32)
    target_link_libraries(soft_bus
        PRIVATE
            shlwapi
            rpcrt4
            ws2_32      # Winsock 库
            advapi32    # 高级服务库
            user32      # 用户界面库
            gdi32       # 图形设备接口
            ole32       # OLE 库
            oleaut32    # OLE 自动化
            uuid        # UUID 支持
            "${CAN_API_LIB}"  # Windows下直接链接
    )

else()
    # 查找 zlib 库
    find_package(ZLIB REQUIRED)

    # 在链接库时加入 zlib 库
    if(ZLIB_FOUND)
        target_link_libraries(soft_bus PRIVATE ${ZLIB_LIBRARIES})
    endif()

    # 添加CAN API库目录到链接路径（Linux）
    target_link_directories(soft_bus PRIVATE "${CAN_API_DIR}/lib")
    
    # 链接CAN API静态库，使用 --whole-archive 确保所有符号都被链接
    # 直接在 target_link_libraries 中混合使用选项和库文件，CMake 会保持顺序
    target_link_libraries(soft_bus PRIVATE 
        "-Wl,--whole-archive"
        "${CAN_API_LIB}"
        "-Wl,--no-whole-archive"
    )

endif()
# 添加包含路径
target_include_directories(soft_bus PRIVATE 
    ${PROJECT_SOURCE_DIR}/src
    ${ADS_DIR}/src  # ADS头文件路径
    ${PROJECT_SOURCE_DIR}/src/libmodbus/src  # libmodbus库头文件路径
    ${CAN_API_DIR}/include  # CAN API头文件路径
)

# 安装配置
include(GNUInstallDirs)

install(TARGETS soft_bus
    BUNDLE  DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

qt_generate_deploy_app_script(
    TARGET soft_bus
    OUTPUT_SCRIPT deploy_script
    NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})
