162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Print the linker name and its version in a 5 or 6-digit form.
562306a36Sopenharmony_ci# Also, perform the minimum version check.
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciset -e
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci# Convert the version string x.y.z to a canonical 5 or 6-digit form.
1062306a36Sopenharmony_ciget_canonical_version()
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	IFS=.
1362306a36Sopenharmony_ci	set -- $1
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	# If the 2nd or 3rd field is missing, fill it with a zero.
1662306a36Sopenharmony_ci	#
1762306a36Sopenharmony_ci	# The 4th field, if present, is ignored.
1862306a36Sopenharmony_ci	# This occurs in development snapshots as in 2.35.1.20201116
1962306a36Sopenharmony_ci	echo $((10000 * $1 + 100 * ${2:-0} + ${3:-0}))
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciorig_args="$@"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci# Get the first line of the --version output.
2562306a36Sopenharmony_ciIFS='
2662306a36Sopenharmony_ci'
2762306a36Sopenharmony_ciset -- $(LC_ALL=C "$@" --version)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci# Split the line on spaces.
3062306a36Sopenharmony_ciIFS=' '
3162306a36Sopenharmony_ciset -- $1
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cimin_tool_version=$(dirname $0)/min-tool-version.sh
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ciif [ "$1" = GNU -a "$2" = ld ]; then
3662306a36Sopenharmony_ci	shift $(($# - 1))
3762306a36Sopenharmony_ci	version=$1
3862306a36Sopenharmony_ci	min_version=$($min_tool_version binutils)
3962306a36Sopenharmony_ci	name=BFD
4062306a36Sopenharmony_ci	disp_name="GNU ld"
4162306a36Sopenharmony_cielif [ "$1" = GNU -a "$2" = gold ]; then
4262306a36Sopenharmony_ci	echo "gold linker is not supported as it is not capable of linking the kernel proper." >&2
4362306a36Sopenharmony_ci	exit 1
4462306a36Sopenharmony_cielse
4562306a36Sopenharmony_ci	while [ $# -gt 1 -a "$1" != "LLD" ]; do
4662306a36Sopenharmony_ci		shift
4762306a36Sopenharmony_ci	done
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	if [ "$1" = LLD ]; then
5062306a36Sopenharmony_ci		version=$2
5162306a36Sopenharmony_ci		min_version=$($min_tool_version llvm)
5262306a36Sopenharmony_ci		name=LLD
5362306a36Sopenharmony_ci		disp_name=LLD
5462306a36Sopenharmony_ci	else
5562306a36Sopenharmony_ci		echo "$orig_args: unknown linker" >&2
5662306a36Sopenharmony_ci		exit 1
5762306a36Sopenharmony_ci	fi
5862306a36Sopenharmony_cifi
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci# Some distributions append a package release number, as in 2.34-4.fc32
6162306a36Sopenharmony_ci# Trim the hyphen and any characters that follow.
6262306a36Sopenharmony_civersion=${version%-*}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cicversion=$(get_canonical_version $version)
6562306a36Sopenharmony_cimin_cversion=$(get_canonical_version $min_version)
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciif [ "$cversion" -lt "$min_cversion" ]; then
6862306a36Sopenharmony_ci	echo >&2 "***"
6962306a36Sopenharmony_ci	echo >&2 "*** Linker is too old."
7062306a36Sopenharmony_ci	echo >&2 "***   Your $disp_name version:    $version"
7162306a36Sopenharmony_ci	echo >&2 "***   Minimum $disp_name version: $min_version"
7262306a36Sopenharmony_ci	echo >&2 "***"
7362306a36Sopenharmony_ci	exit 1
7462306a36Sopenharmony_cifi
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciecho $name $cversion
77