1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 06:57:45 +00:00

Meta: Allow Clang to be used as the host compiler for Lagom

Various Clang binaries are now considered when choosing the compiler for
Lagom.

The selection precedence is as follows:
1. Use the compiler set via CC/CXX if it's a supported version
2. Use newest available GCC if it's supported
3. Use newest available Clang if it's supported

Note that Apple Clang is still not supported, as its versioning scheme
and the fact that it masquerades as both GCC and Clang would complicate
this logic even more.

Fixes #12253
This commit is contained in:
Daniel Bertalan 2022-04-14 16:32:32 +02:00 committed by Andreas Kling
parent 735e3e9c74
commit dbb2347000

View file

@ -89,6 +89,7 @@ else
fi fi
CMAKE_ARGS=() CMAKE_ARGS=()
HOST_COMPILER=""
# Toolchain selection only applies to non-lagom targets. # Toolchain selection only applies to non-lagom targets.
if [ "$TARGET" != "lagom" ]; then if [ "$TARGET" != "lagom" ]; then
@ -141,37 +142,77 @@ create_build_dir() {
fi fi
} }
pick_gcc() { is_supported_compiler() {
local COMPILER="$1"
if [ -z "$COMPILER" ]; then
return 1
fi
local VERSION=""
VERSION="$($COMPILER -dumpversion)" || return 1
local MAJOR_VERSION=""
MAJOR_VERSION="${VERSION%%.*}"
if $COMPILER --version 2>&1 | grep "Apple clang" >/dev/null; then
return 1
elif $COMPILER --version 2>&1 | grep "clang" >/dev/null; then
[ "$MAJOR_VERSION" -gt 12 ] && return 0
else
[ "$MAJOR_VERSION" -gt 10 ] && return 0
fi
return 1
}
find_newest_compiler() {
local BEST_VERSION=0 local BEST_VERSION=0
local BEST_GCC_CANDIDATE="" local BEST_CANDIDATE=""
for GCC_CANDIDATE in egcc gcc gcc-11 gcc-12 /usr/local/bin/gcc-11 /opt/homebrew/bin/gcc-11; do for CANDIDATE in "$@"; do
if ! command -v $GCC_CANDIDATE >/dev/null 2>&1; then if ! command -v "$CANDIDATE" >/dev/null 2>&1; then
continue continue
fi fi
if $GCC_CANDIDATE --version 2>&1 | grep "Apple clang" >/dev/null; then if $CANDIDATE --version 2>&1 | grep "Apple clang" >/dev/null; then
continue continue
fi fi
if ! $GCC_CANDIDATE -dumpversion >/dev/null 2>&1; then if ! $CANDIDATE -dumpversion >/dev/null 2>&1; then
continue continue
fi fi
local VERSION="" local VERSION=""
VERSION="$($GCC_CANDIDATE -dumpversion)" VERSION="$($CANDIDATE -dumpversion)"
local MAJOR_VERSION="${VERSION%%.*}" local MAJOR_VERSION="${VERSION%%.*}"
if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then
BEST_VERSION=$MAJOR_VERSION BEST_VERSION=$MAJOR_VERSION
BEST_GCC_CANDIDATE="$GCC_CANDIDATE" BEST_CANDIDATE="$CANDIDATE"
fi fi
done done
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=$BEST_GCC_CANDIDATE") HOST_COMPILER=$BEST_CANDIDATE
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=${BEST_GCC_CANDIDATE/gcc/g++}") }
if [ "$BEST_VERSION" -lt 11 ]; then
die "Please make sure that GCC version 11 or higher is installed." pick_host_compiler() {
if is_supported_compiler "$CC" && is_supported_compiler "$CXX"; then
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=$CC")
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=$CXX")
return
fi fi
find_newest_compiler egcc gcc gcc-11 gcc-12 /usr/local/bin/gcc-11 /opt/homebrew/bin/gcc-11
if is_supported_compiler "$HOST_COMPILER"; then
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=$HOST_COMPILER")
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=${HOST_COMPILER/gcc/g++}")
return
fi
find_newest_compiler clang clang-13 clang-14 clang-15
if is_supported_compiler "$HOST_COMPILER"; then
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=$HOST_COMPILER")
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=${HOST_COMPILER/clang/clang++}")
return
fi
die "Please make sure that GCC version 11, Clang version 13, or higher is installed."
} }
cmd_with_target() { cmd_with_target() {
is_valid_target || ( >&2 echo "Unknown target: $TARGET"; usage ) is_valid_target || ( >&2 echo "Unknown target: $TARGET"; usage )
pick_gcc pick_host_compiler
if [ ! -d "$SERENITY_SOURCE_DIR" ]; then if [ ! -d "$SERENITY_SOURCE_DIR" ]; then
SERENITY_SOURCE_DIR="$(get_top_dir)" SERENITY_SOURCE_DIR="$(get_top_dir)"