summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-11-19 22:59:35 -0500
committerZubin Duggal <zubin.duggal@gmail.com>2021-12-16 16:21:09 +0530
commit22d03fca1e16f533ae6902f4b5e42cc0efdcbc4e (patch)
tree256e397f60c45edc54be7d4d4539707b3008179f
parentabe22fe186afba8b2009e02b77fbb9deed1e42a7 (diff)
downloadhaskell-wip/ghc-9.0-ci-test.tar.gz
hadrian: Don't rely on realpath in bindist Makefilewip/ghc-9.0-ci-test
As noted in #19963, `realpath` is not specified by POSIX and therefore cannot be assumed to be available. Here we provide a POSIX shell implementation of `realpath`, due to Julian Ospald and others. Closes #19963. (cherry picked from commit fab2579e63bb317d4c266d7b949cf96ad6e5d17b)
-rw-r--r--hadrian/bindist/Makefile2
-rw-r--r--hadrian/src/Rules/BinaryDist.hs7
-rwxr-xr-xmk/relpath.sh53
3 files changed, 58 insertions, 4 deletions
diff --git a/hadrian/bindist/Makefile b/hadrian/bindist/Makefile
index 214bcdf3c3..5a2049789f 100644
--- a/hadrian/bindist/Makefile
+++ b/hadrian/bindist/Makefile
@@ -209,7 +209,7 @@ update_package_db: install_bin install_lib
@echo "$(PKG_CONFS)"
@echo "Updating the package DB"
$(foreach p, $(PKG_CONFS),\
- $(call patchpackageconf,$(shell echo $(notdir $p) | sed 's/-\([0-9]*[0-9]\.\)*conf//g'),$(shell echo "$p" | sed 's:xxx: :g'),$(docdir),$(shell realpath --relative-to="$(ActualLibsDir)" "$(docdir)")))
+ $(call patchpackageconf,$(shell echo $(notdir $p) | sed 's/-\([0-9]*[0-9]\.\)*conf//g'),$(shell echo "$p" | sed 's:xxx: :g'),$(docdir),$(shell mk/relpath.sh "$(ActualLibsDir)" "$(docdir)")))
'$(WrapperBinsDir)/$(CrossCompilePrefix)ghc-pkg' recache
install_mingw:
diff --git a/hadrian/src/Rules/BinaryDist.hs b/hadrian/src/Rules/BinaryDist.hs
index c86d42d8f0..914039d9e8 100644
--- a/hadrian/src/Rules/BinaryDist.hs
+++ b/hadrian/src/Rules/BinaryDist.hs
@@ -337,9 +337,10 @@ compressorExtension Bzip2 = "bz2"
-- @./configure [...] && make install@ workflow.
bindistInstallFiles :: [FilePath]
bindistInstallFiles =
- [ "config.sub", "config.guess", "install-sh", "mk" -/- "config.mk.in"
- , "mk" -/- "install.mk.in", "mk" -/- "project.mk", "README"
- , "INSTALL" ]
+ [ "config.sub", "config.guess", "install-sh"
+ , "mk" -/- "config.mk.in", "mk" -/- "install.mk.in", "mk" -/- "project.mk"
+ , "mk" -/- "relpath.sh"
+ , "README", "INSTALL" ]
-- | This auxiliary function gives us a top-level 'Filepath' that we can 'need'
-- for all libraries and programs that are needed for a complete build.
diff --git a/mk/relpath.sh b/mk/relpath.sh
new file mode 100755
index 0000000000..c2f82f430b
--- /dev/null
+++ b/mk/relpath.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# POSIX shell implementation of `realpath --relative-to=$1 $2.
+# This is an adaptation of the implementation from
+# <https://github.com/Offirmo/offirmo-shell-lib>.
+
+# returns relative path to $2=$target from $1=$source
+## NOTE : path are compared in text only. They don’t have to exist
+## and they WONT be normalized/escaped
+## Result in "$return_value"# both $1 and $2 are absolute paths beginning with /
+
+src="$1"
+target="$2"
+
+common_part="$src"
+result=""
+
+while test "${target#$common_part}" = "${target}" ; do
+ #echo "common_part is now : \"$common_part\""
+ #echo "result is now : \"$result\""
+ #echo "target#common_part : \"${target#$common_part}\""
+ # no match, means that candidate common part is not correct
+ # go up one level (reduce common part)
+ common_part="$(dirname "$common_part")"
+ # and record that we went back
+ if test -z "$result" ; then
+ result=".."
+ else
+ result="../$result"
+ fi
+done
+
+#echo "common_part is : \"$common_part\""
+
+if test "$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}"
+#echo "forward_part = \"$forward_part\""
+
+if test -n "$result" && test -n "$forward_part" ; then
+ #echo "(simple concat)"
+ result="$result$forward_part"
+elif test -n "$forward_part" ; then
+ #echo "(concat with slash removal)"
+ result="$(printf "%s" "$forward_part" | cut -c 1-)"
+fi
+
+printf "%s" "$result"