#!/usr/bin/env bash # Intel MKL is now freely available even for commercial use. This script # attempts to install the MKL package automatically from Intel's repository. # # For manual repository setup instructions, see: # https://software.intel.com/articles/installing-intel-free-libs-and-python-yum-repo # https://software.intel.com/articles/installing-intel-free-libs-and-python-apt-repo # # For other package managers, or non-Linux platforms, see: # https://software.intel.com/mkl/choose-download set -o pipefail default_package=intel-mkl-64bit-2020.0-088 yum_repo='https://yum.repos.intel.com/mkl/setup/intel-mkl.repo' apt_repo='https://apt.repos.intel.com/mkl' intel_key_url='https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB' Usage () { cat >&2 <] Checks if MKL is present on the system, and/or attempts to install it. If is not provided, ${default_package} will be installed. Intel packages are installed under the /opt/intel directory. You should be root to install MKL into this directory; run this script using the sudo command. Options: -s - Skip check for MKL being already present. -p -- Force type of package management. Use only if automatic detection fails, as instructed. -h - Show this message. Environment: CC The C compiler to use for MKL check. If not set, uses 'cc'. EOF exit 2 } Fatal () { echo "$0: $@"; exit 1; } Have () { type -t "$1" >/dev/null; } # Option values. skip_cc= distro= while getopts ":hksp:" opt; do case ${opt} in h) Usage ;; s) skip_cc=yes ;; p) case $OPTARG in suse|redhat|debian|fedora|arch) distro=$OPTARG ;; *) Fatal "invalid value -p '${OPTARG}'. " \ "Allowed: 'suse', 'redhat', 'debian', 'fedora', or 'arch'." esac ;; \?) echo >&2 "$0: invalid option -${OPTARG}."; Usage ;; esac done shift $((OPTIND-1)) orig_arg_package=${1-''} package=${1:-$default_package} # Check that we are actually on Linux, otherwise give a helpful reference. [[ $(uname) == Linux ]] || Fatal "\ This script can be used on Linux only, and your system is $(uname). Installer packages for Mac and Windows are available for download from Intel: https://software.intel.com/mkl/choose-download" # Test if MKL is already installed on the system. if [[ ! $skip_cc ]]; then : ${CC:=cc} Have "$CC" || Fatal "\ C compiler $CC not found. You can skip the check for MKL presence by invoking this script with the '-s' option to this script, but you will need a functional compiler anyway, so we recommend that you install it first." mkl_version=$($CC -E -I /opt/intel/mkl/include - <<< \ '#include __INTEL_MKL__.__INTEL_MKL_MINOR__.__INTEL_MKL_UPDATE__' 2>/dev/null | tail -n 1 ) || mkl_version= mkl_version=${mkl_version// /} [[ $mkl_version ]] && Fatal "\ MKL version $mkl_version is already installed. You can skip the check for MKL presence by invoking this script with the '-s' option and proceed with automated installation, but we highly discourage this. This script will register Intel repositories with your system, and it seems that they have been already registered, or MKL has been installed some other way. You should use your package manager to check which MKL package is already installed. Note that Intel packages register the latest installed version of the library as the default. If your installed version is older than $package, it makes sense to upgrade." fi # Try to determine which package manager the distro uses, unless overridden. if [[ ! $distro ]]; then dist_vars=$(cat /etc/os-release 2>/dev/null) eval "$dist_vars" for rune in $CPE_NAME $ID $ID_LIKE; do case "$rune" in cpe:/o:fedoraproject:fedora:2[01]) distro=redhat; break;; # Use yum. rhel|centos) distro=redhat; break;; redhat|suse|fedora|debian|arch) distro=$rune; break;; esac done # Certain old distributions do not have /etc/os-release. We are unlikely to # encounter these in the wild, but just in case. # NOTE: Do not try to guess Fedora specifically here! Fedora 20 and below # detect as redhat, and this is good, because they use yum by default. [[ ! $distro && -f /etc/redhat-release ]] && distro=redhat [[ ! $distro && -f /etc/SuSE-release ]] && distro=suse [[ ! $distro && -f /etc/debian_release ]] && distro=debian [[ ! $distro && -f /etc/arch-release ]] && distro=arch [[ ! $distro ]] && Fatal "\ Unable to determine package management style. Invoke this script with the option '-p