Fix the clang executable in CC, CPP and CXX variables to include
the version number, in order to prevent the PATH manipulations done
by llvm.eclass from overriding the compiler.  Otherwise, a package
requiring older LLVM libraries could cause an older compiler version
being used, effectively resulting in a system built by mixed set
of clang versions.

Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 eclass/llvm.eclass | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/eclass/llvm.eclass b/eclass/llvm.eclass
index 1effcc555905..39299d06dbe9 100644
--- a/eclass/llvm.eclass
+++ b/eclass/llvm.eclass
@@ -180,6 +180,40 @@ get_llvm_prefix() {
        die "No LLVM slot${1:+ <= ${1}} satisfying the package's dependencies 
found installed!"
 }
 
+# @FUNCTION: llvm_fix_clang_version
+# @USAGE: <variable-name>...
+# @DESCRIPTION:
+# Fix the clang compiler name in specified variables to include
+# the major version, to prevent PATH alterations from forcing an older
+# clang version being used.
+llvm_fix_clang_version() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       local shopt_save=$(shopt -p -o noglob)
+       set -f
+       local var
+       for var; do
+               local split=( ${!var} )
+               case ${split[0]} in
+                       *clang|*clang++|*clang-cpp)
+                               local version=()
+                               read -r -a version < <("${split[0]}" --version)
+                               local major=${version[-1]%%.*}
+                               if [[ -n ${major//[0-9]} ]]; then
+                                       die "${var}=${!var} produced invalid 
--version: ${version[*]}"
+                               fi
+
+                               split[0]+=-${major}
+                               if ! type -P "${split[0]}" &>/dev/null; then
+                                       die "${split[0]} does not seem to exist"
+                               fi
+                               declare -g "${var}=${split[*]}"
+                               ;;
+               esac
+       done
+       ${shopt_save}
+}
+
 # @FUNCTION: llvm_pkg_setup
 # @DESCRIPTION:
 # Prepend the appropriate executable directory for the newest
@@ -198,6 +232,8 @@ llvm_pkg_setup() {
        debug-print-function ${FUNCNAME} "${@}"
 
        if [[ ${MERGE_TYPE} != binary ]]; then
+               llvm_fix_clang_version CC CPP CXX
+
                local llvm_path=$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin
                local IFS=:
                local split_path=( ${PATH} )
-- 
2.38.0


Reply via email to