2026-01-14 14:04:07 +08:00
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
file(STRINGS ${REQUEST_FILE} LINES)
|
2026-01-16 15:06:12 +08:00
|
|
|
|
2026-01-14 14:04:07 +08:00
|
|
|
set(LIB_COUNT 0)
|
|
|
|
|
set(INCLUDE_DIRS)
|
|
|
|
|
set(LIBRARY_DIRS)
|
|
|
|
|
set(PREFIX_PATHS)
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# For install
|
|
|
|
|
set(INSTALL_SO_FILES)
|
2026-01-27 11:38:07 +08:00
|
|
|
set(INSTALL_BIN_FILES) # 安装proto 的 protoc 和 grpc_cpp_plugin
|
2026-01-16 15:06:12 +08:00
|
|
|
|
2026-01-14 14:04:07 +08:00
|
|
|
foreach(REL_PATH ${LINES})
|
2026-01-16 15:06:12 +08:00
|
|
|
# Skip comments / empty lines
|
2026-01-14 14:04:07 +08:00
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
list(APPEND PREFIX_PATHS "${FULL_PATH}")
|
|
|
|
|
|
|
|
|
|
string(REGEX REPLACE ".*/([^/]+)/?$" "\\1" LIB_NAME "${REL_PATH}")
|
|
|
|
|
|
|
|
|
|
set(HAS_INCLUDE FALSE)
|
|
|
|
|
set(HAS_LIB FALSE)
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- include dirs ----
|
2026-01-14 14:04:07 +08:00
|
|
|
if(EXISTS "${FULL_PATH}/include")
|
|
|
|
|
list(APPEND INCLUDE_DIRS "${FULL_PATH}/include")
|
|
|
|
|
set(HAS_INCLUDE TRUE)
|
|
|
|
|
else()
|
|
|
|
|
list(APPEND INCLUDE_DIRS "${FULL_PATH}")
|
2026-01-16 15:06:12 +08:00
|
|
|
set(HAS_INCLUDE TRUE)
|
2026-01-14 14:04:07 +08:00
|
|
|
endif()
|
|
|
|
|
|
2026-02-05 17:31:18 +08:00
|
|
|
# OpenCV4 headers live in include/opencv4/opencv2/...
|
|
|
|
|
if(EXISTS "${FULL_PATH}/include/opencv4/opencv2")
|
|
|
|
|
list(APPEND INCLUDE_DIRS "${FULL_PATH}/include/opencv4")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- library dirs ----
|
2026-01-14 14:04:07 +08:00
|
|
|
if(EXISTS "${FULL_PATH}/lib")
|
|
|
|
|
list(APPEND LIBRARY_DIRS "${FULL_PATH}/lib")
|
|
|
|
|
set(HAS_LIB TRUE)
|
2026-01-16 15:06:12 +08:00
|
|
|
|
|
|
|
|
# Collect shared libs for install: *.so and *.so.*
|
|
|
|
|
file(GLOB _SO_FILES
|
|
|
|
|
"${FULL_PATH}/lib/*.so"
|
|
|
|
|
"${FULL_PATH}/lib/*.so.*"
|
|
|
|
|
)
|
|
|
|
|
if(_SO_FILES)
|
|
|
|
|
list(APPEND INSTALL_SO_FILES ${_SO_FILES})
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-14 14:04:07 +08:00
|
|
|
else()
|
2026-01-16 15:06:12 +08:00
|
|
|
# No lib/ dir: check libs in base dir
|
|
|
|
|
file(GLOB _LIB_FILES
|
|
|
|
|
"${FULL_PATH}/*.so" "${FULL_PATH}/*.so.*"
|
|
|
|
|
"${FULL_PATH}/*.dylib"
|
|
|
|
|
"${FULL_PATH}/*.dll" "${FULL_PATH}/*.lib"
|
|
|
|
|
"${FULL_PATH}/*.a"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if(_LIB_FILES)
|
2026-01-14 14:04:07 +08:00
|
|
|
list(APPEND LIBRARY_DIRS "${FULL_PATH}")
|
|
|
|
|
set(HAS_LIB TRUE)
|
2026-01-16 15:06:12 +08:00
|
|
|
|
|
|
|
|
# Only install Linux shared libs from base dir
|
|
|
|
|
file(GLOB _SO_FILES2
|
|
|
|
|
"${FULL_PATH}/*.so"
|
|
|
|
|
"${FULL_PATH}/*.so.*"
|
|
|
|
|
)
|
|
|
|
|
if(_SO_FILES2)
|
|
|
|
|
list(APPEND INSTALL_SO_FILES ${_SO_FILES2})
|
|
|
|
|
endif()
|
2026-01-14 14:04:07 +08:00
|
|
|
else()
|
|
|
|
|
message(WARNING " ${LIB_NAME}: No library files found in: ${FULL_PATH}")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-27 11:38:07 +08:00
|
|
|
# ---- bin (protoc / grpc_cpp_plugin) ----
|
|
|
|
|
if(EXISTS "${FULL_PATH}/bin")
|
|
|
|
|
# 精确收集你需要的两个
|
|
|
|
|
if(EXISTS "${FULL_PATH}/bin/grpc_cpp_plugin")
|
|
|
|
|
list(APPEND INSTALL_BIN_FILES "${FULL_PATH}/bin/grpc_cpp_plugin")
|
|
|
|
|
endif()
|
|
|
|
|
if(EXISTS "${FULL_PATH}/bin/protoc")
|
|
|
|
|
list(APPEND INSTALL_BIN_FILES "${FULL_PATH}/bin/protoc")
|
|
|
|
|
endif()
|
|
|
|
|
if(EXISTS "${FULL_PATH}/bin/protoc-31.1.0")
|
|
|
|
|
list(APPEND INSTALL_BIN_FILES "${FULL_PATH}/bin/protoc-31.1.0")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-14 14:04:07 +08:00
|
|
|
if(HAS_INCLUDE OR HAS_LIB)
|
|
|
|
|
math(EXPR LIB_COUNT "${LIB_COUNT} + 1")
|
|
|
|
|
endif()
|
|
|
|
|
endforeach()
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- CMAKE_PREFIX_PATH ----
|
2026-01-14 14:04:07 +08:00
|
|
|
if(PREFIX_PATHS)
|
|
|
|
|
list(APPEND CMAKE_PREFIX_PATH ${PREFIX_PATHS})
|
|
|
|
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- include_directories ----
|
2026-01-14 14:04:07 +08:00
|
|
|
if(INCLUDE_DIRS)
|
|
|
|
|
list(REMOVE_DUPLICATES INCLUDE_DIRS)
|
|
|
|
|
include_directories(${INCLUDE_DIRS})
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- link_directories ----
|
2026-01-14 14:04:07 +08:00
|
|
|
if(LIBRARY_DIRS)
|
|
|
|
|
list(REMOVE_DUPLICATES LIBRARY_DIRS)
|
|
|
|
|
link_directories(${LIBRARY_DIRS})
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-16 15:06:12 +08:00
|
|
|
# ---- install third-party shared libs into <prefix>/lib ----
|
|
|
|
|
if(INSTALL_SO_FILES)
|
|
|
|
|
list(REMOVE_DUPLICATES INSTALL_SO_FILES)
|
|
|
|
|
|
|
|
|
|
list(LENGTH INSTALL_SO_FILES INSTALL_SO_FILES_LIST_LEN)
|
|
|
|
|
message(STATUS
|
|
|
|
|
"Will install ${INSTALL_SO_FILES_LIST_LEN} third-party shared libs into DESTINATION lib"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
install(FILES ${INSTALL_SO_FILES} DESTINATION lib)
|
|
|
|
|
|
|
|
|
|
# After installing, patch RPATH of installed shared libs to $ORIGIN
|
|
|
|
|
install(CODE [[
|
|
|
|
|
execute_process(COMMAND bash -lc
|
|
|
|
|
"set -e
|
|
|
|
|
echo '[install] patch rpath under: ${CMAKE_INSTALL_PREFIX}/lib'
|
|
|
|
|
if ! command -v patchelf >/dev/null 2>&1; then
|
|
|
|
|
echo '[install] patchelf not found, skip'
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
find '${CMAKE_INSTALL_PREFIX}/lib' -maxdepth 1 -type f -name '*.so*' \
|
|
|
|
|
-exec patchelf --set-rpath '$ORIGIN' {} +
|
|
|
|
|
echo '[install] done'"
|
|
|
|
|
)
|
|
|
|
|
]])
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-27 11:38:07 +08:00
|
|
|
|
|
|
|
|
# ---- install third-party tools into <prefix>/bin ----
|
|
|
|
|
if(INSTALL_BIN_FILES)
|
|
|
|
|
list(REMOVE_DUPLICATES INSTALL_BIN_FILES)
|
|
|
|
|
install(PROGRAMS ${INSTALL_BIN_FILES} DESTINATION bin)
|
|
|
|
|
|
|
|
|
|
# After installing, patch RPATH of installed tools to $ORIGIN/../lib
|
|
|
|
|
install(CODE [[
|
|
|
|
|
execute_process(COMMAND bash -lc
|
|
|
|
|
"set -e
|
|
|
|
|
if ! command -v patchelf >/dev/null 2>&1; then
|
|
|
|
|
echo '[install] patchelf not found, skip patch bin rpath'
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
echo '[install] patch rpath under: ${CMAKE_INSTALL_PREFIX}/bin'
|
|
|
|
|
for f in '${CMAKE_INSTALL_PREFIX}/bin/protoc' '${CMAKE_INSTALL_PREFIX}/bin/grpc_cpp_plugin'; do
|
|
|
|
|
if [ -f \"$f\" ]; then
|
|
|
|
|
patchelf --set-rpath '$ORIGIN/../lib' \"$f\"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
echo '[install] done (bin rpath)'"
|
|
|
|
|
)
|
|
|
|
|
]])
|
|
|
|
|
endif()
|
|
|
|
|
|
2026-01-14 14:04:07 +08:00
|
|
|
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()
|