fix: Enhance build environment verification scripts with automatic issue fixes and improved CMake version checks
This commit is contained in:
@@ -26,22 +26,27 @@ Comprehensive build environment verification script that checks:
|
|||||||
- ✅ **Git Installation** - With submodule support
|
- ✅ **Git Installation** - With submodule support
|
||||||
- ✅ **C++ Compiler** - GCC 13+, Clang 16+, or MSVC 2019+
|
- ✅ **C++ Compiler** - GCC 13+, Clang 16+, or MSVC 2019+
|
||||||
- ✅ **Platform Tools** - Xcode (macOS), Visual Studio (Windows), build-essential (Linux)
|
- ✅ **Platform Tools** - Xcode (macOS), Visual Studio (Windows), build-essential (Linux)
|
||||||
- ✅ **Git Submodules** - All dependencies synchronized
|
- ✅ **Git Submodules** - All dependencies synchronized (auto-fixes if missing/empty)
|
||||||
- ✅ **CMake Cache** - Freshness check (warns if >7 days old)
|
- ✅ **CMake Cache** - Freshness check (warns if >7 days old)
|
||||||
- ✅ **Dependency Compatibility** - gRPC isolation, httplib, nlohmann/json
|
- ✅ **Dependency Compatibility** - gRPC isolation, httplib, nlohmann/json
|
||||||
- ✅ **CMake Configuration** - Test configuration (verbose mode only)
|
- ✅ **CMake Configuration** - Test configuration (verbose mode only)
|
||||||
|
|
||||||
|
**Automatic Fixes:**
|
||||||
|
The script now automatically fixes common issues without requiring `-FixIssues`:
|
||||||
|
- 🔧 **Missing/Empty Submodules** - Automatically runs `git submodule update --init --recursive`
|
||||||
|
- 🔧 **Old CMake Cache** - Prompts for confirmation when using `-FixIssues` (auto-skips otherwise)
|
||||||
|
|
||||||
#### Usage
|
#### Usage
|
||||||
|
|
||||||
**Windows:**
|
**Windows:**
|
||||||
```powershell
|
```powershell
|
||||||
# Basic verification
|
# Basic verification (auto-fixes submodules)
|
||||||
.\scripts\verify-build-environment.ps1
|
.\scripts\verify-build-environment.ps1
|
||||||
|
|
||||||
# With automatic fixes (sync submodules, clean cache)
|
# With interactive fixes (prompts for cache cleaning)
|
||||||
.\scripts\verify-build-environment.ps1 -FixIssues
|
.\scripts\verify-build-environment.ps1 -FixIssues
|
||||||
|
|
||||||
# Clean old CMake cache files
|
# Force clean old CMake cache (no prompts)
|
||||||
.\scripts\verify-build-environment.ps1 -CleanCache
|
.\scripts\verify-build-environment.ps1 -CleanCache
|
||||||
|
|
||||||
# Verbose output (includes CMake configuration test)
|
# Verbose output (includes CMake configuration test)
|
||||||
@@ -53,13 +58,13 @@ Comprehensive build environment verification script that checks:
|
|||||||
|
|
||||||
**macOS/Linux:**
|
**macOS/Linux:**
|
||||||
```bash
|
```bash
|
||||||
# Basic verification
|
# Basic verification (auto-fixes submodules)
|
||||||
./scripts/verify-build-environment.sh
|
./scripts/verify-build-environment.sh
|
||||||
|
|
||||||
# With automatic fixes
|
# With interactive fixes (prompts for cache cleaning)
|
||||||
./scripts/verify-build-environment.sh --fix
|
./scripts/verify-build-environment.sh --fix
|
||||||
|
|
||||||
# Clean old CMake cache files
|
# Force clean old CMake cache (no prompts)
|
||||||
./scripts/verify-build-environment.sh --clean
|
./scripts/verify-build-environment.sh --clean
|
||||||
|
|
||||||
# Verbose output
|
# Verbose output
|
||||||
@@ -135,6 +140,45 @@ cmake --build build
|
|||||||
# Should report: "Build Environment Ready for Development!"
|
# Should report: "Build Environment Ready for Development!"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Automatic Fixes
|
||||||
|
|
||||||
|
The script automatically fixes common issues when detected:
|
||||||
|
|
||||||
|
### Always Auto-Fixed (No Confirmation Required)
|
||||||
|
|
||||||
|
1. **Missing/Empty Git Submodules**
|
||||||
|
```bash
|
||||||
|
git submodule sync --recursive
|
||||||
|
git submodule update --init --recursive
|
||||||
|
```
|
||||||
|
- Runs automatically when submodules are missing or empty
|
||||||
|
- No user confirmation required
|
||||||
|
- Re-verifies after sync to ensure success
|
||||||
|
|
||||||
|
### Fixed with `-FixIssues` / `--fix` Flag
|
||||||
|
|
||||||
|
2. **Clean Old CMake Cache** (with confirmation prompt)
|
||||||
|
- Prompts user before removing build directories
|
||||||
|
- Only when cache is older than 7 days
|
||||||
|
- User can choose to skip
|
||||||
|
|
||||||
|
### Fixed with `-CleanCache` / `--clean` Flag
|
||||||
|
|
||||||
|
3. **Force Clean CMake Cache** (no confirmation)
|
||||||
|
- Removes `build/`, `build_test/`, `build-grpc-test/`
|
||||||
|
- Removes Visual Studio cache (`out/`)
|
||||||
|
- No prompts, immediate cleanup
|
||||||
|
|
||||||
|
### Optional Verbose Tests
|
||||||
|
|
||||||
|
When run with `--verbose` or `-Verbose`:
|
||||||
|
|
||||||
|
4. **Test CMake Configuration**
|
||||||
|
- Creates temporary build directory
|
||||||
|
- Tests minimal configuration
|
||||||
|
- Reports success/failure
|
||||||
|
- Cleans up test directory
|
||||||
|
|
||||||
## Integration with Visual Studio
|
## Integration with Visual Studio
|
||||||
|
|
||||||
The verification script integrates with Visual Studio CMake workflow:
|
The verification script integrates with Visual Studio CMake workflow:
|
||||||
|
|||||||
@@ -39,8 +39,13 @@ function Test-Command {
|
|||||||
|
|
||||||
function Get-CMakeVersion {
|
function Get-CMakeVersion {
|
||||||
try {
|
try {
|
||||||
$output = & cmake --version 2>&1
|
$output = & cmake --version 2>&1 | Select-Object -First 1
|
||||||
if ($output -match "cmake version (\d+\.\d+\.\d+)") {
|
# Handle various CMake version output formats
|
||||||
|
if ($output -match "cmake version ([0-9]+\.[0-9]+\.[0-9]+)") {
|
||||||
|
return $matches[1]
|
||||||
|
}
|
||||||
|
# Try alternative format (some versions print differently)
|
||||||
|
if ($output -match "([0-9]+\.[0-9]+\.[0-9]+)") {
|
||||||
return $matches[1]
|
return $matches[1]
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -160,13 +165,21 @@ function Sync-GitSubmodules {
|
|||||||
Push-Location (Join-Path $PSScriptRoot "..")
|
Push-Location (Join-Path $PSScriptRoot "..")
|
||||||
try {
|
try {
|
||||||
Write-Status "Running: git submodule sync --recursive" "Info"
|
Write-Status "Running: git submodule sync --recursive" "Info"
|
||||||
git submodule sync --recursive
|
$syncOutput = git submodule sync --recursive 2>&1
|
||||||
|
|
||||||
Write-Status "Running: git submodule update --init --recursive" "Info"
|
Write-Status "Running: git submodule update --init --recursive" "Info"
|
||||||
git submodule update --init --recursive
|
$updateOutput = git submodule update --init --recursive 2>&1
|
||||||
|
|
||||||
Write-Status "Submodules synced successfully" "Success"
|
if ($LASTEXITCODE -eq 0) {
|
||||||
return $true
|
Write-Status "Submodules synced successfully" "Success"
|
||||||
|
return $true
|
||||||
|
} else {
|
||||||
|
Write-Status "Git submodule commands completed with warnings" "Warning"
|
||||||
|
if ($Verbose) {
|
||||||
|
Write-Host $updateOutput -ForegroundColor Gray
|
||||||
|
}
|
||||||
|
return $true # Still return true as submodules may be partially synced
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
Write-Status "Failed to sync submodules: $_" "Error"
|
Write-Status "Failed to sync submodules: $_" "Error"
|
||||||
return $false
|
return $false
|
||||||
@@ -228,12 +241,26 @@ $startTime = Get-Date
|
|||||||
Write-Status "Checking CMake installation..." "Step"
|
Write-Status "Checking CMake installation..." "Step"
|
||||||
if (Test-Command "cmake") {
|
if (Test-Command "cmake") {
|
||||||
$cmakeVersion = Get-CMakeVersion
|
$cmakeVersion = Get-CMakeVersion
|
||||||
Write-Status "CMake found: version $cmakeVersion" "Success"
|
if ($cmakeVersion) {
|
||||||
|
Write-Status "CMake found: version $cmakeVersion" "Success"
|
||||||
|
|
||||||
$major, $minor = $cmakeVersion.Split('.')[0..1]
|
# Parse version components
|
||||||
if ([int]$major -lt 3 -or ([int]$major -eq 3 -and [int]$minor -lt 16)) {
|
try {
|
||||||
Write-Status "CMake version too old (need 3.16+)" "Error"
|
$versionParts = $cmakeVersion.Split('.')
|
||||||
$script:issuesFound += "CMake version $cmakeVersion is below minimum 3.16"
|
$major = [int]$versionParts[0]
|
||||||
|
$minor = [int]$versionParts[1]
|
||||||
|
|
||||||
|
if ($major -lt 3 -or ($major -eq 3 -and $minor -lt 16)) {
|
||||||
|
Write-Status "CMake version too old (need 3.16+)" "Error"
|
||||||
|
$script:issuesFound += "CMake version $cmakeVersion is below minimum 3.16"
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Status "Could not parse CMake version: $cmakeVersion" "Warning"
|
||||||
|
$script:warnings += "Unable to verify CMake version requirement (need 3.16+)"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Status "CMake found but version could not be determined" "Warning"
|
||||||
|
$script:warnings += "CMake version could not be parsed - ensure version 3.16+ is installed"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Write-Status "CMake not found in PATH" "Error"
|
Write-Status "CMake not found in PATH" "Error"
|
||||||
@@ -275,11 +302,25 @@ $submodulesOk = Test-GitSubmodules
|
|||||||
if ($submodulesOk) {
|
if ($submodulesOk) {
|
||||||
Write-Status "All required submodules present" "Success"
|
Write-Status "All required submodules present" "Success"
|
||||||
} else {
|
} else {
|
||||||
Write-Status "Some submodules are missing" "Error"
|
Write-Status "Some submodules are missing or empty" "Error"
|
||||||
if ($FixIssues) {
|
if ($FixIssues) {
|
||||||
Sync-GitSubmodules
|
Sync-GitSubmodules
|
||||||
|
# Re-check after sync
|
||||||
|
$submodulesOk = Test-GitSubmodules
|
||||||
|
if (-not $submodulesOk) {
|
||||||
|
Write-Status "Submodule sync completed but some issues remain" "Warning"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Write-Status "Run with -FixIssues to automatically sync submodules" "Info"
|
# Auto-fix without confirmation
|
||||||
|
Write-Status "Automatically syncing submodules..." "Info"
|
||||||
|
if (Sync-GitSubmodules) {
|
||||||
|
Write-Status "Submodules synced successfully" "Success"
|
||||||
|
# Re-check after sync
|
||||||
|
$submodulesOk = Test-GitSubmodules
|
||||||
|
} else {
|
||||||
|
Write-Status "Failed to sync submodules automatically" "Error"
|
||||||
|
Write-Status "Run with -FixIssues to try again, or manually run: git submodule update --init --recursive" "Info"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,9 +330,20 @@ $cacheOk = Test-CMakeCache
|
|||||||
if ($cacheOk) {
|
if ($cacheOk) {
|
||||||
Write-Status "CMake cache is up to date" "Success"
|
Write-Status "CMake cache is up to date" "Success"
|
||||||
} else {
|
} else {
|
||||||
if ($CleanCache -or $FixIssues) {
|
if ($CleanCache) {
|
||||||
Clean-CMakeCache
|
Clean-CMakeCache
|
||||||
|
} elseif ($FixIssues) {
|
||||||
|
# Ask for confirmation before cleaning cache
|
||||||
|
Write-Host "`nCMake cache is older than 7 days. Clean it?" -ForegroundColor Yellow
|
||||||
|
Write-Host "This will remove build/, build_test/, build-grpc-test/, and out/ directories." -ForegroundColor Gray
|
||||||
|
$response = Read-Host "Continue? (Y/n)"
|
||||||
|
if ($response -eq "" -or $response -match "^[Yy]") {
|
||||||
|
Clean-CMakeCache
|
||||||
|
} else {
|
||||||
|
Write-Status "Skipping cache clean" "Info"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Write-Status "CMake cache is older than 7 days (consider cleaning)" "Warning"
|
||||||
Write-Status "Run with -CleanCache to remove old cache files" "Info"
|
Write-Status "Run with -CleanCache to remove old cache files" "Info"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,12 @@ check_command() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_cmake_version() {
|
get_cmake_version() {
|
||||||
cmake --version 2>/dev/null | head -n1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown"
|
local version=$(cmake --version 2>/dev/null | head -n1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -n1)
|
||||||
|
if [ -n "$version" ]; then
|
||||||
|
echo "$version"
|
||||||
|
else
|
||||||
|
echo "unknown"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_git_submodules() {
|
check_git_submodules() {
|
||||||
@@ -248,15 +253,27 @@ start_time=$(date +%s)
|
|||||||
print_status step "Checking CMake installation..."
|
print_status step "Checking CMake installation..."
|
||||||
if check_command cmake; then
|
if check_command cmake; then
|
||||||
cmake_version=$(get_cmake_version)
|
cmake_version=$(get_cmake_version)
|
||||||
print_status success "CMake found: version $cmake_version"
|
|
||||||
|
|
||||||
# Check version
|
if [ "$cmake_version" != "unknown" ]; then
|
||||||
major=$(echo "$cmake_version" | cut -d. -f1)
|
print_status success "CMake found: version $cmake_version"
|
||||||
minor=$(echo "$cmake_version" | cut -d. -f2)
|
|
||||||
|
|
||||||
if [ "$major" -lt 3 ] || ([ "$major" -eq 3 ] && [ "$minor" -lt 16 ]); then
|
# Check version
|
||||||
print_status error "CMake version too old (need 3.16+)"
|
major=$(echo "$cmake_version" | cut -d. -f1)
|
||||||
issues_found+=("CMake version $cmake_version is below minimum 3.16")
|
minor=$(echo "$cmake_version" | cut -d. -f2)
|
||||||
|
|
||||||
|
# Validate that we got numeric values
|
||||||
|
if [[ "$major" =~ ^[0-9]+$ ]] && [[ "$minor" =~ ^[0-9]+$ ]]; then
|
||||||
|
if [ "$major" -lt 3 ] || ([ "$major" -eq 3 ] && [ "$minor" -lt 16 ]); then
|
||||||
|
print_status error "CMake version too old (need 3.16+)"
|
||||||
|
issues_found+=("CMake version $cmake_version is below minimum 3.16")
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_status warning "Could not parse CMake version: $cmake_version"
|
||||||
|
warnings+=("Unable to verify CMake version requirement (need 3.16+)")
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
print_status warning "CMake found but version could not be determined"
|
||||||
|
warnings+=("CMake version could not be parsed - ensure version 3.16+ is installed")
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
print_status error "CMake not found in PATH"
|
print_status error "CMake not found in PATH"
|
||||||
@@ -305,11 +322,24 @@ print_status step "Checking git submodules..."
|
|||||||
if check_git_submodules; then
|
if check_git_submodules; then
|
||||||
print_status success "All required submodules present"
|
print_status success "All required submodules present"
|
||||||
else
|
else
|
||||||
print_status error "Some submodules are missing"
|
print_status error "Some submodules are missing or empty"
|
||||||
if [ $FIX_ISSUES -eq 1 ]; then
|
if [ $FIX_ISSUES -eq 1 ]; then
|
||||||
sync_git_submodules
|
sync_git_submodules
|
||||||
|
# Re-check after sync
|
||||||
|
if ! check_git_submodules; then
|
||||||
|
print_status warning "Submodule sync completed but some issues remain"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
print_status info "Run with --fix to automatically sync submodules"
|
# Auto-fix without confirmation
|
||||||
|
print_status info "Automatically syncing submodules..."
|
||||||
|
if sync_git_submodules; then
|
||||||
|
print_status success "Submodules synced successfully"
|
||||||
|
# Re-check after sync
|
||||||
|
check_git_submodules
|
||||||
|
else
|
||||||
|
print_status error "Failed to sync submodules automatically"
|
||||||
|
print_status info "Run with --fix to try again, or manually run: git submodule update --init --recursive"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -318,9 +348,22 @@ print_status step "Checking CMake cache..."
|
|||||||
if check_cmake_cache; then
|
if check_cmake_cache; then
|
||||||
print_status success "CMake cache is up to date"
|
print_status success "CMake cache is up to date"
|
||||||
else
|
else
|
||||||
if [ $CLEAN_CACHE -eq 1 ] || [ $FIX_ISSUES -eq 1 ]; then
|
if [ $CLEAN_CACHE -eq 1 ]; then
|
||||||
clean_cmake_cache
|
clean_cmake_cache
|
||||||
|
elif [ $FIX_ISSUES -eq 1 ]; then
|
||||||
|
# Ask for confirmation before cleaning cache
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}CMake cache is older than 7 days. Clean it?${NC}"
|
||||||
|
echo -e "${CYAN}This will remove build/, build_test/, and build-grpc-test/ directories.${NC}"
|
||||||
|
read -p "Continue? (Y/n) " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]] || [[ -z $REPLY ]]; then
|
||||||
|
clean_cmake_cache
|
||||||
|
else
|
||||||
|
print_status info "Skipping cache clean"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
|
print_status warning "CMake cache is older than 7 days (consider cleaning)"
|
||||||
print_status info "Run with --clean to remove old cache files"
|
print_status info "Run with --clean to remove old cache files"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user