From 09840874c3af449032a07cac56e23a78d7e3a666 Mon Sep 17 00:00:00 2001 From: Mohammad Akhlaghi Date: Sat, 8 Aug 2020 22:48:53 +0100 Subject: Software tarballs saved as symlinks if already in filesystem Until now, if the software source tarballs already existed on the system they would be copied inside the project. However, the software source tarballs are sometimes/mostly larger than their actual product and can consume significant space (~375 MB in the core branch!). With this commit, when the software are present on the system, their symbolic link will be placed in 'BDIR/software/tarballs', not a full copy. Also, because the tarballs in software tarball directory may themselves be links, we use 'realpath' to find the final place of the actual file and link to that location. Therefore if 'realpath' can't be found (prior to installing Coreutils in Maneage), we will copy the tarballs from the given software tarball directory. After Maneage has installed Coreutils, the project's own 'realpath' will be used. Of course, if the software are downloaded, their full downloaded copy will be kept in 'BDIR/software/tarballs', nothing has changed in the downloading scenario. --- reproduce/software/make/build-rules.mk | 9 +++++++-- reproduce/software/shell/pre-make-build.sh | 14 +++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/reproduce/software/make/build-rules.mk b/reproduce/software/make/build-rules.mk index 86370ab..d50c301 100644 --- a/reproduce/software/make/build-rules.mk +++ b/reproduce/software/make/build-rules.mk @@ -44,7 +44,12 @@ import-source = final=$(tdir)/$$tarball; \ unchecked="$$final.unchecked"; \ rm -f "$$unchecked"; \ if [ -f $(DEPENDENCIES-DIR)/$$tarball ]; then \ - cp $(DEPENDENCIES-DIR)/$$tarball "$$unchecked"; \ + if type realpath > /dev/null 2> /dev/null; then \ + ln -sf "$$(realpath $(DEPENDENCIES-DIR)/$$tarball)" \ + "$$unchecked"; \ + else \ + cp $(DEPENDENCIES-DIR)/$$tarball "$$unchecked"; \ + fi; \ else \ if [ x"$$url" = x ]; then \ bservers="$(backupservers)"; \ @@ -70,7 +75,7 @@ import-source = final=$(tdir)/$$tarball; \ if [ x"$$checksum" = x"$$exp_checksum" ]; then \ mv "$$unchecked" "$$final"; \ else \ - echo "ERROR: Non-matching checksum for '$$tarball'."; \ + echo "ERROR: Non-matching checksum: $$tarball"; \ echo "Checksum should be: $$exp_checksum"; \ echo "Checksum is: $$checksum"; \ exit 1; \ diff --git a/reproduce/software/shell/pre-make-build.sh b/reproduce/software/shell/pre-make-build.sh index 05a4143..9188fc9 100755 --- a/reproduce/software/shell/pre-make-build.sh +++ b/reproduce/software/shell/pre-make-build.sh @@ -104,9 +104,17 @@ download_tarball() { tarballurl=$url/$tarball fi - # See if it is in the input software directory. + # See if it is in the input-software directory, if so, make a link, if + # not copy it. The only issue is that the file in the input-software + # directory may actually be a link itself. So to avoid complications + # with many links, we'll use 'realpath' (if it exists) to parse the + # link and link to an actual file. if [ -f "$ddir/$tarball" ]; then - cp $ddir/$tarball $ucname + if type realpath > /dev/null 2> /dev/null; then + ln -sf "$(realpath $ddir/$tarball)" "$ucname" + else + cp $ddir/$tarball $ucname + fi else $downloadwrapper "$downloader" nolock $tarballurl $ucname \ "$bservers" @@ -118,7 +126,7 @@ download_tarball() { expectedchecksum=$(awk '/^'$progname'-checksum/{print $3}' $checksumsfile) if [ x$checksum = x$expectedchecksum ]; then mv "$ucname" "$maneagetar" else - echo "ERROR: Non-matching checksum for '$tarball'." + echo "ERROR: Non-matching checksum: $tarball" echo "Checksum should be: $expectedchecksum" echo "Checksum is: $checksum" exit 1 -- cgit v1.2.1