[cmake] cleanup on clang version mapping on macOS
This patch cleans up the code that determines compiler type and version
on macOS for Xcode-based LLVM/CLANG. As it turns out, there is a well
documented mapping for clang versions: see [1] and [2].
I also updated unified regex patterns used to find versions of the
compiler in its version string.
References:
[1] https://trac.macports.org/wiki/XcodeVersionInfo
[2] https://en.wikipedia.org/wiki/Xcode#Version_history
Change-Id: I656dd4b20c7c852746861861f0741763b02609d5
Reviewed-on: http://gerrit.cloudera.org:8080/18874
Tested-by: Kudu Jenkins
Reviewed-by: Attila Bukor <abukor@apache.org>
diff --git a/cmake_modules/CompilerInfo.cmake b/cmake_modules/CompilerInfo.cmake
index 8422e99..8883d34 100644
--- a/cmake_modules/CompilerInfo.cmake
+++ b/cmake_modules/CompilerInfo.cmake
@@ -21,54 +21,101 @@
ERROR_VARIABLE COMPILER_VERSION_FULL)
message(${COMPILER_VERSION_FULL})
-# clang on Linux and Mac OS X before 10.9
-if("${COMPILER_VERSION_FULL}" MATCHES ".*clang version.*")
- set(COMPILER_FAMILY "clang")
- string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1"
- COMPILER_VERSION "${COMPILER_VERSION_FULL}")
-# clang on Mac OS X 10.9 and later
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*based on LLVM.*")
- set(COMPILER_FAMILY "clang")
- string(REGEX REPLACE ".*based on LLVM ([0-9]+\\.[0.9]+).*" "\\1"
+# Information on Xcode, llvm-gcc, and clang versions.
+# https://trac.macports.org/wiki/XcodeVersionInfo
+# Information on Xcode/LLVM and LLVM Apple/upstream version mapping:
+# https://en.wikipedia.org/wiki/Xcode#Xcode_7.0_-_12.x_(since_Free_On-Device_Development)
+
+# gcc
+if("${COMPILER_VERSION_FULL}" MATCHES ".*gcc version.*")
+ set(COMPILER_FAMILY "gcc")
+ string(REGEX REPLACE ".*gcc version ([0-9]+(\\.[0-9]+)*).*" "\\1"
COMPILER_VERSION "${COMPILER_VERSION_FULL}")
-# clang on Mac OS X, XCode 7.
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*clang-7")
+# clang on Mac OS X, XCode 7
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-700\\.")
set(COMPILER_FAMILY "clang")
set(COMPILER_VERSION "3.7.0svn")
-
-# clang on Mac OS X, XCode 8.
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*clang-8")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-703\\.")
set(COMPILER_FAMILY "clang")
set(COMPILER_VERSION "3.8.0svn")
-# clang on Mac OS X, XCode 9.
-#
-# TODO(dan): 4.0.0svn is just a guess, because Apple has not (as of the time of
-# writing) released the sources [1]. [2] and [3] are good resources for
-# determining the upstream Clang version as well.
-#
-# [1]: https://opensource.apple.com/
-# [2]: https://gist.github.com/yamaya/2924292
-# [3]: https://gist.github.com/epipping/ef8b02b0cfaec4a5ebf3a57092145a3f
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*clang-9")
+# clang on Mac OS X, XCode 8
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-80[02]\\.")
set(COMPILER_FAMILY "clang")
- set(COMPILER_VERSION "4.0.0svn")
+ set(COMPILER_VERSION "3.9.0svn")
-# clang on macOS, XCode 10.
-#
-# TODO(wdberkeley): 6.0.0svn is also just a guess, for the same reason, and
-# generated from the same sources, particularly the comment
-# https://gist.github.com/yamaya/2924292#gistcomment-801888.
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*clang-10")
+# clang on Mac OS X, XCode 9
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-900\\.")
set(COMPILER_FAMILY "clang")
- set(COMPILER_VERSION "6.0.0svn")
+ set(COMPILER_VERSION "4.0.0")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-902\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "5.0.2")
-# gcc
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*gcc version.*")
- set(COMPILER_FAMILY "gcc")
- string(REGEX REPLACE ".*gcc version ([0-9\\.]+).*" "\\1"
+# clang on macOS, XCode 10
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-1000\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "6.0.1")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple LLVM version [0-9]+(\\.[0-9]+)* \\(clang-1001\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "7.0.0")
+
+# clang on macOS, XCode 11
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1100\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "8.0.0")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1103\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "9.0.0")
+
+# clang on macOS, XCode 12
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1200\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "10.0.0")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1205\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "11.1.0")
+
+# clang on macOS, XCode 13
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1300\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "12.0.0")
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1316\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "13.0.0")
+
+# clang on macOS, XCode 14
+elseif("${COMPILER_VERSION_FULL}" MATCHES
+ "Apple clang version [0-9]+(\\.[0-9]+)* \\(clang-1400\\.")
+ set(COMPILER_FAMILY "clang")
+ set(COMPILER_VERSION "14.0.0")
+
+# clang on Mac OS X with Xcode verions from 3.2.6 to 6.4 inclusive
+elseif("${COMPILER_VERSION_FULL}" MATCHES "Apple .* \\(based on LLVM.*")
+ set(COMPILER_FAMILY "clang")
+ string(REGEX REPLACE ".* \\(based on LLVM ([0-9]+(\\.[0-9]+)*.*)\\).*" "\\1"
COMPILER_VERSION "${COMPILER_VERSION_FULL}")
+
+# clang on Linux and MacOS (other than Xcode-based)
+elseif("${COMPILER_VERSION_FULL}" MATCHES ".*clang version.*")
+ set(COMPILER_FAMILY "clang")
+ string(REGEX REPLACE ".*clang version ([0-9]+(\\.[0-9]+)*).*" "\\1"
+ COMPILER_VERSION "${COMPILER_VERSION_FULL}")
+
else()
message(FATAL_ERROR "Unknown compiler. Version info:\n${COMPILER_VERSION_FULL}")
endif()