mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 19:12:43 +00:00 
			
		
		
		
	 9b7aa8f6b6
			
		
	
	
		9b7aa8f6b6
		
	
	
	
	
		
			
			In bd7d01e9, Meta/serenity.sh started checking cc and cxx if CC or CXX
respectively are not set in the environment. My machine does not have
cxx symlink in PATH, so every invocation of the script resulted in
the "cxx: command not found" message outputted to stderr, and that
became quite annoying.
		
	
			
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			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 15 ] && return 0
 | |
|     else
 | |
|         # GCC version check
 | |
|         [ "$MAJOR_VERSION" -ge 12 ] && 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:-"cxx"}
 | |
| 
 | |
|     if is_supported_compiler "$CC" && is_supported_compiler "$CXX"; then
 | |
|         return
 | |
|     fi
 | |
| 
 | |
|     find_newest_compiler clang clang-15 clang-16 /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-12 gcc-13 /usr/local/bin/gcc-{12,13} /opt/homebrew/bin/gcc-{12,13}
 | |
|     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 15, or higher is installed."
 | |
|     else
 | |
|         die "Please make sure that GCC version 12, Clang version 15, or higher is installed."
 | |
|     fi
 | |
| }
 |