#! /bin/bash function gpp_clang() { if [ x"$dgc_compiler" == x"g++" ]; then CXX=g++ CC=gcc F77=gfortran FC=gfortran else CXX=clang++ CC=clang F77=gfortran FC=gfortran fi } 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 g++ --version | grep "Apple LLVM" if [ $? == 0 ]; then echo "Apple LLVM based g++" echo "Apple LLVM based g++" # we try the detect the version major=$(g++ --version | grep LLVM | 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 LLVM | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\1/g') dgc_middle=$(g++ --version | grep LLVM | sed 's/.*\([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\).*(clang.*/\2/g') dgc_minor=$(g++ --version | grep LLVM | 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++ if [ $? == 0 -a x"g++" == x"g++" ]; 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 g++ if [ $? == 0 -a x"g++" == x"clang" ]; 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 icpc --version | grep icpc if [ $? == 0 -a x"icpc" == x"icpc" ]; 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 16.0.2 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 ### 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 gpp_clang fi dgc_ret=1 elif [ $gpp_found -eq 1 ]; then gpp_clang elif [ $icpc_found -eq 1 ]; then CXX=icpc CC=icc F77=ifort FC=ifort dgc_compiler=icpc else echo "No compiler found" fi }