diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2025-06-24 15:54:00 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-24 07:54:00 +0000 |
| commit | 47475114d036a391bacdb53a9a1c60e5d35b61bc (patch) | |
| tree | c891ec9f7784e68bd831c5a7407285d4b18a943d /extras | |
| parent | b1fc75fab3a1b700a89a711289598ac74883483c (diff) | |
Document supported compiler versions in building.md (#7512)
* Document supported compiler versions in building.md
Closes https://github.com/shader-slang/slang/issues/7376
* multiple checked versions
Diffstat (limited to 'extras')
| -rwxr-xr-x | extras/verify-documented-compiler-version.sh | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/extras/verify-documented-compiler-version.sh b/extras/verify-documented-compiler-version.sh new file mode 100755 index 000000000..b98a29dc4 --- /dev/null +++ b/extras/verify-documented-compiler-version.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# File paths +DOCS_FILE="docs/building.md" +CMAKE_CACHE="build/CMakeCache.txt" + +# Check if required files exist +if [[ ! -f "$DOCS_FILE" ]]; then + echo "::warning::Documentation file $DOCS_FILE not found" + exit 0 +fi + +if [[ ! -f "$CMAKE_CACHE" ]]; then + echo "::warning::CMakeCache.txt not found at $CMAKE_CACHE" + exit 0 +fi + +# Extract compiler path from CMakeCache.txt +COMPILER_PATH=$(grep "^CMAKE_CXX_COMPILER:FILEPATH=" "$CMAKE_CACHE" | cut -d'=' -f2) + +if [[ -z "$COMPILER_PATH" ]]; then + echo "::warning::Could not find CMAKE_CXX_COMPILER in CMakeCache.txt" + exit 0 +fi + +# Determine compiler type and get version +COMPILER_NAME=$(basename "$COMPILER_PATH") +COMPILER_VERSION="" +COMPILER_TYPE="" + +if [[ "$COMPILER_NAME" =~ ^g\+\+|^gcc ]]; then + COMPILER_TYPE="GCC" + # Get GCC version (e.g., "gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0") + COMPILER_VERSION=$("$COMPILER_PATH" --version | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) +elif [[ "$COMPILER_NAME" =~ ^clang\+\+|^clang ]]; then + COMPILER_TYPE="Clang" + # Get Clang version (e.g., "Ubuntu clang version 15.0.7") + COMPILER_VERSION=$("$COMPILER_PATH" --version | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) +elif [[ "$COMPILER_NAME" =~ ^cl\.exe|^cl$ ]]; then + COMPILER_TYPE="MSVC" + # MSVC version is more complex, extract major version + # MSVC outputs version like "19.29.30133" where 19 is the major version + COMPILER_VERSION=$("$COMPILER_PATH" 2>&1 | grep -oE 'Version [0-9]+\.[0-9]+' | grep -oE '[0-9]+\.[0-9]+' | head -1) +else + echo "::warning::Unknown compiler type: $COMPILER_NAME" + exit 0 +fi + +if [[ -z "$COMPILER_VERSION" ]]; then + echo "::warning::Could not determine version for compiler: $COMPILER_PATH" + exit 0 +fi + +# Extract major.minor version only +COMPILER_MAJOR_MINOR=$(echo "$COMPILER_VERSION" | cut -d'.' -f1,2) + +# Function to extract versions from a line +extract_versions() { + local line="$1" + local is_msvc="$2" + + # Extract the part between compiler name and "are/is tested in CI" + local version_part + version_part=$(echo "$line" | sed -E 's/^_[^_]+_ //; s/ (are|is) tested in CI.*//') + + # Split by "and" and extract version numbers + local versions=() + if [[ "$is_msvc" == "true" ]]; then + # For MSVC, just extract numbers + while IFS= read -r version; do + version=$(echo "$version" | grep -oE '[0-9]+' | head -1) + [[ -n "$version" ]] && versions+=("$version") + done < <(echo "$version_part" | tr ',' '\n' | sed 's/ and /\n/g') + else + # For GCC/Clang, extract major.minor versions + while IFS= read -r version; do + version=$(echo "$version" | grep -oE '[0-9]+\.[0-9]+' | head -1) + [[ -n "$version" ]] && versions+=("$version") + done < <(echo "$version_part" | tr ',' '\n' | sed 's/ and /\n/g') + fi + + echo "${versions[@]}" +} + +# Parse the documentation for the expected versions +EXPECTED_VERSIONS=() +VERSION_FOUND=false + +case "$COMPILER_TYPE" in +"GCC") + DOC_LINE=$(grep -E "^_GCC_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1) + if [[ -n "$DOC_LINE" ]]; then + # shellcheck disable=SC2207 + EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "false")) + fi + ;; +"Clang") + DOC_LINE=$(grep -E "^_Clang_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1) + if [[ -n "$DOC_LINE" ]]; then + # shellcheck disable=SC2207 + EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "false")) + fi + ;; +"MSVC") + # For MSVC, we only compare major version + DOC_LINE=$(grep -E "^_MSVC_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1) + if [[ -n "$DOC_LINE" ]]; then + # shellcheck disable=SC2207 + EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "true")) + fi + COMPILER_MAJOR_MINOR=$(echo "$COMPILER_VERSION" | cut -d'.' -f1) + ;; +esac + +if [[ ${#EXPECTED_VERSIONS[@]} -eq 0 ]]; then + echo "::warning::Could not find expected version for $COMPILER_TYPE in $DOCS_FILE" + exit 0 +fi + +# Check if current version matches any expected version +for expected in "${EXPECTED_VERSIONS[@]}"; do + if [[ "$COMPILER_MAJOR_MINOR" == "$expected" ]]; then + VERSION_FOUND=true + break + fi +done + +# Report results +if [[ "$VERSION_FOUND" == "false" ]]; then + EXPECTED_LIST=$( + IFS=', ' + echo "${EXPECTED_VERSIONS[*]}" + ) + echo "::warning::Compiler version mismatch for $COMPILER_TYPE: Documentation says $EXPECTED_LIST but found $COMPILER_MAJOR_MINOR (full version: $COMPILER_VERSION)" +else + echo "✓ Compiler version matches: $COMPILER_TYPE $COMPILER_MAJOR_MINOR" +fi + +exit 0 |
