cmvr-es/cmake/FindExternalLib.cmake

117 lines
3.9 KiB
CMake
Raw Normal View History

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()