mat queue find solution, native supports clang
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user