-
Pietro Incardona authoredPietro Incardona authored
detect_gcc 9.11 KiB
#! /bin/bash
function haveProg() {
[ -x "$(command -v $1)" ]
}
function detect_compiler()
{
gpp_found=0
icpc_found=0
dgc_ret=0
if [ x"$CXX" != x"" -o x"$CC" != x"" -o x"$F77" != x"" -o x"$FC" != x"" ]; then
if [ x"$CXX" == x"" ]; then
CXX=g++
fi
if [ x"$CC" == x"" ]; then
CC=gcc
fi
if [ x"$FC" == x"" ]; then
FC=gfortran
fi
if [ x"$F77" == x"" ]; then
F77=gfortran
fi
echo -e "\033[1;34;5m ---------------------------------------------------------------------- \033[0m"
echo -e "\033[1;34;5m Selected compilers \033[0m"
echo -e "\033[1;34;5m ---------------------------------------------------------------------- \033[0m"
echo -e "\033[91;1m The user request to use specifics compilers to compile C/C++ or Fortran code \033[0m"
echo -e "\033[91;1m specifing one or more of these variables CXX/CC/F77/FC. When at least one is \033[0m"
echo -e "\033[91;1m defined the specified compiler will be used. \033[0m"
echo -e "\033[91;1m When not specified the system will use the default g++/gcc/gfortran/gfortran \033[0m"
echo -e "\033[91;1m The installer will use the following compilers \033[0m"
echo -e ""
echo -e "CXX=$CXX"
echo -e "CC=$CC"
echo -e "F77=$F77"
echo -e "FC=$FC"
dgc_ret=1
dgc_compiler=$CXX
return
fi
# First we try to understand if g++ command line is linked to clang
if haveProg g++; then
is_apple_llvm=no
prefix_search=""
g++ --version | grep "Apple LLVM" >/dev/null 2>&1
if [ $? == 0 ]; then
is_apple_llvm=yes
prefix_search="LLVM"
fi
g++ --version | grep "Apple clang" >/dev/null 2>&1
if [ $? == 0 ]; then
is_apple_llvm=yes
prefix_search="clang"
fi
if [ x"$is_apple_llvm" == x"yes" ]; then
echo "Apple LLVM based g++"
# we try the detect the version
major=$(g++ --version | grep $prefix_search | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\1/g')
# we check if the detection is garbage
echo "$major" | egrep -q '^[0-9]+$'
if [ $? == 0 ]; then
dgc_major=$(g++ --version | grep $prefix_search | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\1/g')
dgc_middle=$(g++ --version | grep $prefix_search | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\2/g')
dgc_minor=$(g++ --version | grep $prefix_search | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\3/g')
if [ $dgc_major -gt 6 ]; then
echo -e "clang++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=1
gpp_found=1
elif [ $dgc_major -lt 6 ]; then
echo -e "clang++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your Apple clang $dgc_major.$dgc_middle;$dgc_minor is too old, 6.1.0 or higher is required"
dgc_ret=0
gpp_found=0
elif [ $dgc_middle -gt 1 ]; then
echo -e "clang++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=1
gpp_found=1
elif [ $dgc_middle -lt 1 ]; then
echo -e "clang++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your Apple clang $dgc_major.$dgc_middle;$dgc_minor is too old, 6.1.0 or higher is required"
dgc_ret=0
gpp_found=0
else
echo -e "Apple clang++ version $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=1
gpp_found=1
fi
else
dgc_ret=2
fi
fi
g++ --version | grep "g++" > /dev/null 2>&1
if [ $? == 0 -a $gpp_found -ne 1 ]; then
dgc_major=$(g++ --version | grep g++ | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1/g')
dgc_middle=$(g++ --version | grep g++ | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\2/g')
dgc_minor=$(g++ --version | grep g++ | sed 's/.* \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\3/g')
if [ $dgc_major -gt 4 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=g++
dgc_ret=1
gpp_found=1
elif [ $dgc_major -lt 4 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your g++ version is too old, 4.8.2 at least required"
dgc_ret=0
gpp_found=0
elif [ $dgc_middle -gt 8 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=g++
dgc_ret=1
gpp_found=1
elif [ $dgc_middle -lt 8 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your g++ version is too old, 4.8.2 at least required"
dgc_ret=0
gpp_found=0
elif [ $dgc_minor -gt 1 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=g++
dgc_ret=1
gpp_found=1
else
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m FAILED \033[0m your g++ version is too old, 4.8.2 at least required"
dgc_ret=0
gpp_found=0
fi
fi
g++ --version | grep "clang" > /dev/null 2>&1
if [ $? == 0 -a $gpp_found -ne 1 ]; then
dgc_major=$(g++ --version | grep g++ | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1/g')
dgc_middle=$(g++ --version | grep g++ | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\2/g')
dgc_minor=$(g++ --version | grep g++ | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\3/g')
if [ $dgc_major -gt 3 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=1
gpp_found=1
elif [ $dgc_major -lt 3 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your clang version is too old 3.6.0 at least required"
dgc_ret=0
gpp_found=0
elif [ $dgc_middle -gt 6 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=1
gpp_found=1
elif [ $dgc_middle -lt 6 ]; then
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your clang version is too old 3.6.0 at least required"
dgc_ret=0
gpp_found=0
else
echo -e "g++ $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=clang++
dgc_ret=0
gpp_found=0
fi
fi
fi
if haveProg icpc; then
icpc --version | grep icpc > /dev/null 2>&1
if [ $? == 0 ]; then
dgc_major=$(icpc --version | grep icpc | sed 's/.*\([0-9][0-9]\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1/g')
dgc_middle=$(icpc --version | grep icpc | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\2/g')
dgc_minor=$(icpc --version | grep icpc | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\3/g')
if [ $dgc_major -gt 17 ]; then
echo -e "icpc $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=icpc
dgc_ret=1
icpc_found=1
elif [ $dgc_major -lt 17 ]; then
echo -e "icpc $dgc_major.$dgc_middle.$dgc_minor \033[91;5;1m FAILED \033[0m your icpc version is too old intel 17.0.X at least required"
dgc_ret=0
icpc_found=0
elif [ $dgc_middle -gt 0 ]; then
echo -e "icpc $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=icpc
dgc_ret=1
icpc_found=1
else
echo -e "icpc $dgc_major.$dgc_middle.$dgc_minor \033[92;1m SUCCESS \033[0m"
dgc_compiler=icpc
dgc_ret=1
icpc_found=1
fi
fi
fi
### If we detect more than one valid compiler ask to choose
if [ $icpc_found -eq 1 -a $gpp_found -eq 1 ]; then
echo "Two different valid compilers has been found please choose one"
commands[0]="icpc"
commands[1]="g++"
possible_solutions "${commands[@]}"
if [ x"$possible_solutions_command" == x"icpc" ]; then
CXX=icpc
CC=icc
F77=ifort
FC=ifort
dgc_compiler=icpc
else
CXX=g++
CC=gcc
F77=gfortran
FC=gfortran
fi
dgc_ret=1
elif [ $gpp_found -eq 1 ]; then
CXX=g++
CC=gcc
F77=gfortran
FC=gfortran
elif [ $icpc_found -eq 1 ]; then
CXX=icpc
CC=icc
F77=ifort
FC=ifort
dgc_compiler=icpc
else
echo "No compiler found"
fi
}