1#!/usr/bin/env bash 2 3set -e 4 5function err() 6{ 7 echo "$@" >&2 8} 9 10function usage() 11{ 12 err "Detect compiler and linker versions, generate mk/cc.mk" 13 err "" 14 err "Usage: ./detect_cc.sh [OPTION]..." 15 err "" 16 err "Defaults for the options are specified in brackets." 17 err "" 18 err "General:" 19 err " -h, --help Display this help and exit" 20 err " --cc=path C compiler to use" 21 err " --cxx=path C++ compiler to use" 22 err " --lto=[y|n] Attempt to configure for LTO" 23 24} 25 26CC=cc 27CXX=c++ 28LTO=n 29 30for i in "$@"; do 31 case "$i" in 32 -h|--help) 33 usage 34 exit 0 35 ;; 36 --cc=*) 37 CC="${i#*=}" 38 ;; 39 --cxx=*) 40 CXX="${i#*=}" 41 ;; 42 --lto=*) 43 LTO="${i#*=}" 44 ;; 45 --) 46 break 47 ;; 48 *) 49 err "Unrecognized option $i" 50 usage 51 exit 1 52 esac 53done 54 55CC_TYPE=$($CC -v 2>&1 | grep -o -E '\w+ version' | awk '{ print $1 }') 56CXX_TYPE=$($CXX -v 2>&1 | grep -o -E '\w+ version' | awk '{ print $1 }') 57LD_TYPE=$(ld -v 2>&1 | awk '{print $2}') 58 59if [ "$CC_TYPE" != "$CXX_TYPE" ]; then 60 err "C compiler is $CC_TYPE but C++ compiler is $CXX_TYPE" 61 err "This may result in errors" 62fi 63 64CCAR="ar" 65if [ "$LTO" = "y" ]; then 66 if [ "$CC_TYPE" = "clang" ]; then 67 if [ "$LD_TYPE" != "gold" ]; then 68 err "Using LTO with clang requires the gold linker." 69 exit 1 70 fi 71 CCAR="llvm-ar" 72 else 73 CCAR="gcc-ar" 74 fi 75fi 76 77echo "CC=$CC" 78echo "CXX=$CXX" 79echo "CCAR=$CCAR" 80echo "CC_TYPE=$CC_TYPE" 81