public inbox for gentoo-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-dev] [PATCH 1/2] llvm.eclass: Fix CC/CXX version to prevent the eclass overriding it
@ 2022-10-16 17:08 Michał Górny
  2022-10-16 17:08 ` [gentoo-dev] [PATCH 2/2] llvm.org.eclass: Fix LLVM tool paths to prevent overriding them Michał Górny
  0 siblings, 1 reply; 2+ messages in thread
From: Michał Górny @ 2022-10-16 17:08 UTC (permalink / raw
  To: gentoo-dev; +Cc: Michał Górny

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 <mgorny@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



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [gentoo-dev] [PATCH 2/2] llvm.org.eclass: Fix LLVM tool paths to prevent overriding them
  2022-10-16 17:08 [gentoo-dev] [PATCH 1/2] llvm.eclass: Fix CC/CXX version to prevent the eclass overriding it Michał Górny
@ 2022-10-16 17:08 ` Michał Górny
  0 siblings, 0 replies; 2+ messages in thread
From: Michał Górny @ 2022-10-16 17:08 UTC (permalink / raw
  To: gentoo-dev; +Cc: Michał Górny

Fix the LLVM tool path in variables such as AR, LD, etc. to their
current locations prior to manipulating PATH, in order to prevent
llvm.eclass from overriding them.  Otherwise, a package requiring older
LLVM libraries could force older tool versions, possibly incompatible
with the object files produced by a newer clang version.

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

diff --git a/eclass/llvm.eclass b/eclass/llvm.eclass
index 39299d06dbe9..16596ec2ea66 100644
--- a/eclass/llvm.eclass
+++ b/eclass/llvm.eclass
@@ -214,6 +214,30 @@ llvm_fix_clang_version() {
 	${shopt_save}
 }
 
+# @FUNCTION: llvm_fix_tool_path
+# @USAGE: <variable-name>...
+# @DESCRIPTION:
+# Fix the LLVM tools referenced in the specified variables to their
+# current location, to prevent PATH alterations from forcing older
+# versions being used.
+llvm_fix_tool_path() {
+	debug-print-function ${FUNCNAME} "${@}"
+
+	local shopt_save=$(shopt -p -o noglob)
+	set -f
+	local var
+	for var; do
+		local split=( ${!var} )
+		local path=$(type -P ${split[0]} 2>/dev/null)
+		# if it resides in one of the LLVM prefixes, it's an LLVM tool!
+		if [[ ${path} == "${BROOT}/usr/lib/llvm"* ]]; then
+			split[0]=${path}
+			declare -g "${var}=${split[*]}"
+		fi
+	done
+	${shopt_save}
+}
+
 # @FUNCTION: llvm_pkg_setup
 # @DESCRIPTION:
 # Prepend the appropriate executable directory for the newest
@@ -233,6 +257,9 @@ llvm_pkg_setup() {
 
 	if [[ ${MERGE_TYPE} != binary ]]; then
 		llvm_fix_clang_version CC CPP CXX
+		# keep in sync with profiles/features/llvm/make.defaults!
+		llvm_fix_tool_path ADDR2LINE AR AS LD NM OBJCOPY OBJDUMP RANLIB
+		llvm_fix_tool_path READELF STRINGS STRIP
 
 		local llvm_path=$(get_llvm_prefix "${LLVM_MAX_SLOT}")/bin
 		local IFS=:
-- 
2.38.0



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-10-16 17:08 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-16 17:08 [gentoo-dev] [PATCH 1/2] llvm.eclass: Fix CC/CXX version to prevent the eclass overriding it Michał Górny
2022-10-16 17:08 ` [gentoo-dev] [PATCH 2/2] llvm.org.eclass: Fix LLVM tool paths to prevent overriding them Michał Górny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox