add_library(hikvision_camera SHARED src/hikvision_camera.cpp) target_include_directories(hikvision_camera PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set(HIKVISION_SDK_ROOT "${CMAKE_SOURCE_DIR}/dependency/${ARCH}/third_party/hikvision_sdk/v6.1.11.5") set(HIKVISION_SDK_LIB_DIR "${HIKVISION_SDK_ROOT}/lib") set(HIKVISION_SDK_COM_DIR "${HIKVISION_SDK_LIB_DIR}/HCNetSDKCom") file(GLOB HIKVISION_SDK_LIBS CONFIGURE_DEPENDS "${HIKVISION_SDK_LIB_DIR}/*.so" "${HIKVISION_SDK_LIB_DIR}/*.so.*" ) file(GLOB HIKVISION_SDK_COM_LIBS CONFIGURE_DEPENDS "${HIKVISION_SDK_COM_DIR}/*.so" "${HIKVISION_SDK_COM_DIR}/*.so.*" ) set(HIKVISION_HCNETSDK_LIB "${HIKVISION_SDK_LIB_DIR}/libhcnetsdk.so") if(NOT HIKVISION_SDK_LIBS) message(FATAL_ERROR "Hikvision SDK libraries not found: ${HIKVISION_SDK_LIB_DIR}") endif() if(NOT HIKVISION_SDK_COM_LIBS) message(FATAL_ERROR "Hikvision SDK component libraries not found: ${HIKVISION_SDK_COM_DIR}") endif() if(NOT EXISTS "${HIKVISION_HCNETSDK_LIB}") message(FATAL_ERROR "Hikvision HCNetSDK library not found: ${HIKVISION_HCNETSDK_LIB}") endif() target_include_directories(hikvision_camera PRIVATE "${HIKVISION_SDK_ROOT}/include") target_link_directories(hikvision_camera PRIVATE "${HIKVISION_SDK_LIB_DIR}" "${HIKVISION_SDK_COM_DIR}") set(HIKVISION_JSONCPP_LINK jsoncpp) if(TARGET jsoncpp) get_target_property(HIKVISION_JSONCPP_IMPORTED_LOCATION jsoncpp IMPORTED_LOCATION) get_target_property(HIKVISION_JSONCPP_IMPORTED_LOCATION_RELEASE jsoncpp IMPORTED_LOCATION_RELEASE) get_target_property(HIKVISION_JSONCPP_INTERFACE_INCLUDES jsoncpp INTERFACE_INCLUDE_DIRECTORIES) message(STATUS "[hikvision_camera] jsoncpp target: jsoncpp") message(STATUS "[hikvision_camera] jsoncpp IMPORTED_LOCATION: ${HIKVISION_JSONCPP_IMPORTED_LOCATION}") message(STATUS "[hikvision_camera] jsoncpp IMPORTED_LOCATION_RELEASE: ${HIKVISION_JSONCPP_IMPORTED_LOCATION_RELEASE}") message(STATUS "[hikvision_camera] jsoncpp INTERFACE_INCLUDE_DIRECTORIES: ${HIKVISION_JSONCPP_INTERFACE_INCLUDES}") else() find_library(HIKVISION_JSONCPP_LIBRARY NAMES jsoncpp) if(HIKVISION_JSONCPP_LIBRARY) set(HIKVISION_JSONCPP_LINK "${HIKVISION_JSONCPP_LIBRARY}") message(STATUS "[hikvision_camera] jsoncpp library: ${HIKVISION_JSONCPP_LIBRARY}") else() message(WARNING "[hikvision_camera] jsoncpp library not found by CMake; linker will resolve -ljsoncpp") endif() endif() find_path(HIKVISION_JSONCPP_INCLUDE_DIR NAMES json/json.h PATH_SUFFIXES jsoncpp) message(STATUS "[hikvision_camera] jsoncpp include dir: ${HIKVISION_JSONCPP_INCLUDE_DIR}") if(HIKVISION_JSONCPP_INCLUDE_DIR) target_include_directories(hikvision_camera PRIVATE "${HIKVISION_JSONCPP_INCLUDE_DIR}") endif() target_link_libraries(hikvision_camera PUBLIC glog opencv_core cmvr_es::proto PRIVATE "${HIKVISION_HCNETSDK_LIB}" ${HIKVISION_JSONCPP_LINK} pthread ) set_target_properties(hikvision_camera PROPERTIES BUILD_RPATH "${HIKVISION_SDK_LIB_DIR};${HIKVISION_SDK_COM_DIR}" INSTALL_RPATH "$ORIGIN;$ORIGIN/HCNetSDKCom" ) add_library(cmvr_es::device::hikvision_camera ALIAS hikvision_camera) install(TARGETS hikvision_camera LIBRARY DESTINATION lib) install(FILES ${HIKVISION_SDK_LIBS} DESTINATION lib) install(DIRECTORY "${HIKVISION_SDK_COM_DIR}" DESTINATION lib) if(BUILD_TESTING) add_executable(hikvision_camera_callback_test tests/hikvision_camera_callback_test.cpp src/hikvision_camera.cpp ) target_include_directories(hikvision_camera_callback_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} "${HIKVISION_SDK_ROOT}/include" ) if(HIKVISION_JSONCPP_INCLUDE_DIR) target_include_directories( hikvision_camera_callback_test PRIVATE "${HIKVISION_JSONCPP_INCLUDE_DIR}" ) endif() target_compile_definitions(hikvision_camera_callback_test PRIVATE HIKVISION_SDK_LIB_DIR="${HIKVISION_SDK_LIB_DIR}/" ) # The test supplies a small in-process HCNetSDK fake, so it exercises the # callback/stop ordering without requiring a camera or loading hcnetsdk. target_link_libraries(hikvision_camera_callback_test PRIVATE glog opencv_core cmvr_es::proto ${HIKVISION_JSONCPP_LINK} pthread ) add_test( NAME hikvision_camera_callback_test COMMAND hikvision_camera_callback_test ) set_tests_properties(hikvision_camera_callback_test PROPERTIES TIMEOUT 10) if(UNIX AND NOT APPLE) get_property(_hikvision_test_library_dirs DIRECTORY PROPERTY LINK_DIRECTORIES) list(PREPEND _hikvision_test_library_dirs "${CMAKE_BINARY_DIR}/cmvr_compiler_runtime") list(JOIN _hikvision_test_library_dirs ":" _hikvision_test_library_path) set_tests_properties(hikvision_camera_callback_test PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${_hikvision_test_library_path}" ) endif() endif()