cmake_minimum_required(VERSION 3.14)
project(LHandProLib_EtherCAT_Test LANGUAGES CXX)

# λ SDK Ŀ¼
set(SDK_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../..)
message(STATUS "SDK Root Directory: ${SDK_ROOT_DIR}")

# ·ͳһ
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
# Ǹõ· Debug/Release Ŀ¼
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

# ͷļĿ¼
include_directories(${SDK_ROOT_DIR}/include/LHandProLib)

option(ETHERCAT_DEBUG "Enable EtherCAT print of test module LHandProLib_EtherCAT_Test" OFF)
add_compile_definitions(ETHERCAT_DEBUG=$<BOOL:${ETHERCAT_DEBUG}>)

# SOEM
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/SOEM)

# Գ
add_executable(LHandProLib_EtherCAT_Test main.cpp EthercatMaster.cpp)

# 
find_library(LHANDPRO_LIB NAMES LHandProLib PATHS ${SDK_ROOT_DIR}/lib REQUIRED)
target_link_libraries(LHandProLib_EtherCAT_Test PRIVATE
    ${LHANDPRO_LIB}
    soem
)

# ͷļ
target_include_directories(LHandProLib_EtherCAT_Test PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    $<INSTALL_INTERFACE:include>
)

#  Windows  Linux ƽ̨
if(WIN32)
    # Windows (x64)
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        # 64-bit (x64)
        message(STATUS "Building for 64-bit (x64)")
    
        # װӦ DLL   
        set(NPCAP_DLLS
            ${CMAKE_CURRENT_SOURCE_DIR}/x64/Packet.dll
            ${CMAKE_CURRENT_SOURCE_DIR}/x64/wpcap.dll
            ${SDK_ROOT_DIR}/bin/LHandProLib.dll
        )
        
        # ÿ DLL ļ
        foreach(dll_path ${NPCAP_DLLS})
            # ȡļ Packet.dll
            get_filename_component(dll_name "${dll_path}" NAME)

            # Ŀ·
            set(dst_path "${CMAKE_BINARY_DIR}/bin/${dll_name}")

            # ӸĿļͬƣ
            add_custom_command(
                TARGET LHandProLib_EtherCAT_Test POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy_if_different
                    "${dll_path}" "${dst_path}"
                COMMENT "Copying ${dll_name} to output directory"
                VERBATIM
            )
        endforeach()
        
        install(FILES 
            ${NPCAP_DLLS}
            DESTINATION bin
        )
    else()
        message(FATAL_ERROR "Other architecture: ${CMAKE_SIZEOF_VOID_P}")
    endif()
    
elseif(UNIX AND NOT APPLE)
    # Linux: ϵͳװ
endif()

# װԳ
install(TARGETS LHandProLib_EtherCAT_Test
    RUNTIME DESTINATION bin
)

if(UNIX AND NOT APPLE)
    # ·
    get_filename_component(LIB_SOURCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../../lib" ABSOLUTE)
    message(STATUS "Absolute lib path: ${LIB_SOURCE_PATH}")
    install(DIRECTORY 
        ${LIB_SOURCE_PATH}/
        DESTINATION bin
    )
endif()