serenity/Meta/find_compiler.sh
Daniel Bertalan 060e6f4d21 Meta: Fix detection of default compiler versions
The logic in this script was *intended* to use the system's default
compiler if it was sufficiently new, and only start searching for the
latest installed if the default was not suitable.

However, the `cxx` program does not exist on Unixes, so the version
check always failed. We should be using the standard `c++` program name
instead.

After this change, the `CC` and `CXX` environment variables will have to
be used if someone wants to force a newer compiler version.
2024-05-23 00:56:37 -06:00

78 lines
2.3 KiB
Bash

# shellcheck shell=bash
HOST_COMPILER=""
is_supported_compiler() {
local COMPILER="$1"
if [ -z "$COMPILER" ]; then
return 1
fi
local VERSION=""
VERSION="$($COMPILER -dumpversion 2> /dev/null)" || return 1
local MAJOR_VERSION=""
MAJOR_VERSION="${VERSION%%.*}"
if $COMPILER --version 2>&1 | grep "Apple clang" >/dev/null; then
# Apple Clang version check
BUILD_VERSION=$(echo | $COMPILER -dM -E - | grep __apple_build_version__ | cut -d ' ' -f3)
# Xcode 14.3, based on upstream LLVM 15
[ "$BUILD_VERSION" -ge 14030022 ] && return 0
elif $COMPILER --version 2>&1 | grep "clang" >/dev/null; then
# Clang version check
[ "$MAJOR_VERSION" -ge 17 ] && return 0
else
# GCC version check
[ "$MAJOR_VERSION" -ge 13 ] && return 0
fi
return 1
}
find_newest_compiler() {
local BEST_VERSION=0
local BEST_CANDIDATE=""
for CANDIDATE in "$@"; do
if ! command -v "$CANDIDATE" >/dev/null 2>&1; then
continue
fi
if ! $CANDIDATE -dumpversion >/dev/null 2>&1; then
continue
fi
local VERSION=""
VERSION="$($CANDIDATE -dumpversion)"
local MAJOR_VERSION="${VERSION%%.*}"
if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then
BEST_VERSION=$MAJOR_VERSION
BEST_CANDIDATE="$CANDIDATE"
fi
done
HOST_COMPILER=$BEST_CANDIDATE
}
pick_host_compiler() {
CC=${CC:-"cc"}
CXX=${CXX:-"c++"}
if is_supported_compiler "$CC" && is_supported_compiler "$CXX"; then
return
fi
find_newest_compiler clang clang-17 clang-18 /opt/homebrew/opt/llvm/bin/clang
if is_supported_compiler "$HOST_COMPILER"; then
export CC="${HOST_COMPILER}"
export CXX="${HOST_COMPILER/clang/clang++}"
return
fi
find_newest_compiler egcc gcc gcc-13 gcc-14 /usr/local/bin/gcc-{13,14} /opt/homebrew/bin/gcc-{13,14}
if is_supported_compiler "$HOST_COMPILER"; then
export CC="${HOST_COMPILER}"
export CXX="${HOST_COMPILER/gcc/g++}"
return
fi
if [ "$(uname -s)" = "Darwin" ]; then
die "Please make sure that Xcode 14.3, Homebrew Clang 17, or higher is installed."
else
die "Please make sure that GCC version 13, Clang version 17, or higher is installed."
fi
}