|
26 | 26 | - ✅ **版本号显示功能完成**:智能版本文件读取和欢迎横幅版本号显示 |
27 | 27 | - ✅ **系统信息增强完成**:glibc版本检测和系统摘要信息优化 |
28 | 28 | - ✅ **--package-version参数修复完成**:支持多个键值对,消除边界情况,提升用户体验 |
| 29 | +- ✅ **系统检测与报错机制优化完成**:cmake条件检查、版本验证和错误计数逻辑全面优化 |
29 | 30 |
|
30 | 31 | --- |
31 | 32 |
|
|
209 | 210 | | **--package-version参数** | 只支持单个键值对,静默忽略后续参数 | 支持多个键值对和两种写法:多个独立参数和单个参数多键值对 | 消除边界情况,提升用户体验,保持向后兼容 | |
210 | 211 | | **错误处理** | 分散的report_error调用 | 统一error_handler模块 | 一致性,可追踪 | |
211 | 212 | | **配置验证** | 内联检查逻辑 | 专用validator模块 | 全面性,可扩展 | |
| 213 | +| **系统检测** | 无条件cmake检查,错误计数不准确 | 条件检查+版本验证+错误组计数 | 智能检测,准确报错 | |
212 | 214 | | **版本管理** | 硬编码版本信息 | 集中版本管理 | 易更新,支持多版本 | |
213 | 215 |
|
214 | 216 | --- |
|
390 | 392 | - `validate_math_libraries()`: 数学库冲突检测 |
391 | 393 | - `validate_mpi_implementations()`: MPI实现冲突检测 |
392 | 394 | - `validate_compiler_consistency()`: 编译器一致性检查 |
| 395 | +- `validate_system_requirements()`: 系统需求验证 |
393 | 396 |
|
394 | 397 | **设计特点**: |
395 | 398 | - 分离验证逻辑与业务逻辑 |
396 | 399 | - 累积错误和警告,一次性报告 |
397 | 400 | - 可配置的验证级别和跳过选项 |
398 | 401 |
|
| 402 | +#### 系统检测与报错机制优化 - "好品味"的典型实现 |
| 403 | + |
| 404 | +**问题背景**:原始的系统检测逻辑存在多个设计缺陷,违背了"好品味"原则: |
| 405 | +1. **cmake检查逻辑缺陷**:无条件检查cmake存在,忽略了`--with-cmake=install`的情况 |
| 406 | +2. **版本验证不足**:只检查cmake是否存在,不验证版本是否满足ABACUS最低要求(≥3.16) |
| 407 | +3. **错误计数不准确**:将每行ERROR信息都单独计算,导致错误数量虚高,用户体验差 |
| 408 | + |
| 409 | +**"好品味"解决方案**: |
| 410 | + |
| 411 | +##### 1. cmake系统检查逻辑修复 |
| 412 | + |
| 413 | +**修复前的逻辑**(存在边界情况): |
| 414 | +```bash |
| 415 | +# 无条件检查cmake,忽略用户配置 |
| 416 | +if ! command -v cmake >/dev/null 2>&1; then |
| 417 | + add_validation_error "CMake is not installed or not in PATH" |
| 418 | +fi |
| 419 | +``` |
| 420 | + |
| 421 | +**修复后的逻辑**(消除边界情况): |
| 422 | +```bash |
| 423 | +# 根据用户配置进行条件检查 |
| 424 | +local cmake_config="${CONFIG_CACHE[with_cmake]}" |
| 425 | +case "$cmake_config" in |
| 426 | + "__INSTALL__") |
| 427 | + # 用户选择安装cmake,跳过系统检查 |
| 428 | + ;; |
| 429 | + "__SYSTEM__") |
| 430 | + # 用户选择使用系统cmake,检查存在性和版本 |
| 431 | + if ! command -v cmake >/dev/null 2>&1; then |
| 432 | + add_validation_error_group "cmake_missing" \ |
| 433 | + "System CMake not found but --with-cmake=system specified" \ |
| 434 | + "CMake is required for building ABACUS and its dependencies" \ |
| 435 | + "Solutions:" \ |
| 436 | + " 1. Install CMake (≥3.16): sudo apt install cmake" \ |
| 437 | + " 2. Use toolchain CMake: --with-cmake=install" |
| 438 | + else |
| 439 | + # 验证cmake版本 |
| 440 | + validate_cmake_version |
| 441 | + fi |
| 442 | + ;; |
| 443 | + "__DONTUSE__"|"no") |
| 444 | + add_validation_error_group "cmake_disabled" \ |
| 445 | + "CMake is disabled (--with-cmake=no) but is required for ABACUS" \ |
| 446 | + "CMake is mandatory for building ABACUS and most dependencies" \ |
| 447 | + "Solutions:" \ |
| 448 | + " 1. Use system CMake: --with-cmake=system" \ |
| 449 | + " 2. Install via toolchain: --with-cmake=install" |
| 450 | + ;; |
| 451 | +esac |
| 452 | +``` |
| 453 | + |
| 454 | +##### 2. cmake版本验证功能 |
| 455 | + |
| 456 | +新增`validate_cmake_version()`函数,实现智能版本比较: |
| 457 | + |
| 458 | +```bash |
| 459 | +validate_cmake_version() { |
| 460 | + local cmake_version |
| 461 | + cmake_version=$(cmake --version 2>/dev/null | head -n1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1) |
| 462 | + |
| 463 | + if [[ -z "$cmake_version" ]]; then |
| 464 | + add_validation_error_group "cmake_version_unknown" \ |
| 465 | + "Unable to determine CMake version" \ |
| 466 | + "CMake version detection failed" |
| 467 | + return 1 |
| 468 | + fi |
| 469 | + |
| 470 | + local required_version="3.16.0" |
| 471 | + if ! version_compare "$cmake_version" ">=" "$required_version"; then |
| 472 | + add_validation_error_group "cmake_version_too_old" \ |
| 473 | + "System CMake version $cmake_version is too old (minimum required: $required_version)" \ |
| 474 | + "ABACUS requires CMake ≥3.16 for modern C++ features and build system support" \ |
| 475 | + "Current version: $cmake_version" \ |
| 476 | + "Required version: ≥$required_version" \ |
| 477 | + "Solutions:" \ |
| 478 | + " 1. Upgrade system CMake to ≥3.16" \ |
| 479 | + " 2. Use toolchain CMake: --with-cmake=install" |
| 480 | + return 1 |
| 481 | + fi |
| 482 | + |
| 483 | + echo "INFO: System CMake version $cmake_version meets requirements (≥$required_version)" |
| 484 | + return 0 |
| 485 | +} |
| 486 | +``` |
| 487 | + |
| 488 | +##### 3. 错误计数逻辑优化 |
| 489 | + |
| 490 | +**核心问题**:原始逻辑将每行ERROR信息都单独计算,一个逻辑错误可能产生多行描述,导致错误计数虚高。 |
| 491 | + |
| 492 | +**"好品味"解决方案**:引入"错误组"概念,区分"错误组"和"错误行": |
| 493 | + |
| 494 | +```bash |
| 495 | +# 新增错误组数组 |
| 496 | +declare -a VALIDATION_ERROR_GROUPS=() |
| 497 | +declare -a VALIDATION_WARNING_GROUPS=() |
| 498 | + |
| 499 | +# 新增错误组函数 |
| 500 | +add_validation_error_group() { |
| 501 | + local group_id="$1" |
| 502 | + shift |
| 503 | + |
| 504 | + # 记录错误组ID(用于计数) |
| 505 | + VALIDATION_ERROR_GROUPS+=("$group_id") |
| 506 | + |
| 507 | + # 记录所有错误行(用于显示) |
| 508 | + for line in "$@"; do |
| 509 | + VALIDATION_ERRORS+=("ERROR: $line") |
| 510 | + done |
| 511 | +} |
| 512 | + |
| 513 | +add_validation_warning_group() { |
| 514 | + local group_id="$1" |
| 515 | + shift |
| 516 | + |
| 517 | + # 记录警告组ID(用于计数) |
| 518 | + VALIDATION_WARNING_GROUPS+=("$group_id") |
| 519 | + |
| 520 | + # 记录所有警告行(用于显示) |
| 521 | + for line in "$@"; do |
| 522 | + VALIDATION_WARNINGS+=("WARNING: $line") |
| 523 | + done |
| 524 | +} |
| 525 | +``` |
| 526 | + |
| 527 | +**错误报告逻辑更新**: |
| 528 | +```bash |
| 529 | +# 使用错误组数量进行计数 |
| 530 | +local error_count=${#VALIDATION_ERROR_GROUPS[@]} |
| 531 | +local warning_count=${#VALIDATION_WARNING_GROUPS[@]} |
| 532 | + |
| 533 | +if [[ $error_count -gt 0 ]]; then |
| 534 | + echo "Configuration validation failed with $error_count error(s) and $warning_count warning(s):" |
| 535 | + # 显示所有错误行(详细信息) |
| 536 | + for error in "${VALIDATION_ERRORS[@]}"; do |
| 537 | + echo " $error" |
| 538 | + done |
| 539 | +fi |
| 540 | +``` |
| 541 | + |
| 542 | +**"好品味"原则体现**: |
| 543 | + |
| 544 | +1. **消除边界情况**: |
| 545 | + - **修复前**:cmake检查与用户配置脱节,产生不一致的行为 |
| 546 | + - **修复后**:统一的条件检查逻辑,用户配置决定检查行为 |
| 547 | + |
| 548 | +2. **简洁性原则**: |
| 549 | + - 使用case语句清晰处理不同配置选项 |
| 550 | + - 错误组概念简化了错误计数逻辑 |
| 551 | + - 统一的错误报告格式 |
| 552 | + |
| 553 | +3. **实用主义**: |
| 554 | + - 提供具体的解决方案和用户指导 |
| 555 | + - 智能版本比较满足实际需求 |
| 556 | + - 准确的错误计数提升用户体验 |
| 557 | + |
| 558 | +4. **健壮性**: |
| 559 | + - 严格的版本验证和错误处理 |
| 560 | + - 清晰的错误消息和解决方案 |
| 561 | + - 防止配置不一致导致的构建失败 |
| 562 | + |
| 563 | +**功能增强效果**: |
| 564 | +- ✅ **智能cmake检查**:根据用户配置进行条件检查,避免不必要的错误 |
| 565 | +- ✅ **版本验证**:确保cmake版本满足ABACUS最低要求(≥3.16) |
| 566 | +- ✅ **准确错误计数**:区分逻辑错误和描述行,提供准确的错误数量 |
| 567 | +- ✅ **用户友好**:提供具体的解决方案和操作指导 |
| 568 | +- ✅ **配置一致性**:确保系统检查与用户配置保持一致 |
| 569 | + |
| 570 | +此优化为ABACUS toolchain提供了更加智能和用户友好的系统检测机制,确保在各种配置下都能提供准确的验证结果和有用的错误信息。 |
| 571 | + |
399 | 572 | ### 3. package_manager.sh - 包管理器 |
400 | 573 | **主要职责**: |
401 | 574 | - 管理包的依赖关系和安装顺序 |
|
0 commit comments