Skip to content
Snippets Groups Projects
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
}