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 " --ld=path Linker to use" 23 err " --lto=[y|n] Attempt to configure for LTO" 24} 25 26CC=cc 27CXX=c++ 28LD=ld 29LTO=n 30 31for i in "$@"; do 32 case "$i" in 33 -h|--help) 34 usage 35 exit 0 36 ;; 37 --cc=*) 38 CC="${i#*=}" 39 ;; 40 --cxx=*) 41 CXX="${i#*=}" 42 ;; 43 --lto=*) 44 LTO="${i#*=}" 45 ;; 46 --ld=*) 47 LD="${i#*=}" 48 ;; 49 --) 50 break 51 ;; 52 *) 53 err "Unrecognized option $i" 54 usage 55 exit 1 56 esac 57done 58 59CC_TYPE=$($CC -v 2>&1 | grep -o -E '\w+ version' | head -1 | awk '{ print $1 }') 60CXX_TYPE=$($CXX -v 2>&1 | grep -o -E '\w+ version' | head -1 | awk '{ print $1 }') 61if [ "$CC_TYPE" != "$CXX_TYPE" ]; then 62 err "C compiler is $CC_TYPE but C++ compiler is $CXX_TYPE" 63 err "This may result in errors" 64fi 65 66LD_TYPE=$($LD --version 2>&1 | head -n1 | awk '{print $1, $2}') 67case "$LD_TYPE" in 68 "GNU ld"*) 69 LD_TYPE=bfd 70 ;; 71 "GNU gold"*) 72 LD_TYPE=gold 73 ;; 74 "LLD"*) 75 LD_TYPE=lld 76 ;; 77 *) 78 err "Unsupported linker: $LD" 79 exit 1 80esac 81 82CCAR="ar" 83if [ "$LTO" = "y" ]; then 84 if [ "$CC_TYPE" = "clang" ]; then 85 if [ "$LD_TYPE" != "gold" ]; then 86 err "Using LTO with clang requires the gold linker." 87 exit 1 88 fi 89 CCAR="llvm-ar" 90 else 91 CCAR="gcc-ar" 92 fi 93fi 94 95function set_default() { 96 echo "ifeq (\$(origin $1),default)" 97 echo "$1 = $2" 98 echo "endif" 99 echo "" 100} 101 102set_default CC $CC 103set_default CXX $CXX 104set_default LD $LD 105 106echo "CCAR=$CCAR" 107echo "CC_TYPE=$CC_TYPE" 108echo "LD_TYPE=$LD_TYPE" 109