Skip to content

Commit

Permalink
Remove hardcoded list of compiler versions in init-compiler.sh (#14696)
Browse files Browse the repository at this point in the history
  • Loading branch information
omajid authored Apr 23, 2024
1 parent 9e75fc7 commit 65fb7aa
Showing 1 changed file with 52 additions and 23 deletions.
75 changes: 52 additions & 23 deletions eng/common/native/init-compiler.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
#
# This file detects the C/C++ compiler and exports it to the CC/CXX environment variables
#
# NOTE: some scripts source this file and rely on stdout being empty, make sure to not output anything here!
# NOTE: some scripts source this file and rely on stdout being empty, make sure
# to not output *anything* here, unless it is an error message that fails the
# build.

if [ -z "$build_arch" ] || [ -z "$compiler" ]; then
echo "Usage..."
Expand Down Expand Up @@ -58,6 +60,25 @@ check_version_exists() {
echo "$desired_version"
}

set_compiler_version_from_CC() {
if [ "$(uname)" == "Darwin" ]; then
# On Darwin, the versions from -version/-dumpversion refer to Xcode
# versions, not llvm versions, so we can't rely on them.
return
fi

version="$("$CC" -dumpversion)"
if [ "$version" = "" ]; then
echo "Error: $CC -dumpversion didn't provide a version"
exit 1
fi

# gcc and clang often display 3 part versions. However, gcc can show only 1 part in some environments.
IFS=. read -r majorVersion minorVersion _ <<EOF
$version
EOF
}

if [ -z "$CLR_CC" ]; then

# Set default versions
Expand All @@ -74,28 +95,30 @@ if [ -z "$CLR_CC" ]; then
done

if [ -z "$majorVersion" ]; then
if command -v "$compiler" > /dev/null; then
if [ "$(uname)" != "Darwin" ]; then
echo "Warning: Specific version of $compiler not found, falling back to use the one in PATH."
fi
CC="$(command -v "$compiler")"
CXX="$(command -v "$cxxCompiler")"
else
echo "No usable version of $compiler found."
if [ "$(uname)" == "Darwin" ]; then
echo "Error: Specific version of $compiler not found"
exit 1
fi

if ! command -v "$compiler" > /dev/null; then
echo "Error: No usable version of $compiler found."
exit 1
fi

CC="$(command -v "$compiler")"
CXX="$(command -v "$cxxCompiler")"
set_compiler_version_from_CC
else
if [ "$compiler" = "clang" ] && [ "$majorVersion" -lt 5 ]; then
if [ "$build_arch" = "arm" ] || [ "$build_arch" = "armel" ]; then
if command -v "$compiler" > /dev/null; then
echo "Warning: Found clang version $majorVersion which is not supported on arm/armel architectures, falling back to use clang from PATH."
CC="$(command -v "$compiler")"
CXX="$(command -v "$cxxCompiler")"
else
echo "Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH."
exit 1
fi
if ( [ "$compiler" = "clang" ] && [ "$majorVersion" -lt 5 ] ) && ( [ "$build_arch" = "arm" ] || [ "$build_arch" = "armel" ] ); then
# If a major version was provided explicitly, and it was too old, find a newer compiler instead
if ! command -v "$compiler" > /dev/null; then
echo "Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH."
exit 1
fi

CC="$(command -v "$compiler")"
CXX="$(command -v "$cxxCompiler")"
set_compiler_version_from_CC
fi
fi
else
Expand All @@ -110,6 +133,7 @@ if [ -z "$CLR_CC" ]; then
CC="$(command -v "$compiler$desired_version")"
CXX="$(command -v "$cxxCompiler$desired_version")"
if [ -z "$CXX" ]; then CXX="$(command -v "$cxxCompiler")"; fi
set_compiler_version_from_CC
fi
else
if [ ! -f "$CLR_CC" ]; then
Expand All @@ -118,17 +142,22 @@ else
fi
CC="$CLR_CC"
CXX="$CLR_CXX"
set_compiler_version_from_CC
fi

if [ -z "$CC" ]; then
echo "Unable to find $compiler."
exit 1
fi

# Only lld version >= 9 can be considered stable. lld supports s390x starting from 18.0.
if [ "$compiler" = "clang" ] && [ -n "$majorVersion" ] && [ "$majorVersion" -ge 9 ] && ([ "$build_arch" != "s390x" ] || [ "$majorVersion" -ge 18 ]); then
if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then
LDFLAGS="-fuse-ld=lld"
if [ "$(uname)" != "Darwin" ]; then
# On Darwin, we always want to use the Apple linker.

# Only lld version >= 9 can be considered stable. lld supports s390x starting from 18.0.
if [ "$compiler" = "clang" ] && [ -n "$majorVersion" ] && [ "$majorVersion" -ge 9 ] && ( [ "$build_arch" != "s390x" ] || [ "$majorVersion" -ge 18 ] ); then
if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then
LDFLAGS="-fuse-ld=lld"
fi
fi
fi

Expand Down

0 comments on commit 65fb7aa

Please sign in to comment.