#!/bin/bash # ============================================================================ # CcosProcGo - 构建脚本 # ============================================================================ # 用法: # ./build.sh [命令] # # 命令: # build - 编译项目 (默认) # proto - 生成 Protocol Buffers 代码 # clean - 清理构建产物 # run - 编译并运行 # help - 显示帮助信息 # ============================================================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 项目配置 PROJECT_NAME="CcosProcGo" BUILD_DIR="build" OUTPUT_BIN="${BUILD_DIR}/${PROJECT_NAME}" # C++ 库路径 (根据实际环境修改) LIB_PATH="${LIB_PATH:-/root/codebuild/Deliver/lib}" # 打印带颜色的信息 info() { echo -e "${BLUE}[INFO]${NC} $1" } success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" exit 1 } # 检查依赖 check_dependencies() { info "检查构建依赖..." local missing=() command -v go >/dev/null 2>&1 || missing+=("go") command -v protoc >/dev/null 2>&1 || missing+=("protoc") command -v buf >/dev/null 2>&1 || missing+=("buf") if [ ${#missing[@]} -ne 0 ]; then error "缺少依赖: ${missing[*]}\n请先安装这些工具" fi success "依赖检查通过" } # 生成 Protocol Buffers 代码 generate_proto() { info "生成 Protocol Buffers 代码..." # 确保构建目录存在 mkdir -p "${BUILD_DIR}/gen" # 使用 Buf 生成 Go 代码 if [ -f "buf.gen.yaml" ]; then buf build || warn "buf build 警告 (可忽略)" buf generate || error "buf generate 失败" success "Buf 代码生成完成" fi # 生成 C++ 代码 (可选) if command -v grpc_cpp_plugin >/dev/null 2>&1; then protoc --proto_path=proto \ --cpp_out="${BUILD_DIR}/gen" \ --plugin=protoc-gen-grpc="$(which grpc_cpp_plugin)" \ --grpc_out="${BUILD_DIR}/gen" \ proto/device/v3/device.proto 2>/dev/null || warn "C++ 代码生成跳过" fi success "Proto 代码生成完成" } # 编译项目 build_project() { info "编译 ${PROJECT_NAME}..." # 确保构建目录存在 mkdir -p "${BUILD_DIR}" # 设置 CGO 环境变量 export CGO_ENABLED=1 # 检查库路径是否存在 if [ -d "${LIB_PATH}" ]; then export CGO_LDFLAGS="\ -L${LIB_PATH} \ -llibCcosProc \ -lCDI \ -lLogicDevice \ -luuid \ -lstdc++ \ " info "使用库路径: ${LIB_PATH}" else warn "库路径不存在: ${LIB_PATH}, 使用默认链接设置" export CGO_LDFLAGS="-lstdc++" fi # 编译 go build \ -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" \ -o "${OUTPUT_BIN}" \ ./main.go success "编译完成: ${OUTPUT_BIN}" } # Debug 编译 build_debug() { info "Debug 编译 ${PROJECT_NAME}..." mkdir -p "${BUILD_DIR}" export CGO_ENABLED=1 if [ -d "${LIB_PATH}" ]; then export CGO_LDFLAGS="\ -O0 -g -fsanitize=address -fno-omit-frame-pointer \ -L${LIB_PATH} \ -lCcosProc \ -lCDI \ -lLogicDevice \ -luuid \ -lstdc++ \ " fi go build \ -gcflags="all=-N -l" \ -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" \ -o "${OUTPUT_BIN}_debug" \ ./main.go success "Debug 编译完成: ${OUTPUT_BIN}_debug" } # 清理构建产物 clean() { info "清理构建产物..." rm -rf "${BUILD_DIR}" rm -f "${PROJECT_NAME}" "${PROJECT_NAME}_debug" success "清理完成" } # 运行程序 run_project() { if [ ! -f "${OUTPUT_BIN}" ]; then build_project fi if [ -z "$1" ]; then error "请指定驱动配置文件\n用法: ./build.sh run " fi info "运行 ${PROJECT_NAME}..." # 设置运行时库路径 export LD_LIBRARY_PATH="${LIB_PATH}:${LD_LIBRARY_PATH}" "${OUTPUT_BIN}" "$@" } # 安装依赖 install_deps() { info "安装 Go 依赖..." go mod download go mod tidy success "依赖安装完成" } # 显示帮助 show_help() { cat << EOF ${PROJECT_NAME} 构建脚本 用法: ./build.sh [命令] [参数] 命令: build 编译项目 (Release 模式) debug 编译项目 (Debug 模式, 带 AddressSanitizer) proto 生成 Protocol Buffers 代码 clean 清理构建产物 run 编译并运行 (需指定驱动配置文件) deps 安装/更新 Go 依赖 check 检查构建依赖 help 显示此帮助信息 示例: ./build.sh build # 编译项目 ./build.sh proto # 生成 proto 代码 ./build.sh run driver_config.json # 编译并运行 ./build.sh clean # 清理 环境变量: LIB_PATH C++ 库路径 (默认: /root/codebuild/Deliver/lib) EOF } # 主函数 main() { local cmd="${1:-build}" shift || true case "$cmd" in build) check_dependencies build_project ;; debug) check_dependencies build_debug ;; proto) check_dependencies generate_proto ;; clean) clean ;; run) check_dependencies run_project "$@" ;; deps) install_deps ;; check) check_dependencies ;; help|--help|-h) show_help ;; *) error "未知命令: $cmd\n运行 './build.sh help' 查看帮助" ;; esac } main "$@"