function(setup_external_libs ARCH) set(REQUEST_FILE "${PROJECT_SOURCE_DIR}/request.txt") if(NOT EXISTS "${REQUEST_FILE}") message(WARNING "request.txt not found at: ${REQUEST_FILE}") return() endif() #message(STATUS "Setting up external libraries for architecture: ${ARCH}") # 读取request.txt file(STRINGS ${REQUEST_FILE} LINES) set(LIB_COUNT 0) set(INCLUDE_DIRS) set(LIBRARY_DIRS) set(PREFIX_PATHS) foreach(REL_PATH ${LINES}) # 跳过注释和空行 if(REL_PATH MATCHES "^[ \t]*#.*$" OR REL_PATH STREQUAL "") continue() endif() # 去除首尾空格 string(STRIP "${REL_PATH}" REL_PATH) # 构建完整路径 set(FULL_PATH "${PROJECT_SOURCE_DIR}/dependency/${ARCH}/${REL_PATH}") # 检查路径是否存在 if(NOT EXISTS "${FULL_PATH}") message(WARNING "Library path does not exist: ${FULL_PATH}") continue() endif() # 添加到 CMAKE_PREFIX_PATH (保留原功能) list(APPEND PREFIX_PATHS "${FULL_PATH}") # 从路径中提取库名(最后一个目录名) string(REGEX REPLACE ".*/([^/]+)/?$" "\\1" LIB_NAME "${REL_PATH}") # 检查和处理头文件目录 set(HAS_INCLUDE FALSE) set(HAS_LIB FALSE) # 查找 include 目录 if(EXISTS "${FULL_PATH}/include") # 有专门的 include 目录 list(APPEND INCLUDE_DIRS "${FULL_PATH}/include") set(HAS_INCLUDE TRUE) #message(STATUS " ${LIB_NAME}: Adding include directory: ${FULL_PATH}/include") else() # 没有专门的 include 目录,使用路径本身 list(APPEND INCLUDE_DIRS "${FULL_PATH}") #message(STATUS " ${LIB_NAME}: Using base directory for includes: ${FULL_PATH}") endif() # 查找 lib 目录 if(EXISTS "${FULL_PATH}/lib") # 有专门的 lib 目录 list(APPEND LIBRARY_DIRS "${FULL_PATH}/lib") set(HAS_LIB TRUE) #message(STATUS " ${LIB_NAME}: Adding library directory: ${FULL_PATH}/lib") else() # 没有专门的 lib 目录,检查是否有库文件在当前目录 file(GLOB LIB_FILES "${FULL_PATH}/*.so" "${FULL_PATH}/*.a" "${FULL_PATH}/*.dylib" "${FULL_PATH}/*.dll" "${FULL_PATH}/*.lib") if(LIB_FILES) # 当前目录中有库文件 list(APPEND LIBRARY_DIRS "${FULL_PATH}") set(HAS_LIB TRUE) #message(STATUS " ${LIB_NAME}: Using base directory for libraries: ${FULL_PATH}") else() message(WARNING " ${LIB_NAME}: No library files found in: ${FULL_PATH}") endif() endif() if(HAS_INCLUDE OR HAS_LIB) math(EXPR LIB_COUNT "${LIB_COUNT} + 1") endif() endforeach() # 设置 CMAKE_PREFIX_PATH (原功能) if(PREFIX_PATHS) # 将路径添加到 CMAKE_PREFIX_PATH list(APPEND CMAKE_PREFIX_PATH ${PREFIX_PATHS}) # 设置为全局变量,使其在 find_package 中可用 set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) #message(STATUS "Added to CMAKE_PREFIX_PATH:") #foreach(PATH ${PREFIX_PATHS}) # message(STATUS " ${PATH}") #endforeach() endif() # 设置头文件目录 if(INCLUDE_DIRS) # 去重 list(REMOVE_DUPLICATES INCLUDE_DIRS) # 添加到包含目录 include_directories(${INCLUDE_DIRS}) endif() # 设置库文件目录 if(LIBRARY_DIRS) # 去重 list(REMOVE_DUPLICATES LIBRARY_DIRS) # 添加到链接目录 link_directories(${LIBRARY_DIRS}) endif() if(LIB_COUNT GREATER 0) message(STATUS "Successfully setup ${LIB_COUNT} external libraries for ${ARCH}") else() message(WARNING "No external libraries were successfully setup") endif() endfunction()