Skip to content

Commit 48e6462

Browse files
committed
WIP: another workaround for hardcoded compiler versions
1 parent 4585e00 commit 48e6462

File tree

1 file changed

+50
-26
lines changed

1 file changed

+50
-26
lines changed

eng/common/native/init-compiler.sh

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
#
33
# This file detects the C/C++ compiler and exports it to the CC/CXX environment variables
44
#
5-
# NOTE: some scripts source this file and rely on stdout being empty, make sure to not output anything here!
5+
# NOTE: some scripts source this file and rely on stdout being empty, make sure
6+
# to not output *anything* here, unless it is an error message that fails the
7+
# build.
68

79
if [ -z "$build_arch" ] || [ -z "$compiler" ]; then
810
echo "Usage..."
@@ -58,6 +60,25 @@ check_version_exists() {
5860
echo "$desired_version"
5961
}
6062

63+
set_compiler_version_from_CC() {
64+
if [ "$(uname)" = "Darwin" ]; then
65+
# On Darwin, the versions from -version/-dumpversion refer to Xcode
66+
# versions, not llvm versions, so we can't rely on them.
67+
return
68+
fi
69+
70+
version="$("$CC" -dumpversion)"
71+
if [ "$version" = "" ]; then
72+
echo "Error: $CC -dumpversion didn't provide a version"
73+
exit 1
74+
fi
75+
76+
# gcc and clang often display 3 part versions. However, gcc can show only 1 part in some environments.
77+
IFS=. read -r majorVersion minorVersion _ <<EOF
78+
$version
79+
EOF
80+
}
81+
6182
if [ -z "$CLR_CC" ]; then
6283

6384
# Set default versions
@@ -74,34 +95,31 @@ if [ -z "$CLR_CC" ]; then
7495
done
7596

7697
if [ -z "$majorVersion" ]; then
77-
if command -v "$compiler" > /dev/null; then
78-
if [ "$(uname)" != "Darwin" ]; then
79-
echo "Warning: Specific version of $compiler not found, falling back to use the one in PATH."
80-
fi
81-
CC="$(command -v "$compiler")"
82-
CXX="$(command -v "$cxxCompiler")"
83-
else
84-
echo "No usable version of $compiler found."
98+
if ! command -v "$compiler" > /dev/null; then
99+
echo "Error: No usable version of $compiler found."
85100
exit 1
86101
fi
102+
103+
CC="$(command -v "$compiler")"
104+
CXX="$(command -v "$cxxCompiler")"
105+
set_compiler_version_from_CC
87106
else
88-
if [ "$compiler" = "clang" ] && [ "$majorVersion" -lt 5 ]; then
89-
if [ "$build_arch" = "arm" ] || [ "$build_arch" = "armel" ]; then
90-
if command -v "$compiler" > /dev/null; then
91-
echo "Warning: Found clang version $majorVersion which is not supported on arm/armel architectures, falling back to use clang from PATH."
92-
CC="$(command -v "$compiler")"
93-
CXX="$(command -v "$cxxCompiler")"
94-
else
95-
echo "Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH."
96-
exit 1
97-
fi
107+
if ( [ "$compiler" = "clang" ] && [ "$majorVersion" -lt 5 ] ) && ( [ "$build_arch" = "arm" ] || [ "$build_arch" = "armel" ] ); then
108+
# If a major version was provided explicitly, and it was too old, find a newer compiler instead
109+
if ! command -v "$compiler" > /dev/null; then
110+
echo "Error: Found clang version $majorVersion which is not supported on arm/armel architectures, and there is no clang in PATH."
111+
exit 1
98112
fi
113+
114+
CC="$(command -v "$compiler")"
115+
CXX="$(command -v "$cxxCompiler")"
116+
set_compiler_version_from_CC
99117
fi
100118
fi
101119
else
102120
desired_version="$(check_version_exists "$majorVersion" "$minorVersion")"
103121
if [ "$desired_version" = "-1" ]; then
104-
echo "Could not find specific version of $compiler: $majorVersion $minorVersion."
122+
echo "Error: Could not find specific version of $compiler: $majorVersion $minorVersion."
105123
exit 1
106124
fi
107125
fi
@@ -110,25 +128,31 @@ if [ -z "$CLR_CC" ]; then
110128
CC="$(command -v "$compiler$desired_version")"
111129
CXX="$(command -v "$cxxCompiler$desired_version")"
112130
if [ -z "$CXX" ]; then CXX="$(command -v "$cxxCompiler")"; fi
131+
set_compiler_version_from_CC
113132
fi
114133
else
115134
if [ ! -f "$CLR_CC" ]; then
116-
echo "CLR_CC is set but path '$CLR_CC' does not exist"
135+
echo "Error: CLR_CC is set but path '$CLR_CC' does not exist"
117136
exit 1
118137
fi
119138
CC="$CLR_CC"
120139
CXX="$CLR_CXX"
140+
set_compiler_version_from_CC
121141
fi
122142

123143
if [ -z "$CC" ]; then
124-
echo "Unable to find $compiler."
144+
echo "Error: Unable to find $compiler."
125145
exit 1
126146
fi
127147

128-
# Only lld version >= 9 can be considered stable. lld supports s390x starting from 18.0.
129-
if [ "$compiler" = "clang" ] && [ -n "$majorVersion" ] && [ "$majorVersion" -ge 9 ] && ([ "$build_arch" != "s390x" ] || [ "$majorVersion" -ge 18 ]); then
130-
if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then
131-
LDFLAGS="-fuse-ld=lld"
148+
if [ "$(uname)" != "Darwin" ]; then
149+
# On Darwin, we always want to use the Apple linker.
150+
151+
# Only lld version >= 9 can be considered stable. lld supports s390x starting from 18.0.
152+
if [ "$compiler" = "clang" ] && [ -n "$majorVersion" ] && [ "$majorVersion" -ge 9 ] && ( [ "$build_arch" != "s390x" ] || [ "$majorVersion" -ge 18 ] ); then
153+
if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then
154+
LDFLAGS="-fuse-ld=lld"
155+
fi
132156
fi
133157
fi
134158

0 commit comments

Comments
 (0)