| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #!/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 <driver_config.json>"
- 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 <cfg> 编译并运行 (需指定驱动配置文件)
- 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 "$@"
|