From 1fa09312860cdee342a0afc9423c9d3c411bbbae Mon Sep 17 00:00:00 2001 From: Carlos Santos Date: Mon, 16 Sep 2019 22:22:37 -0300 Subject: [PATCH] install: support old ln versions without the -r option Oldish enterprise-class Linux distributions have outdated versions of coreutils whose ln command do not support the -r option. Also non-Linux systems like FreeBSD don't support that option. Use a shell script that mimics the missing functionality. The script creates minimalist relative paths, like ln -r does, but in order to simplify the logic, it requires that the arguments be absolute paths and do not end with '/'. This is enough for our purposes. Add configuration logic to detect if ln supports the -r option, based on the logic used by Autoconf to check if ln supports the -s option. Signed-off-by: Carlos Santos --- Makefile.am | 6 ++-- configure.ac | 2 ++ ln-srf | 49 ++++++++++++++++++++++++++ m4/ac_ln_srf.m4 | 91 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 3 deletions(-) create mode 100755 ln-srf create mode 100644 m4/ac_ln_srf.m4 diff --git a/Makefile.am b/Makefile.am index 76b81de5b..beb2882e3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -988,11 +988,11 @@ install-exec-hook: $(INSTALL) -d -m 755 $(DESTDIR)$(pkgfilterdir) $(INSTALL) -d -m 755 $(DESTDIR)$(pkgbackenddir) if ENABLE_FOOMATIC - $(LN_S) -r -f $(DESTDIR)$(pkgfilterdir)/foomatic-rip $(DESTDIR)$(bindir) + $(LN_SRF) $(DESTDIR)$(pkgfilterdir)/foomatic-rip $(DESTDIR)$(bindir) endif if ENABLE_DRIVERLESS - $(LN_S) -r -f $(DESTDIR)$(pkgppdgendir)/driverless $(DESTDIR)$(bindir) - $(LN_S) -r -f $(DESTDIR)$(pkgppdgendir)/driverless $(DESTDIR)$(pkgbackenddir) + $(LN_SRF) $(DESTDIR)$(pkgppdgendir)/driverless $(DESTDIR)$(bindir) + $(LN_SRF) $(DESTDIR)$(pkgppdgendir)/driverless $(DESTDIR)$(pkgbackenddir) endif if ENABLE_BRAILLE $(LN_S) -f imagetobrf $(DESTDIR)$(pkgfilterdir)/imagetoubrl diff --git a/configure.ac b/configure.ac index d5a539b6e..fbcf829a8 100644 --- a/configure.ac +++ b/configure.ac @@ -58,6 +58,8 @@ AM_ICONV AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S +AS_LN_SRF_PREPARE +AC_PROG_LN_SRF AC_PROG_MAKE_SET AC_PROG_LIBTOOL PKG_PROG_PKG_CONFIG([0.20]) diff --git a/ln-srf b/ln-srf new file mode 100755 index 000000000..f395a7602 --- /dev/null +++ b/ln-srf @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Author: Carlos Santos +# This file is in public domain. +# + +error() { + echo "$@" 1>&2 + exit 1 +} + +src="$1" +dst="$2" + +check_path() { + case "$2" in + */../*|*/./*|*/.|*/..) error "$1 path '$2' must be absolute";; + */) error "$1 path '$2' must not end with '/'";; + /?*) ;; + *) error "$1 path '$2' must start with '/'";; + esac +} + +check_path "source" "$src" +check_path "destination" "$dst" + +# strip leading '/' +src=${src#/*} +tmp=${dst#/*} + +s_prefix=${src%%/*} +d_prefix=${tmp%%/*} + +# strip leading common +while [ "$s_prefix" = "$d_prefix" ]; do + src="${src#$s_prefix/}" + tmp="${tmp#$d_prefix/}" + s_prefix=${src%%/*} + d_prefix=${tmp%%/*} +done + +s_prefix="../" +while [ -n "$d_prefix" ] && [ "$tmp" != "$d_prefix" ]; do + s_prefix="../$s_prefix" + tmp="${tmp#$d_prefix/}" + d_prefix=${tmp%%/*} +done + +ln -s -f "$s_prefix$src" "$dst" diff --git a/m4/ac_ln_srf.m4 b/m4/ac_ln_srf.m4 new file mode 100644 index 000000000..03191400e --- /dev/null +++ b/m4/ac_ln_srf.m4 @@ -0,0 +1,91 @@ +# Adapted from Autoconf Version 2.63 (GPLv2). +# +# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception, the Free Software Foundation gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf. You need not follow the terms of the GNU +# General Public License when using or distributing such scripts, even +# though portions of the text of Autoconf appear in them. The GNU +# General Public License (GPL) does govern all other use of the material +# that constitutes the Autoconf program. +# +# Certain portions of the Autoconf source text are designed to be copied +# (in certain cases, depending on the input) into the output of +# Autoconf. We call these the "data" portions. The rest of the Autoconf +# source text consists of comments plus executable code that decides which +# of the data portions to output in any given case. We call these +# comments and executable code the "non-data" portions. Autoconf never +# copies any of the non-data portions into its output. +# +# This special exception to the GPL applies to versions of Autoconf +# released by the Free Software Foundation. When you make and +# distribute a modified version of Autoconf, you may extend this special +# exception to the GPL to apply to your modified version as well, *unless* +# your modified version has the potential to copy into its output some +# of the text that was the non-data portion of the version that you started +# with. (In other words, unless your change moves or copies text from +# the non-data portions to the data portions.) If your modification has +# such potential, you must delete any notice of this special exception +# to the GPL from your modified version. + +# AS_LN_SRF_PREPARE +# ------------------------------------ +m4_defun([AS_LN_SRF_PREPARE], +[rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s -r conf$$.file conf$$ 2>/dev/null; then + as_ln_srf='ln -s -r' + elif ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_srf='./ln-srf' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pRf'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_srf='cp -pRf' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_srf=ln + else + as_ln_srf='cp -pRf' + fi +else + as_ln_srf='cp -pRf' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null +])# AS_LN_SRF_PREPARE + +# AC_PROG_LN_SRF +# -------------------------------- +AC_DEFUN([AC_PROG_LN_SRF], +[AC_MSG_CHECKING([whether ln -s -r works]) +AC_SUBST([LN_SRF], [$as_ln_srf])dnl +if test "$LN_SRF" = "ln -s -r"; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no, using $LN_SRF]) +fi +])# AC_PROG_LN_SRF -- 2.47.2