#!/bin/bash # ===================== 第三方库自动编译(Drogon) ===================== # 检查 Drogon + Trantor 编译产物,缺失时自动从 drogon_repo 源码编译。 # 仅在编译产物不存在时触发,日常开发零开销。 # # 参考: edge_collector/collector/ensure_third_party.sh # 用法: # source ensure_third_party.sh # 被 build.sh / run.sh 引用 # bash ensure_third_party.sh # 也可独立运行 set -euo pipefail # 如果变量已由调用方设置则复用,否则自行推导 SCRIPT_DIR="${SCRIPT_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)}" THIRD_PARTY="${THIRD_PARTY:-${SCRIPT_DIR}}" # ---- 架构检测 ---- if [ -z "${TARGET_ARCH:-}" ]; then ARCH=$(uname -m) case "${ARCH}" in x86_64) TARGET_ARCH="x64" ;; aarch64|arm64) TARGET_ARCH="arm64" ;; armv7*|arm) TARGET_ARCH="arm32" ;; *) TARGET_ARCH="x64" ;; esac fi export TARGET_ARCH export DROGON_INSTALL="${THIRD_PARTY}/drogon/install/${TARGET_ARCH}" # --- Drogon + Trantor (本地安装) --- # Drogon 使用 find_package(CONFIG) 模式,需要完整 cmake install 树。 # 编译后安装到 third_party/drogon/install/${TARGET_ARCH}/, # 由顶层 CMakeLists.txt 通过 CMAKE_PREFIX_PATH 注入查找路径。 DROGON_REPO="${THIRD_PARTY}/drogon_repo" DROGON_CONFIG="${DROGON_INSTALL}/libs/cmake/Drogon/DrogonConfig.cmake" EXPECTED_DROGON_VERSION="1.9.13" EXPECTED_TRANTOR_VERSION="1.5.28" framework_versions_match() { local drogon_header="${DROGON_INSTALL}/include/drogon/version.h" local drogon_cmake="${DROGON_INSTALL}/libs/cmake/Drogon/DrogonConfigVersion.cmake" local trantor_cmake="${DROGON_INSTALL}/libs/cmake/Trantor/TrantorConfigVersion.cmake" local drogon_link trantor_link [ -f "${drogon_header}" ] && [ -f "${drogon_cmake}" ] && [ -f "${trantor_cmake}" ] && grep -Fq "#define DROGON_VERSION \"${EXPECTED_DROGON_VERSION}\"" "${drogon_header}" && grep -Fq "set(PACKAGE_VERSION \"${EXPECTED_DROGON_VERSION}\")" "${drogon_cmake}" && grep -Fq "set(PACKAGE_VERSION \"${EXPECTED_TRANTOR_VERSION}\")" "${trantor_cmake}" || return 1 drogon_link="$(readlink "${DROGON_INSTALL}/libs/libdrogon.so.1" 2>/dev/null || true)" trantor_link="$(readlink "${DROGON_INSTALL}/libs/libtrantor.so.1" 2>/dev/null || true)" [ "${drogon_link}" = "libdrogon.so.${EXPECTED_DROGON_VERSION}" ] && [ "${trantor_link}" = "libtrantor.so.${EXPECTED_TRANTOR_VERSION}" ] } if ! grep -Fq "set(DROGON_PATCH_VERSION 13)" "${DROGON_REPO}/CMakeLists.txt" || ! grep -Fq "set(TRANTOR_PATCH_VERSION 28)" "${DROGON_REPO}/trantor/CMakeLists.txt"; then echo "[third_party] 错误:Drogon 源码不是 ${EXPECTED_DROGON_VERSION} / Trantor ${EXPECTED_TRANTOR_VERSION}" >&2 return 1 2>/dev/null || exit 1 fi if framework_versions_match; then echo "[third_party] Drogon ${EXPECTED_DROGON_VERSION} / Trantor ${EXPECTED_TRANTOR_VERSION} 已编译,跳过 (${DROGON_INSTALL})" else if [ ! -f "${DROGON_REPO}/CMakeLists.txt" ]; then echo "[third_party] ⚠️ 源码目录不存在: drogon_repo,跳过 Drogon" echo "[third_party] (后续 cmake find_package(Drogon) 将报错)" return 0 2>/dev/null || exit 0 elif [ ! -f "${DROGON_REPO}/trantor/CMakeLists.txt" ]; then echo "[third_party] ⚠️ Trantor 源码未就位: drogon_repo/trantor/,跳过 Drogon" echo "[third_party] (后续 cmake find_package(Drogon) 将报错)" return 0 2>/dev/null || exit 0 else if [ -e "${DROGON_INSTALL}" ]; then echo "[third_party] 框架产物版本不匹配,重建 ${DROGON_INSTALL}" rm -rf "${DROGON_INSTALL}" fi echo "[third_party] 编译 Drogon ${EXPECTED_DROGON_VERSION} + Trantor ${EXPECTED_TRANTOR_VERSION} → ${DROGON_INSTALL}" DROGON_BUILD="${DROGON_REPO}/build" rm -rf "${DROGON_BUILD}" mkdir -p "${DROGON_BUILD}" cmake -S "${DROGON_REPO}" -B "${DROGON_BUILD}" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="${DROGON_INSTALL}" \ -DCMAKE_INSTALL_LIBDIR=libs \ -DBUILD_SHARED_LIBS=ON \ -DUSE_SUBMODULE=ON \ -DBUILD_CTL=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_ORM=OFF \ -DBUILD_TESTING=OFF \ -DBUILD_BROTLI=ON \ -DBUILD_YAML_CONFIG=OFF cmake --build "${DROGON_BUILD}" -j"$(nproc)" cmake --install "${DROGON_BUILD}" rm -rf "${DROGON_BUILD}" if ! framework_versions_match; then echo "[third_party] 错误:框架安装版本校验失败" >&2 return 1 2>/dev/null || exit 1 fi echo "[third_party] ✅ Drogon ${EXPECTED_DROGON_VERSION} / Trantor ${EXPECTED_TRANTOR_VERSION} → ${DROGON_INSTALL}" fi fi echo "[third_party] 第三方库检查完成 ✅"