Skip to content

Commit a38b5e7

Browse files
committed
feat(validator): 优化系统检测与错误计数机制
- 新增错误组概念,区分逻辑错误与描述行,提供准确错误计数 - 实现智能cmake检查,根据用户配置进行条件验证和版本检测 - 增强GCC工具链验证,包括版本一致性检查和最小版本要求 - 提供更详细的错误信息和解决方案指导
1 parent 7b72bbd commit a38b5e7

File tree

2 files changed

+360
-50
lines changed

2 files changed

+360
-50
lines changed

toolchain/.trae/documents/ABACUS_Toolchain_Refactoring_Progress_Report.md

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
-**版本号显示功能完成**:智能版本文件读取和欢迎横幅版本号显示
2727
-**系统信息增强完成**:glibc版本检测和系统摘要信息优化
2828
-**--package-version参数修复完成**:支持多个键值对,消除边界情况,提升用户体验
29+
-**系统检测与报错机制优化完成**:cmake条件检查、版本验证和错误计数逻辑全面优化
2930

3031
---
3132

@@ -209,6 +210,7 @@
209210
| **--package-version参数** | 只支持单个键值对,静默忽略后续参数 | 支持多个键值对和两种写法:多个独立参数和单个参数多键值对 | 消除边界情况,提升用户体验,保持向后兼容 |
210211
| **错误处理** | 分散的report_error调用 | 统一error_handler模块 | 一致性,可追踪 |
211212
| **配置验证** | 内联检查逻辑 | 专用validator模块 | 全面性,可扩展 |
213+
| **系统检测** | 无条件cmake检查,错误计数不准确 | 条件检查+版本验证+错误组计数 | 智能检测,准确报错 |
212214
| **版本管理** | 硬编码版本信息 | 集中版本管理 | 易更新,支持多版本 |
213215

214216
---
@@ -390,12 +392,183 @@
390392
- `validate_math_libraries()`: 数学库冲突检测
391393
- `validate_mpi_implementations()`: MPI实现冲突检测
392394
- `validate_compiler_consistency()`: 编译器一致性检查
395+
- `validate_system_requirements()`: 系统需求验证
393396

394397
**设计特点**
395398
- 分离验证逻辑与业务逻辑
396399
- 累积错误和警告,一次性报告
397400
- 可配置的验证级别和跳过选项
398401

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+
399572
### 3. package_manager.sh - 包管理器
400573
**主要职责**
401574
- 管理包的依赖关系和安装顺序

0 commit comments

Comments
 (0)