build.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #!/bin/bash
  2. # ============================================================================
  3. # CcosProcGo - 构建脚本
  4. # ============================================================================
  5. # 用法:
  6. # ./build.sh [命令]
  7. #
  8. # 命令:
  9. # build - 编译项目 (默认)
  10. # proto - 生成 Protocol Buffers 代码
  11. # clean - 清理构建产物
  12. # run - 编译并运行
  13. # help - 显示帮助信息
  14. # ============================================================================
  15. set -e
  16. # 颜色定义
  17. RED='\033[0;31m'
  18. GREEN='\033[0;32m'
  19. YELLOW='\033[1;33m'
  20. BLUE='\033[0;34m'
  21. NC='\033[0m' # No Color
  22. # 项目配置
  23. PROJECT_NAME="CcosProcGo"
  24. BUILD_DIR="build"
  25. OUTPUT_BIN="${BUILD_DIR}/${PROJECT_NAME}"
  26. # C++ 库路径 (根据实际环境修改)
  27. LIB_PATH="${LIB_PATH:-/root/codebuild/Deliver/lib}"
  28. # 打印带颜色的信息
  29. info() {
  30. echo -e "${BLUE}[INFO]${NC} $1"
  31. }
  32. success() {
  33. echo -e "${GREEN}[SUCCESS]${NC} $1"
  34. }
  35. warn() {
  36. echo -e "${YELLOW}[WARN]${NC} $1"
  37. }
  38. error() {
  39. echo -e "${RED}[ERROR]${NC} $1"
  40. exit 1
  41. }
  42. # 检查依赖
  43. check_dependencies() {
  44. info "检查构建依赖..."
  45. local missing=()
  46. command -v go >/dev/null 2>&1 || missing+=("go")
  47. command -v protoc >/dev/null 2>&1 || missing+=("protoc")
  48. command -v buf >/dev/null 2>&1 || missing+=("buf")
  49. if [ ${#missing[@]} -ne 0 ]; then
  50. error "缺少依赖: ${missing[*]}\n请先安装这些工具"
  51. fi
  52. success "依赖检查通过"
  53. }
  54. # 生成 Protocol Buffers 代码
  55. generate_proto() {
  56. info "生成 Protocol Buffers 代码..."
  57. # 确保构建目录存在
  58. mkdir -p "${BUILD_DIR}/gen"
  59. # 使用 Buf 生成 Go 代码
  60. if [ -f "buf.gen.yaml" ]; then
  61. buf build || warn "buf build 警告 (可忽略)"
  62. buf generate || error "buf generate 失败"
  63. success "Buf 代码生成完成"
  64. fi
  65. # 生成 C++ 代码 (可选)
  66. if command -v grpc_cpp_plugin >/dev/null 2>&1; then
  67. protoc --proto_path=proto \
  68. --cpp_out="${BUILD_DIR}/gen" \
  69. --plugin=protoc-gen-grpc="$(which grpc_cpp_plugin)" \
  70. --grpc_out="${BUILD_DIR}/gen" \
  71. proto/device/v3/device.proto 2>/dev/null || warn "C++ 代码生成跳过"
  72. fi
  73. success "Proto 代码生成完成"
  74. }
  75. # 编译项目
  76. build_project() {
  77. info "编译 ${PROJECT_NAME}..."
  78. # 确保构建目录存在
  79. mkdir -p "${BUILD_DIR}"
  80. # 设置 CGO 环境变量
  81. export CGO_ENABLED=1
  82. # 检查库路径是否存在
  83. if [ -d "${LIB_PATH}" ]; then
  84. export CGO_LDFLAGS="\
  85. -L${LIB_PATH} \
  86. -llibCcosProc \
  87. -lCDI \
  88. -lLogicDevice \
  89. -luuid \
  90. -lstdc++ \
  91. "
  92. info "使用库路径: ${LIB_PATH}"
  93. else
  94. warn "库路径不存在: ${LIB_PATH}, 使用默认链接设置"
  95. export CGO_LDFLAGS="-lstdc++"
  96. fi
  97. # 编译
  98. go build \
  99. -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" \
  100. -o "${OUTPUT_BIN}" \
  101. ./main.go
  102. success "编译完成: ${OUTPUT_BIN}"
  103. }
  104. # Debug 编译
  105. build_debug() {
  106. info "Debug 编译 ${PROJECT_NAME}..."
  107. mkdir -p "${BUILD_DIR}"
  108. export CGO_ENABLED=1
  109. if [ -d "${LIB_PATH}" ]; then
  110. export CGO_LDFLAGS="\
  111. -O0 -g -fsanitize=address -fno-omit-frame-pointer \
  112. -L${LIB_PATH} \
  113. -lCcosProc \
  114. -lCDI \
  115. -lLogicDevice \
  116. -luuid \
  117. -lstdc++ \
  118. "
  119. fi
  120. go build \
  121. -gcflags="all=-N -l" \
  122. -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=warn" \
  123. -o "${OUTPUT_BIN}_debug" \
  124. ./main.go
  125. success "Debug 编译完成: ${OUTPUT_BIN}_debug"
  126. }
  127. # 清理构建产物
  128. clean() {
  129. info "清理构建产物..."
  130. rm -rf "${BUILD_DIR}"
  131. rm -f "${PROJECT_NAME}" "${PROJECT_NAME}_debug"
  132. success "清理完成"
  133. }
  134. # 运行程序
  135. run_project() {
  136. if [ ! -f "${OUTPUT_BIN}" ]; then
  137. build_project
  138. fi
  139. if [ -z "$1" ]; then
  140. error "请指定驱动配置文件\n用法: ./build.sh run <driver_config.json>"
  141. fi
  142. info "运行 ${PROJECT_NAME}..."
  143. # 设置运行时库路径
  144. export LD_LIBRARY_PATH="${LIB_PATH}:${LD_LIBRARY_PATH}"
  145. "${OUTPUT_BIN}" "$@"
  146. }
  147. # 安装依赖
  148. install_deps() {
  149. info "安装 Go 依赖..."
  150. go mod download
  151. go mod tidy
  152. success "依赖安装完成"
  153. }
  154. # 显示帮助
  155. show_help() {
  156. cat << EOF
  157. ${PROJECT_NAME} 构建脚本
  158. 用法:
  159. ./build.sh [命令] [参数]
  160. 命令:
  161. build 编译项目 (Release 模式)
  162. debug 编译项目 (Debug 模式, 带 AddressSanitizer)
  163. proto 生成 Protocol Buffers 代码
  164. clean 清理构建产物
  165. run <cfg> 编译并运行 (需指定驱动配置文件)
  166. deps 安装/更新 Go 依赖
  167. check 检查构建依赖
  168. help 显示此帮助信息
  169. 示例:
  170. ./build.sh build # 编译项目
  171. ./build.sh proto # 生成 proto 代码
  172. ./build.sh run driver_config.json # 编译并运行
  173. ./build.sh clean # 清理
  174. 环境变量:
  175. LIB_PATH C++ 库路径 (默认: /root/codebuild/Deliver/lib)
  176. EOF
  177. }
  178. # 主函数
  179. main() {
  180. local cmd="${1:-build}"
  181. shift || true
  182. case "$cmd" in
  183. build)
  184. check_dependencies
  185. build_project
  186. ;;
  187. debug)
  188. check_dependencies
  189. build_debug
  190. ;;
  191. proto)
  192. check_dependencies
  193. generate_proto
  194. ;;
  195. clean)
  196. clean
  197. ;;
  198. run)
  199. check_dependencies
  200. run_project "$@"
  201. ;;
  202. deps)
  203. install_deps
  204. ;;
  205. check)
  206. check_dependencies
  207. ;;
  208. help|--help|-h)
  209. show_help
  210. ;;
  211. *)
  212. error "未知命令: $cmd\n运行 './build.sh help' 查看帮助"
  213. ;;
  214. esac
  215. }
  216. main "$@"