mat queue find solution, native supports clang

This commit is contained in:
Youmu Liu
2026-03-27 18:14:54 +08:00
parent 06e3aa119b
commit 61303635ad
16 changed files with 373 additions and 647 deletions
+97 -24
View File
@@ -1,30 +1,103 @@
# Helper for external libs layout: external/<libname>/{head,lib}
# Provides function `use_external_lib(<name> <path>)` that sets include directories
# and attempts to link static/shared libs found under lib/.
function(sn_normalize_os_identifier INPUT_VALUE OUTPUT_NAME OUTPUT_DEFINE)
string(TOLOWER "${INPUT_VALUE}" _sn_os)
function(use_external_lib NAME PATH)
# Expect headers in ${PATH}/head and libs in ${PATH}/lib
set(HEAD_DIR "${PATH}/head")
set(LIB_DIR "${PATH}/lib")
if(EXISTS "${HEAD_DIR}")
message(STATUS "Registering external include: ${HEAD_DIR}")
include_directories(${HEAD_DIR})
else()
message(WARNING "External lib ${NAME} missing head/ directory at ${HEAD_DIR}")
if(_sn_os STREQUAL "auto")
string(TOLOWER "${CMAKE_SYSTEM_NAME}" _sn_system_name)
if(_sn_system_name STREQUAL "windows")
set(_sn_os "windows")
elseif(_sn_system_name STREQUAL "linux")
set(_sn_os "linux")
elseif(_sn_system_name STREQUAL "darwin" OR _sn_system_name STREQUAL "macos")
set(_sn_os "macos")
elseif(_sn_system_name STREQUAL "ios")
set(_sn_os "ios")
elseif(_sn_system_name STREQUAL "android")
set(_sn_os "android")
else()
set(_sn_os "unknown")
endif()
endif()
if(EXISTS "${LIB_DIR}")
# try to find static/shared libs inside LIB_DIR
file(GLOB LIB_FILES RELATIVE ${LIB_DIR} ${LIB_DIR}/*)
foreach(_lib ${LIB_FILES})
if(_lib MATCHES ".*\\.(a|lib|so|dylib)$")
message(STATUS "Found library for ${NAME}: ${LIB_DIR}/${_lib}")
# Consumer targets should link explicitly; provide variable for convenience
set(EXTERNAL_LIB_${NAME} "${LIB_DIR}/${_lib}" PARENT_SCOPE)
endif()
endforeach()
if(_sn_os STREQUAL "windows")
set(_sn_define SN_OS_WINDOWS)
elseif(_sn_os STREQUAL "linux")
set(_sn_define SN_OS_LINUX)
elseif(_sn_os STREQUAL "macos")
set(_sn_define SN_OS_MACOS)
elseif(_sn_os STREQUAL "ios")
set(_sn_define SN_OS_IOS)
elseif(_sn_os STREQUAL "android")
set(_sn_define SN_OS_ANDROID)
elseif(_sn_os STREQUAL "unknown")
set(_sn_define SN_OS_UNKNOWN)
else()
message(STATUS "No lib/ directory for external lib ${NAME} at ${LIB_DIR}")
message(FATAL_ERROR "Unsupported SN_TARGET_OS='${INPUT_VALUE}'.")
endif()
set(${OUTPUT_NAME} "${_sn_os}" PARENT_SCOPE)
set(${OUTPUT_DEFINE} "${_sn_define}" PARENT_SCOPE)
endfunction()
function(sn_normalize_arch_identifier INPUT_VALUE OUTPUT_NAME OUTPUT_DEFINE)
string(TOLOWER "${INPUT_VALUE}" _sn_arch)
if(_sn_arch STREQUAL "auto")
string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _sn_processor)
if(_sn_processor MATCHES "^(amd64|x86_64|x64)$")
set(_sn_arch "x86_64")
elseif(_sn_processor MATCHES "^(arm64|aarch64)$")
set(_sn_arch "arm64")
elseif(_sn_processor STREQUAL "riscv64")
set(_sn_arch "riscv64")
elseif(_sn_processor MATCHES "^(ppc64le|powerpc64le)$")
set(_sn_arch "ppc64le")
else()
message(FATAL_ERROR "Unable to infer ISA from CMAKE_SYSTEM_PROCESSOR='${CMAKE_SYSTEM_PROCESSOR}'. Set SN_TARGET_ARCH explicitly.")
endif()
endif()
if(_sn_arch STREQUAL "x86_64")
set(_sn_define SN_ARCH_X86_64)
elseif(_sn_arch STREQUAL "arm64")
set(_sn_define SN_ARCH_ARM64)
elseif(_sn_arch STREQUAL "riscv64")
set(_sn_define SN_ARCH_RISCV64)
elseif(_sn_arch STREQUAL "ppc64le")
set(_sn_define SN_ARCH_PPC64le)
else()
message(FATAL_ERROR "Unsupported SN_TARGET_ARCH='${INPUT_VALUE}'.")
endif()
set(${OUTPUT_NAME} "${_sn_arch}" PARENT_SCOPE)
set(${OUTPUT_DEFINE} "${_sn_define}" PARENT_SCOPE)
endfunction()
function(sn_resolve_target_identifiers INPUT_OS INPUT_ARCH OUTPUT_OS_NAME OUTPUT_OS_DEFINE OUTPUT_ARCH_NAME OUTPUT_ARCH_DEFINE)
sn_normalize_os_identifier("${INPUT_OS}" _sn_os_name _sn_os_define)
sn_normalize_arch_identifier("${INPUT_ARCH}" _sn_arch_name _sn_arch_define)
set(${OUTPUT_OS_NAME} "${_sn_os_name}" PARENT_SCOPE)
set(${OUTPUT_OS_DEFINE} "${_sn_os_define}" PARENT_SCOPE)
set(${OUTPUT_ARCH_NAME} "${_sn_arch_name}" PARENT_SCOPE)
set(${OUTPUT_ARCH_DEFINE} "${_sn_arch_define}" PARENT_SCOPE)
endfunction()
function(sn_register_external_package TARGET PACKAGE_NAME PACKAGE_DIR)
if(NOT TARGET ${TARGET})
message(FATAL_ERROR "sn_register_external_package: target '${TARGET}' does not exist.")
endif()
if(EXISTS "${PACKAGE_DIR}")
target_include_directories(${TARGET} PRIVATE "${PACKAGE_DIR}")
message(STATUS "Registered external package '${PACKAGE_NAME}' include: ${PACKAGE_DIR}")
else()
message(FATAL_ERROR "External package directory not found: ${PACKAGE_DIR}")
endif()
endfunction()
function(sn_link_external_binary_if_exists TARGET LIBRARY_PATH)
if(EXISTS "${LIBRARY_PATH}")
target_link_libraries(${TARGET} PRIVATE "${LIBRARY_PATH}")
message(STATUS "Linked external binary: ${LIBRARY_PATH}")
endif()
endfunction()