[systemd-devel] [RFC PATCH] Fix so install will work without 'ln --relative' support

Emil Sjölin emil.sjolin at axis.com
Tue May 6 23:54:31 PDT 2014


This fix makes sure that the package installation will work
on systems using versions of 'GNU coreutils' older than 8.16.

Please see tools/lnr.sh for limitations for this fix.
---
 configure.ac |   16 ++++++++++
 tools/lnr.sh |   93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+)
 create mode 100755 tools/lnr.sh

diff --git a/configure.ac b/configure.ac
index ead697b..399a52f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -315,6 +315,22 @@ fi
 AM_CONDITIONAL(ENABLE_COVERAGE, [test "$have_coverage" = "yes"])
 
 # ------------------------------------------------------------------------------
+ln_relative_support=yes
+AC_CHECK_PROG(ln_found, [ln], [yes], [no])
+if test "x$ln_found" = xno ; then
+        AC_MSG_ERROR([*** ln support requested but the program was not found])
+else
+        ln_version_major="`ln --version | head -1 | cut -d ' ' -f 4 | cut -d '.' -f 1`"
+        ln_version_minor="`ln --version | head -1 | cut -d ' ' -f 4 | cut -d '.' -f 2`"
+        if test "$ln_version_major" -lt 8 || test "$ln_version_major" -eq 8 -a "$ln_version_minor" -lt 16; then
+                ln_relative_support=no
+        fi
+        if test "x$ln_relative_support" = "xno"; then
+                LN_S=$(echo "$LN_S" | sed s:"ln":""$srcdir"\/tools\/lnr.sh":)
+        fi
+fi
+
+# ------------------------------------------------------------------------------
 have_kmod=no
 AC_ARG_ENABLE(kmod, AS_HELP_STRING([--disable-kmod], [disable loadable modules support]))
 if test "x$enable_kmod" != "xno"; then
diff --git a/tools/lnr.sh b/tools/lnr.sh
new file mode 100755
index 0000000..74e1644
--- /dev/null
+++ b/tools/lnr.sh
@@ -0,0 +1,93 @@
+# This script makes the 'ln --relative' command work as expected on a system where the
+# 'relative' option of 'ln' is not supported.
+#
+# NOTE:
+# The script assumes that the 'relative' option of 'ln' is used with any
+# of the following syntaxes:
+# '--relative'
+# '-r'
+#
+# The script will NOT handle combined options e.g. '-rf', '-ir' etc.
+# The script will also only handle the 1st form of the 'ln' command (see man page
+# for the 'ln' command for the different forms).
+#
+
+
+relative_file() {
+	# Calculate the relative path from $1 to $2.
+	# $1 and $2 are files (including paths).
+
+	source=$(dirname $1)
+	target=$(dirname $2)
+
+	# Make the paths absolute
+	[ "${source#/}" != "$source" ] || source="$(pwd)/$source"
+	[ "${target#/}" != "$target" ] || target="$(pwd)/$target"
+
+	common_part=$source
+	result=""
+
+	while [ "${target#$common_part}" = "${target}" ]; do
+		# No match, means that the candidate common part is not correct
+		# Go up one level (reduce common part)
+		common_part="$(dirname $common_part)"
+		# and record that we went back, with correct / handling
+		if [ -z "$result" ]; then
+			result=".."
+		else
+			result="../$result"
+		fi
+	done
+
+	if [ "$common_part" = / ]; then
+		# Special case for root (no common path)
+		result="$result/"
+	fi
+
+	# Since we now have identified the common part,compute the non-common
+	# part
+	forward_part="${target#$common_part}"
+
+	# And now stick all parts together
+	result="$result$forward_part"
+	result="${result%/}"
+	result="$result/$(basename $2)"
+	result="${result#/}"
+
+	echo "$result"
+}
+
+
+# "relative" options
+relop_1="--relative"
+relop_2="-r"
+
+# indicates if the "relative" option is used
+relative_option=no
+
+# the "new" command line
+new_cmd=ln
+
+while [ $# -gt 2 ]; do
+	string="$1"
+	if [ "${string#-*}" != "$string" ]; then
+		# argument is an option
+		if [ "$string" = "$relop_1" ] || [ "$string" = "$relop_2" ]; then
+			relative_option=yes
+		else
+			# add option to new command line
+			new_cmd=""$new_cmd" "$string""
+		fi
+	fi
+	shift
+done
+
+if [ "$relative_option" = yes ]; then
+	new_cmd=""$new_cmd" $(relative_file "$2" "$1") "$2""
+else
+	new_cmd=""$new_cmd" "$1" "$2""
+fi
+
+eval "$new_cmd"
+
+exit 0
-- 
1.7.10.4



More information about the systemd-devel mailing list