yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie HermaszewskaDocument supported compiler versions in building.md (#7512)47475114d

master
4.4 KiB141 linesraw
1#!/usr/bin/env bash
2
3set -euo pipefail
4
5# File paths
6DOCS_FILE="docs/building.md"
7CMAKE_CACHE="build/CMakeCache.txt"
8
9# Check if required files exist
10if [[ ! -f "$DOCS_FILE" ]]; then
11  echo "::warning::Documentation file $DOCS_FILE not found"
12  exit 0
13fi
14
15if [[ ! -f "$CMAKE_CACHE" ]]; then
16  echo "::warning::CMakeCache.txt not found at $CMAKE_CACHE"
17  exit 0
18fi
19
20# Extract compiler path from CMakeCache.txt
21COMPILER_PATH=$(grep "^CMAKE_CXX_COMPILER:FILEPATH=" "$CMAKE_CACHE" | cut -d'=' -f2)
22
23if [[ -z "$COMPILER_PATH" ]]; then
24  echo "::warning::Could not find CMAKE_CXX_COMPILER in CMakeCache.txt"
25  exit 0
26fi
27
28# Determine compiler type and get version
29COMPILER_NAME=$(basename "$COMPILER_PATH")
30COMPILER_VERSION=""
31COMPILER_TYPE=""
32
33if [[ "$COMPILER_NAME" =~ ^g\+\+|^gcc ]]; then
34  COMPILER_TYPE="GCC"
35  # Get GCC version (e.g., "gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0")
36  COMPILER_VERSION=$("$COMPILER_PATH" --version | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
37elif [[ "$COMPILER_NAME" =~ ^clang\+\+|^clang ]]; then
38  COMPILER_TYPE="Clang"
39  # Get Clang version (e.g., "Ubuntu clang version 15.0.7")
40  COMPILER_VERSION=$("$COMPILER_PATH" --version | head -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
41elif [[ "$COMPILER_NAME" =~ ^cl\.exe|^cl$ ]]; then
42  COMPILER_TYPE="MSVC"
43  # MSVC version is more complex, extract major version
44  # MSVC outputs version like "19.29.30133" where 19 is the major version
45  COMPILER_VERSION=$("$COMPILER_PATH" 2>&1 | grep -oE 'Version [0-9]+\.[0-9]+' | grep -oE '[0-9]+\.[0-9]+' | head -1)
46else
47  echo "::warning::Unknown compiler type: $COMPILER_NAME"
48  exit 0
49fi
50
51if [[ -z "$COMPILER_VERSION" ]]; then
52  echo "::warning::Could not determine version for compiler: $COMPILER_PATH"
53  exit 0
54fi
55
56# Extract major.minor version only
57COMPILER_MAJOR_MINOR=$(echo "$COMPILER_VERSION" | cut -d'.' -f1,2)
58
59# Function to extract versions from a line
60extract_versions() {
61  local line="$1"
62  local is_msvc="$2"
63
64  # Extract the part between compiler name and "are/is tested in CI"
65  local version_part
66  version_part=$(echo "$line" | sed -E 's/^_[^_]+_ //; s/ (are|is) tested in CI.*//')
67
68  # Split by "and" and extract version numbers
69  local versions=()
70  if [[ "$is_msvc" == "true" ]]; then
71    # For MSVC, just extract numbers
72    while IFS= read -r version; do
73      version=$(echo "$version" | grep -oE '[0-9]+' | head -1)
74      [[ -n "$version" ]] && versions+=("$version")
75    done < <(echo "$version_part" | tr ',' '\n' | sed 's/ and /\n/g')
76  else
77    # For GCC/Clang, extract major.minor versions
78    while IFS= read -r version; do
79      version=$(echo "$version" | grep -oE '[0-9]+\.[0-9]+' | head -1)
80      [[ -n "$version" ]] && versions+=("$version")
81    done < <(echo "$version_part" | tr ',' '\n' | sed 's/ and /\n/g')
82  fi
83
84  echo "${versions[@]}"
85}
86
87# Parse the documentation for the expected versions
88EXPECTED_VERSIONS=()
89VERSION_FOUND=false
90
91case "$COMPILER_TYPE" in
92"GCC")
93  DOC_LINE=$(grep -E "^_GCC_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1)
94  if [[ -n "$DOC_LINE" ]]; then
95    # shellcheck disable=SC2207
96    EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "false"))
97  fi
98  ;;
99"Clang")
100  DOC_LINE=$(grep -E "^_Clang_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1)
101  if [[ -n "$DOC_LINE" ]]; then
102    # shellcheck disable=SC2207
103    EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "false"))
104  fi
105  ;;
106"MSVC")
107  # For MSVC, we only compare major version
108  DOC_LINE=$(grep -E "^_MSVC_ .+ (are|is) tested in CI" "$DOCS_FILE" | head -1)
109  if [[ -n "$DOC_LINE" ]]; then
110    # shellcheck disable=SC2207
111    EXPECTED_VERSIONS=($(extract_versions "$DOC_LINE" "true"))
112  fi
113  COMPILER_MAJOR_MINOR=$(echo "$COMPILER_VERSION" | cut -d'.' -f1)
114  ;;
115esac
116
117if [[ ${#EXPECTED_VERSIONS[@]} -eq 0 ]]; then
118  echo "::warning::Could not find expected version for $COMPILER_TYPE in $DOCS_FILE"
119  exit 0
120fi
121
122# Check if current version matches any expected version
123for expected in "${EXPECTED_VERSIONS[@]}"; do
124  if [[ "$COMPILER_MAJOR_MINOR" == "$expected" ]]; then
125    VERSION_FOUND=true
126    break
127  fi
128done
129
130# Report results
131if [[ "$VERSION_FOUND" == "false" ]]; then
132  EXPECTED_LIST=$(
133    IFS=', '
134    echo "${EXPECTED_VERSIONS[*]}"
135  )
136  echo "::warning::Compiler version mismatch for $COMPILER_TYPE: Documentation says $EXPECTED_LIST but found $COMPILER_MAJOR_MINOR (full version: $COMPILER_VERSION)"
137else
138  echo "✓ Compiler version matches: $COMPILER_TYPE $COMPILER_MAJOR_MINOR"
139fi
140
141exit 0