2026-03-28 16:54:11 +11:00
|
|
|
# ── Dependencies.cmake ───────────────────────────────────────────
|
|
|
|
|
# Central location for all external library paths.
|
|
|
|
|
# Adjust these paths per platform.
|
|
|
|
|
# ─────────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# ── Platform-specific base paths ────────────────────────────────
|
|
|
|
|
if(WIN32)
|
2026-03-29 14:10:05 +11:00
|
|
|
set(ANSLIBS_DIR "C:/ANSLibs" CACHE PATH "Root of ANS external libraries")
|
2026-03-28 16:54:11 +11:00
|
|
|
elseif(APPLE)
|
2026-03-29 14:10:05 +11:00
|
|
|
set(ANSLIBS_DIR "$ENV{HOME}/ANSLibs" CACHE PATH "Root of ANS external libraries")
|
2026-03-28 16:54:11 +11:00
|
|
|
else() # Linux
|
2026-03-29 14:10:05 +11:00
|
|
|
set(ANSLIBS_DIR "/opt/ANSLibs" CACHE PATH "Root of ANS external libraries")
|
2026-03-28 16:54:11 +11:00
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Platform library suffix helper ──────────────────────────────
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(LIB_SUFFIX ".lib")
|
|
|
|
|
set(SHARED_SUFFIX ".dll")
|
|
|
|
|
else()
|
|
|
|
|
set(LIB_SUFFIX "") # CMake handles -l prefix on Unix
|
|
|
|
|
set(SHARED_SUFFIX ".so")
|
|
|
|
|
if(APPLE)
|
|
|
|
|
set(SHARED_SUFFIX ".dylib")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── CUDA (optional) ────────────────────────────────────────────
|
|
|
|
|
if(ANSCORE_HAS_CUDA)
|
|
|
|
|
find_package(CUDAToolkit REQUIRED)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── OpenCV ──────────────────────────────────────────────────────
|
|
|
|
|
# On Windows: skip find_package(OpenCV) — its bundled OpenCVConfig.cmake
|
|
|
|
|
# calls legacy find_package(CUDA) which fails with modern CMake.
|
|
|
|
|
# On Linux/Mac: try system-installed OpenCV first.
|
|
|
|
|
if(NOT WIN32)
|
|
|
|
|
find_package(OpenCV QUIET)
|
|
|
|
|
endif()
|
|
|
|
|
if(OpenCV_FOUND)
|
|
|
|
|
add_library(opencv INTERFACE)
|
|
|
|
|
target_link_libraries(opencv INTERFACE ${OpenCV_LIBS})
|
|
|
|
|
target_include_directories(opencv INTERFACE ${OpenCV_INCLUDE_DIRS})
|
|
|
|
|
message(STATUS "OpenCV: using system install (${OpenCV_VERSION})")
|
|
|
|
|
else()
|
|
|
|
|
set(OPENCV_INCLUDE_DIR "${ANSLIBS_DIR}/opencv/include")
|
|
|
|
|
set(OPENCV_LIB_DIR "${ANSLIBS_DIR}/opencv/x64/vc17/lib")
|
|
|
|
|
add_library(opencv INTERFACE)
|
|
|
|
|
target_include_directories(opencv INTERFACE ${OPENCV_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(opencv INTERFACE ${OPENCV_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(opencv INTERFACE
|
|
|
|
|
optimized opencv_world4130.lib
|
|
|
|
|
optimized opencv_img_hash4130.lib
|
|
|
|
|
debug opencv_world4130d.lib
|
|
|
|
|
debug opencv_img_hash4130d.lib
|
|
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
# Linux/Mac: link individual modules or opencv_world
|
|
|
|
|
target_link_libraries(opencv INTERFACE
|
|
|
|
|
opencv_world
|
|
|
|
|
opencv_img_hash
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
message(STATUS "OpenCV: using ANSLibs at ${OPENCV_INCLUDE_DIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── ONNX Runtime ────────────────────────────────────────────────
|
|
|
|
|
set(ONNXRT_INCLUDE_DIR "${ANSLIBS_DIR}/onnxruntime/include")
|
|
|
|
|
set(ONNXRT_LIB_DIR "${ANSLIBS_DIR}/onnxruntime/lib")
|
|
|
|
|
|
|
|
|
|
add_library(onnxruntime INTERFACE)
|
|
|
|
|
target_include_directories(onnxruntime INTERFACE ${ONNXRT_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(onnxruntime INTERFACE ${ONNXRT_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(onnxruntime INTERFACE onnxruntime.lib)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(onnxruntime INTERFACE onnxruntime)
|
|
|
|
|
endif()
|
|
|
|
|
target_compile_definitions(onnxruntime INTERFACE ORT_API_MANUAL_INIT)
|
|
|
|
|
|
|
|
|
|
# ── TensorRT (Windows + Linux only) ────────────────────────────
|
|
|
|
|
if(NOT APPLE)
|
|
|
|
|
set(TENSORRT_INCLUDE_DIR "${ANSLIBS_DIR}/TensorRT/include")
|
|
|
|
|
set(TENSORRT_LIB_DIR "${ANSLIBS_DIR}/TensorRT/lib")
|
|
|
|
|
|
|
|
|
|
add_library(tensorrt INTERFACE)
|
|
|
|
|
target_include_directories(tensorrt INTERFACE ${TENSORRT_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(tensorrt INTERFACE ${TENSORRT_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(tensorrt INTERFACE nvinfer_plugin_10.lib)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(tensorrt INTERFACE nvinfer_plugin)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── OpenVINO (Windows + Linux, x86_64 only) ────────────────────
|
|
|
|
|
if(NOT APPLE)
|
|
|
|
|
set(OPENVINO_INCLUDE_DIR "${ANSLIBS_DIR}/OpenVINO/runtime/include")
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(OPENVINO_LIB_DIR "${ANSLIBS_DIR}/OpenVINO/runtime/lib/intel64/Release")
|
|
|
|
|
else()
|
|
|
|
|
set(OPENVINO_LIB_DIR "${ANSLIBS_DIR}/OpenVINO/runtime/lib/intel64")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
add_library(openvino INTERFACE)
|
|
|
|
|
target_include_directories(openvino INTERFACE ${OPENVINO_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(openvino INTERFACE ${OPENVINO_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(openvino INTERFACE openvino.lib)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(openvino INTERFACE openvino)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Python 3 + pybind11 ────────────────────────────────────────
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(PYTHON_INCLUDE_DIR "${ANSLIBS_DIR}/Python311/include")
|
|
|
|
|
set(PYTHON_LIB_DIR "${ANSLIBS_DIR}/Python311/libs")
|
|
|
|
|
set(PYBIND11_INCLUDE_DIR "${ANSLIBS_DIR}/pybind11/include")
|
|
|
|
|
|
|
|
|
|
add_library(python311 INTERFACE)
|
|
|
|
|
target_include_directories(python311 INTERFACE ${PYTHON_INCLUDE_DIR} ${PYBIND11_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(python311 INTERFACE ${PYTHON_LIB_DIR})
|
|
|
|
|
target_link_libraries(python311 INTERFACE python311.lib)
|
|
|
|
|
else()
|
|
|
|
|
# Use system Python on Linux/Mac
|
|
|
|
|
find_package(Python3 COMPONENTS Development)
|
|
|
|
|
add_library(python311 INTERFACE)
|
|
|
|
|
if(Python3_FOUND)
|
|
|
|
|
target_include_directories(python311 INTERFACE ${Python3_INCLUDE_DIRS})
|
|
|
|
|
target_link_libraries(python311 INTERFACE ${Python3_LIBRARIES})
|
|
|
|
|
endif()
|
|
|
|
|
# pybind11 via system install or ANSLibs
|
|
|
|
|
find_package(pybind11 QUIET)
|
|
|
|
|
if(pybind11_FOUND)
|
|
|
|
|
target_link_libraries(python311 INTERFACE pybind11::headers)
|
|
|
|
|
elseif(EXISTS "${ANSLIBS_DIR}/pybind11/include")
|
|
|
|
|
target_include_directories(python311 INTERFACE "${ANSLIBS_DIR}/pybind11/include")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Boost ───────────────────────────────────────────────────────
|
2026-03-29 14:10:05 +11:00
|
|
|
set(BOOST_INCLUDE_DIR "${ANSLIBS_DIR}/boost/include")
|
|
|
|
|
set(BOOST_LIB_DIR "${ANSLIBS_DIR}/boost/lib")
|
|
|
|
|
add_library(boost INTERFACE)
|
|
|
|
|
target_include_directories(boost INTERFACE ${BOOST_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(boost INTERFACE ${BOOST_LIB_DIR})
|
|
|
|
|
message(STATUS "Boost: using ANSLibs at ${BOOST_INCLUDE_DIR}")
|
2026-03-28 16:54:11 +11:00
|
|
|
|
|
|
|
|
# ── FFmpeg ──────────────────────────────────────────────────────
|
|
|
|
|
find_package(PkgConfig QUIET)
|
|
|
|
|
if(PKG_CONFIG_FOUND)
|
|
|
|
|
pkg_check_modules(FFMPEG QUIET libavcodec libavformat libavutil libswscale)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(FFMPEG_FOUND)
|
|
|
|
|
add_library(ffmpeg INTERFACE)
|
|
|
|
|
target_include_directories(ffmpeg INTERFACE ${FFMPEG_INCLUDE_DIRS})
|
|
|
|
|
target_link_directories(ffmpeg INTERFACE ${FFMPEG_LIBRARY_DIRS})
|
|
|
|
|
target_link_libraries(ffmpeg INTERFACE ${FFMPEG_LIBRARIES})
|
|
|
|
|
message(STATUS "FFmpeg: using system install")
|
|
|
|
|
else()
|
|
|
|
|
set(FFMPEG_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/MediaClient/ffmpeg/include")
|
|
|
|
|
set(FFMPEG_LIB_DIR "${CMAKE_SOURCE_DIR}/MediaClient/ffmpeg/lib/x64")
|
|
|
|
|
add_library(ffmpeg INTERFACE)
|
|
|
|
|
target_include_directories(ffmpeg INTERFACE ${FFMPEG_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(ffmpeg INTERFACE ${FFMPEG_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(ffmpeg INTERFACE
|
|
|
|
|
avcodec.lib avdevice.lib avfilter.lib avformat.lib
|
2026-04-15 23:00:19 +10:00
|
|
|
avutil.lib swresample.lib swscale.lib
|
2026-03-28 16:54:11 +11:00
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(ffmpeg INTERFACE
|
|
|
|
|
avcodec avdevice avfilter avformat
|
2026-04-15 23:00:19 +10:00
|
|
|
avutil swresample swscale
|
2026-03-28 16:54:11 +11:00
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
message(STATUS "FFmpeg: using ANSLibs at ${FFMPEG_INCLUDE_DIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── TurboJPEG ───────────────────────────────────────────────────
|
|
|
|
|
add_library(turbojpeg INTERFACE)
|
|
|
|
|
if(WIN32)
|
2026-03-29 14:10:05 +11:00
|
|
|
target_include_directories(turbojpeg INTERFACE "${ANSLIBS_DIR}/TurboJpeg")
|
|
|
|
|
target_link_directories(turbojpeg INTERFACE "${ANSLIBS_DIR}/TurboJpeg")
|
2026-03-28 16:54:11 +11:00
|
|
|
target_link_libraries(turbojpeg INTERFACE turbojpeg-static.lib)
|
|
|
|
|
else()
|
|
|
|
|
find_library(TURBOJPEG_LIB turbojpeg)
|
|
|
|
|
if(TURBOJPEG_LIB)
|
|
|
|
|
target_link_libraries(turbojpeg INTERFACE ${TURBOJPEG_LIB})
|
|
|
|
|
else()
|
|
|
|
|
target_link_directories(turbojpeg INTERFACE "${ANSLIBS_DIR}/turbojpeg/lib")
|
|
|
|
|
target_link_libraries(turbojpeg INTERFACE turbojpeg)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── FAISS (Facebook AI Similarity Search) ───────────────────────
|
|
|
|
|
set(FAISS_INCLUDE_DIR "${ANSLIBS_DIR}/faiss/include")
|
|
|
|
|
set(FAISS_LIB_DIR "${ANSLIBS_DIR}/faiss/lib")
|
|
|
|
|
|
|
|
|
|
add_library(faiss INTERFACE)
|
|
|
|
|
target_include_directories(faiss INTERFACE ${FAISS_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(faiss INTERFACE ${FAISS_LIB_DIR})
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_link_libraries(faiss INTERFACE faiss.lib)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(faiss INTERFACE faiss)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Intel MKL ───────────────────────────────────────────────────
|
|
|
|
|
add_library(mkl INTERFACE)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(MKL_LIB_DIR "C:/Program Files (x86)/Intel/oneAPI/mkl/2025.0/lib")
|
|
|
|
|
target_link_directories(mkl INTERFACE "${MKL_LIB_DIR}")
|
|
|
|
|
target_link_libraries(mkl INTERFACE mkl_rt.lib)
|
|
|
|
|
else()
|
|
|
|
|
# Try system MKL on Linux
|
|
|
|
|
find_library(MKL_RT_LIB mkl_rt PATHS /opt/intel/oneapi/mkl/latest/lib/intel64)
|
|
|
|
|
if(MKL_RT_LIB)
|
|
|
|
|
target_link_libraries(mkl INTERFACE ${MKL_RT_LIB})
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Chilkat (HTTP/AWS) ──────────────────────────────────────────
|
|
|
|
|
add_library(chilkat INTERFACE)
|
|
|
|
|
if(WIN32)
|
2026-03-29 14:10:05 +11:00
|
|
|
set(CHILKAT_INCLUDE_DIR "${ANSLIBS_DIR}/chilkat/include")
|
|
|
|
|
set(CHILKAT_LIB_DIR "${ANSLIBS_DIR}/chilkat/libs")
|
2026-03-28 16:54:11 +11:00
|
|
|
target_include_directories(chilkat INTERFACE ${CHILKAT_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(chilkat INTERFACE ${CHILKAT_LIB_DIR})
|
|
|
|
|
target_link_libraries(chilkat INTERFACE ChilkatRel_x64.lib)
|
|
|
|
|
else()
|
|
|
|
|
# Chilkat has Linux builds — set paths when available
|
|
|
|
|
if(EXISTS "${ANSLIBS_DIR}/chilkat/include")
|
|
|
|
|
target_include_directories(chilkat INTERFACE "${ANSLIBS_DIR}/chilkat/include")
|
|
|
|
|
target_link_directories(chilkat INTERFACE "${ANSLIBS_DIR}/chilkat/lib")
|
|
|
|
|
target_link_libraries(chilkat INTERFACE chilkat)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── ZXing (QR Code) ────────────────────────────────────────────
|
|
|
|
|
add_library(zxing INTERFACE)
|
|
|
|
|
if(WIN32)
|
2026-03-29 14:10:05 +11:00
|
|
|
set(ZXING_INCLUDE_DIR "${ANSLIBS_DIR}/QRCode")
|
|
|
|
|
set(ZXING_LIB_DIR "${ANSLIBS_DIR}/QRCode")
|
2026-03-28 16:54:11 +11:00
|
|
|
target_include_directories(zxing INTERFACE ${ZXING_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(zxing INTERFACE ${ZXING_LIB_DIR})
|
|
|
|
|
target_link_libraries(zxing INTERFACE ZXing.lib)
|
|
|
|
|
else()
|
|
|
|
|
find_package(ZXing QUIET)
|
|
|
|
|
if(ZXing_FOUND)
|
|
|
|
|
target_link_libraries(zxing INTERFACE ZXing::ZXing)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── LabVIEW (Windows only) ─────────────────────────────────────
|
|
|
|
|
add_library(labview INTERFACE)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
# Code uses #include "LabVIEWHeader/extcode.h", so include the parent dir
|
2026-03-29 14:10:05 +11:00
|
|
|
set(LABVIEW_INCLUDE_DIR "${ANSLIBS_DIR}")
|
|
|
|
|
set(LABVIEW_LIB_DIR "${ANSLIBS_DIR}/LabVIEWHeader")
|
2026-03-28 16:54:11 +11:00
|
|
|
target_include_directories(labview INTERFACE ${LABVIEW_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(labview INTERFACE ${LABVIEW_LIB_DIR})
|
|
|
|
|
target_link_libraries(labview INTERFACE labview-x86_64.lib)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── spdlog ──────────────────────────────────────────────────────
|
|
|
|
|
find_package(spdlog QUIET)
|
|
|
|
|
if(spdlog_FOUND)
|
|
|
|
|
add_library(spdlog_dep INTERFACE)
|
|
|
|
|
target_link_libraries(spdlog_dep INTERFACE spdlog::spdlog)
|
|
|
|
|
else()
|
|
|
|
|
add_library(spdlog_dep INTERFACE)
|
2026-03-29 14:10:05 +11:00
|
|
|
if(EXISTS "${ANSLIBS_DIR}/spdlog/include")
|
|
|
|
|
target_include_directories(spdlog_dep INTERFACE "${ANSLIBS_DIR}/spdlog/include")
|
|
|
|
|
elseif(FALSE) # placeholder
|
2026-03-28 16:54:11 +11:00
|
|
|
target_include_directories(spdlog_dep INTERFACE "${ANSLIBS_DIR}/spdlog/include")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── vcpkg installed libs ────────────────────────────────────────
|
|
|
|
|
if(WIN32)
|
2026-03-29 14:10:05 +11:00
|
|
|
set(VCPKG_INCLUDE_DIR "${ANSLIBS_DIR}/vcpkg/include")
|
|
|
|
|
set(VCPKG_LIB_DIR "${ANSLIBS_DIR}/vcpkg/lib")
|
2026-03-28 16:54:11 +11:00
|
|
|
add_library(vcpkg_libs INTERFACE)
|
|
|
|
|
target_include_directories(vcpkg_libs INTERFACE ${VCPKG_INCLUDE_DIR})
|
|
|
|
|
target_link_directories(vcpkg_libs INTERFACE ${VCPKG_LIB_DIR})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── zlib ────────────────────────────────────────────────────────
|
|
|
|
|
add_library(zlib_dep INTERFACE)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
target_include_directories(zlib_dep INTERFACE "${ANSLIBS_DIR}/ZLIB/include")
|
|
|
|
|
target_link_directories(zlib_dep INTERFACE "${ANSLIBS_DIR}/ZLIB/lib")
|
|
|
|
|
target_link_libraries(zlib_dep INTERFACE zlibstatic.lib)
|
|
|
|
|
else()
|
|
|
|
|
find_package(ZLIB REQUIRED)
|
|
|
|
|
target_link_libraries(zlib_dep INTERFACE ZLIB::ZLIB)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Common link libraries ──────────────────────────────────────
|
|
|
|
|
if(WIN32)
|
|
|
|
|
set(WIN_COMMON_LIBS ws2_32 winmm shlwapi iphlpapi crypt32)
|
|
|
|
|
else()
|
|
|
|
|
set(WIN_COMMON_LIBS "") # Empty on Unix — use pthreads/dl instead
|
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
|
set(UNIX_COMMON_LIBS Threads::Threads ${CMAKE_DL_LIBS})
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# ── Shared source directories ─────────────────────────────────
|
|
|
|
|
set(SHARED_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/include")
|