#----------------------------------*-sh-*--------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#------------------------------------------------------------------------------
#     Copyright (C) 2011-2016 OpenFOAM Foundation
#     Copyright (C) 2016-2024 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# File
#     etc/config.sh/compiler
#     - sourced by OpenFOAM-*/etc/config.sh/settings
#
# Description
#     Setup for custom compiler versions for OpenFOAM
#     Per-compiler overrides in "compiler-$WM_COMPILER" files
#
# Note
#     The default values for gcc/clang are not a recommendation,
#     but typically correspond to the minimum usable version.
#
#     I_MPI_CC, I_MPI_CXX environment variables may be defined for the
#     Intel mpicc/mpicxx wrappers
#
# Caveat
#     Not all compiler versions listed here are necessarily currently tested,
#     but can generally be expected to work.
#
#------------------------------------------------------------------------------

# Initial mpi/compiler associations
case "$WM_COMPILER" in
Icc*)
    export I_MPI_CC=icc
    export I_MPI_CXX=icpc
    ;;
Icx*)
    export I_MPI_CC=icx
    export I_MPI_CXX=icpx
    ;;
Gcc*)
    case "$WM_MPLIB" in
    INTELMPI*)
        export I_MPI_CC=gcc
        export I_MPI_CXX=g++
        ;;
    esac
    ;;
esac

#------------------------------------------------------------------------------

case "$WM_COMPILER_TYPE" in
ThirdParty)
    # Default/minimum versions (compiler, GMP, MPFR, MPC) - override as needed

    default_clang_version=llvm-5.0.2
    default_gcc_version=gcc-7.5.0

    default_gmp_version=gmp-system
    default_mpfr_version=mpfr-system
    default_mpc_version=mpc-system

    gmp_version="$default_gmp_version"
    mpfr_version="$default_mpfr_version"
    mpc_version="$default_mpc_version"

    # Clear any old values
    unset gcc_version clang_version

    case "$WM_COMPILER" in
    Gcc)    gcc_version="$default_gcc_version" ;;
    Gcc141*) gcc_version=gcc-14.1.0 ;;
    Gcc133*) gcc_version=gcc-13.3.0 ;;
    Gcc132*) gcc_version=gcc-13.2.0 ;;
    Gcc131*) gcc_version=gcc-13.1.0 ;;
    Gcc123*) gcc_version=gcc-12.3.0 ;;
    Gcc122*) gcc_version=gcc-12.2.0 ;;
    Gcc121*) gcc_version=gcc-12.1.0 ;;
    Gcc114*) gcc_version=gcc-11.4.0 ;;
    Gcc113*) gcc_version=gcc-11.3.0 ;;
    Gcc112*) gcc_version=gcc-11.2.0 ;;
    Gcc111*) gcc_version=gcc-11.1.0 ;;
    Gcc105*) gcc_version=gcc-10.5.0 ;;
    Gcc104*) gcc_version=gcc-10.4.0 ;;
    Gcc103*) gcc_version=gcc-10.3.0 ;;
    Gcc102*) gcc_version=gcc-10.2.0 ;;
    Gcc101*) gcc_version=gcc-10.1.0 ;;
    Gcc95*) gcc_version=gcc-9.5.0 ;;
    Gcc94*) gcc_version=gcc-9.4.0 ;;
    Gcc93*) gcc_version=gcc-9.3.0 ;;
    Gcc92*) gcc_version=gcc-9.2.0 ;;
    Gcc91*) gcc_version=gcc-9.1.0 ;;
    Gcc85*) gcc_version=gcc-8.5.0 ;;
    Gcc84*) gcc_version=gcc-8.4.0 ;;
    Gcc83*) gcc_version=gcc-8.3.0 ;;
    Gcc82*) gcc_version=gcc-8.2.0 ;;
    Gcc81*) gcc_version=gcc-8.1.0 ;;
    Gcc75*) gcc_version=gcc-7.5.0 ;;
    # Older : no assurance that they still work for OpenFOAM
    Gcc74*) gcc_version=gcc-7.4.0 ;;
    Gcc73*) gcc_version=gcc-7.3.0 ;;
    Gcc72*) gcc_version=gcc-7.2.0 ;;
    Gcc71*) gcc_version=gcc-7.1.0 ;;
    # Older GCC series that receive no further bugfixes
    Gcc65*) gcc_version=gcc-6.5.0 ;;
    Gcc64*) gcc_version=gcc-6.4.0 ;;
    Gcc63*) gcc_version=gcc-6.3.0 ;;
    Gcc62*) gcc_version=gcc-6.2.0 ;;
    Gcc61*) gcc_version=gcc-6.1.0 ;;
    Gcc55*) gcc_version=gcc-5.5.0 ;;
    #ancient# Gcc54*) gcc_version=gcc-5.4.0 ;;
    #ancient# Gcc53*) gcc_version=gcc-5.3.0 ;;
    #ancient# Gcc52*) gcc_version=gcc-5.2.0 ;;
    #ancient# Gcc51*) gcc_version=gcc-5.1.0 ;;
    #ancient# Gcc49*) gcc_version=gcc-4.9.4 ;;
    #ancient# Gcc48*) gcc_version=gcc-4.8.5 ;;

    Clang)    clang_version="$default_clang_version" ;;
    Clang181*) clang_version=llvm-18.1.6 ;;
    Clang170*) clang_version=llvm-17.0.6 ;;
    Clang160*) clang_version=llvm-16.0.6 ;;
    Clang150*) clang_version=llvm-15.0.7 ;;
    Clang140*) clang_version=llvm-14.0.6 ;;
    Clang130*) clang_version=llvm-13.0.1 ;;
    Clang120*) clang_version=llvm-12.0.1 ;;
    Clang111*) clang_version=llvm-11.1.0 ;;
    Clang110*) clang_version=llvm-11.0.1 ;;
    Clang100*) clang_version=llvm-10.0.1 ;;
    Clang90*) clang_version=llvm-9.0.1 ;;
    Clang80*) clang_version=llvm-8.0.1 ;;
    Clang71*) clang_version=llvm-7.1.0 ;;
    Clang70*) clang_version=llvm-7.0.1 ;;
    Clang60*) clang_version=llvm-6.0.1 ;;
    Clang50*) clang_version=llvm-5.0.2 ;;
    #ancient# Clang40*) clang_version=llvm-4.0.1 ;;
    #ancient# Clang39*) clang_version=llvm-3.9.1 ;;
    #ancient# Clang38*) clang_version=llvm-3.8.1 ;;
    #ancient# Clang37*) clang_version=llvm-3.7.1 ;;

    esac

    _foamEtc -config prefs.compiler             ## Optional adjustments
    _foamEtc -config "compiler-$WM_COMPILER"    ## Per-compiler override

    # Trap errors
    if [ -z "$gcc_version$clang_version" ]
    then
        /bin/cat << UNKNOWN_COMPILER 1>&2
===============================================================================
Warning in $WM_PROJECT_DIR/etc/config.sh/compiler:
Unknown ThirdParty compiler type/version - '$WM_COMPILER'

Please check your settings
===============================================================================
UNKNOWN_COMPILER
    fi
    ;;
esac

#------------------------------------------------------------------------------

unset default_gcc_version default_clang_version
unset default_gmp_version default_mpfr_version default_mpc_version

#------------------------------------------------------------------------------
