123 lines
5.0 KiB
CMake
123 lines
5.0 KiB
CMake
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()
|