[systemd-devel] [RFC PATCH] Fix so install will work without 'ln --relative' support
Umut Tezduyar Lindskog
umut at tezduyar.com
Thu May 15 00:19:33 PDT 2014
Hi,
Please review the patch and let us know if anything needs to be
changed. It would be nice if we can get this in before 213.
Umut
On Wed, May 7, 2014 at 8:54 AM, Emil Sjölin <emil.sjolin at axis.com> wrote:
> 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
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel
More information about the systemd-devel
mailing list