From: Jakub Jirutka <jakub@jirutka.cz>
Date: Tue, 23 Aug 2017 22:57:00 +0200
Subject: [PATCH] Patch niminst's (de)install to be usable for distributions

* Add support for DESTDIR variable (staged installs).
* Change paths to be FHS/Alpine compliant.
* Use "install" command instead of mkdir/cp/chmod.

+++ b/tools/niminst/install.tmpl
--- a/tools/niminst/install.tmpl
@@ -5,6 +5,8 @@
 
 set -e
 
+: ${DESTDIR:=}
+
 if [ $# -eq 1 ] ; then
 # if c.cat[fcUnixBin].len > 0:
   if test -f ?{c.cat[fcUnixBin][0].toUnix}
@@ -26,43 +28,47 @@
       echo "  <some other dir> (treated similar to '/opt')"
       echo "To deinstall, use the command:"
       echo "sh deinstall.sh DIR"
+      echo ""
+      echo "You may also use environment variable DESTDIR for staged installs"
+      echo "(DESTDIR is prepended to each install target file). Note that this"
+      echo "is added by Alpine Linux, it's not supported by standard niminst."
       exit 1
       ;;
     "/usr/bin")
-      bindir=/usr/bin
-      configdir=/etc
-      libdir=/usr/lib/?proj
-      docdir=/usr/share/?proj/doc
-      datadir=/usr/share/?proj/data
-      nimbleDir="/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
+      bindir="$DESTDIR/usr/bin"
+      configdir="$DESTDIR/etc"
+      libdir="$DESTDIR/usr/lib/?proj"
+      docdir="$DESTDIR/usr/share/doc/?proj"
+      datadir="$DESTDIR/usr/share/?proj/data"
+      nimbleDir="$DESTDIR/usr/share/nimble/pkgs/?c.nimblePkgName-?c.version"
       ;;
     "/usr/local/bin")
-      bindir=/usr/local/bin
-      configdir=/etc
-      libdir=/usr/local/lib/?proj
-      docdir=/usr/local/share/?proj/doc
-      datadir=/usr/local/share/?proj/data
-      nimbleDir="/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
+      bindir="$DESTDIR/usr/local/bin"
+      configdir="$DESTDIR/etc"
+      libdir="$DESTDIR/usr/local/lib/?proj"
+      docdir="$DESTDIR/usr/local/share/doc/?proj"
+      datadir="$DESTDIR/usr/local/share/?proj/data"
+      nimbleDir="$DESTDIR/usr/local/share/nimble/pkgs/?c.nimblePkgName-?c.version"
       ;;
     "/opt")
-      bindir="/opt/?proj/bin"
-      configdir="/opt/?proj/config"
-      libdir="/opt/?proj/lib"
-      docdir="/opt/?proj/doc"
-      datadir="/opt/?proj/data"
-      nimbleDir="/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
-      mkdir -p /opt/?proj
+      bindir="$DESTDIR/opt/?proj/bin"
+      configdir="$DESTDIR/opt/?proj/config"
+      libdir="$DESTDIR/opt/?proj/lib"
+      docdir="$DESTDIR/opt/?proj/doc"
+      datadir="$DESTDIR/opt/?proj/data"
+      nimbleDir="$DESTDIR/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
+      mkdir -p $DESTDIR/opt/?proj
       mkdir -p $bindir
       mkdir -p $configdir
       ;;
     *)
-      bindir="$1/?proj/bin"
-      configdir="$1/?proj/config"
-      libdir="$1/?proj/lib"
-      docdir="$1/?proj/doc"
-      datadir="$1/?proj/data"
-      nimbleDir="$1/?proj"
-      mkdir -p $1/?proj
+      bindir="$DESTDIR$1/?proj/bin"
+      configdir="$DESTDIR$1/?proj/config"
+      libdir="$DESTDIR$1/?proj/lib"
+      docdir="$DESTDIR$1/?proj/doc"
+      datadir="$DESTDIR$1/?proj/data"
+      nimbleDir="$DESTDIR$1/?proj"
+      mkdir -p $DESTDIR$1/?proj
       mkdir -p $bindir
       mkdir -p $configdir
       ;;
@@ -89,35 +95,28 @@
 #end for
 
 #for f in items(c.cat[fcUnixBin]):
-  cp ?f.toUnix $bindir/?f.skipRoot.toUnix
-  chmod 755 $bindir/?f.skipRoot.toUnix
+  install -D -m 755 ?f.toUnix $bindir/?f.skipRoot.toUnix
 #end for
 #for f in items(c.cat[fcConfig]):
-  cp ?f.toUnix $configdir/?f.skipRoot.toUnix
-  chmod 644 $configdir/?f.skipRoot.toUnix
+  install -D -m 755 ?f.toUnix $configdir/?f.skipRoot.toUnix
 #end for
 #for f in items(c.cat[fcData]):
   if [ -f ?f.toUnix ]; then
-    cp ?f.toUnix $datadir/?f.skipRoot.toUnix
-    chmod 644 $datadir/?f.skipRoot.toUnix
+    install -D -m 644 ?f.toUnix $datadir/?f.skipRoot.toUnix
   fi
 #end for
 #for f in items(c.cat[fcDoc]):
   if [ -f ?f.toUnix ]; then
-    cp ?f.toUnix $docdir/?f.skipRoot.toUnix
-    chmod 644 $docdir/?f.skipRoot.toUnix
+    install -D -m 644 ?f.toUnix $docdir/?f.skipRoot.toUnix
   fi
 #end for
 #for f in items(c.cat[fcLib]):
-  cp ?f.toUnix $libdir/?f.skipRoot.toUnix
-  chmod 644 $libdir/?f.skipRoot.toUnix
+  install -D -m 644 ?f.toUnix $libdir/?f.skipRoot.toUnix
 #end for
 #for f in items(c.cat[fcNimble]):
-  cp ?f.toUnix $nimbleDir/?f.toUnix
-  chmod 644 $nimbleDir/?f.toUnix
+  install -D -m 644 ?f.toUnix $nimbleDir/?f.toUnix
 #end for
-cp ?{c.nimblePkgName}.nimble $nimbleDir/?{c.nimblePkgName}.nimble
-chmod 644 $nimbleDir/?{c.nimblePkgName}.nimble
+install -D -m 644 ?{c.nimblePkgName}.nimble $nimbleDir/?{c.nimblePkgName}.nimble
 
   echo "installation successful"
 else
@@ -130,5 +129,9 @@
   echo "  <some other dir> (treated similar to '/opt')"
   echo "To deinstall, use the command:"
   echo "sh deinstall.sh DIR"
+  echo ""
+  echo "You may also use environment variable DESTDIR for staged installs"
+  echo "(DESTDIR is prepended to each install target file). Note that this"
+  echo "is added by Alpine Linux, it's not supported by standard niminst."
   exit 1
 fi
--- a/tools/niminst/deinstall.tmpl
+++ b/tools/niminst/deinstall.tmpl
@@ -19,17 +19,17 @@
       bindir=/usr/bin
       configdir=/etc
       libdir=/usr/lib/?proj
-      docdir=/usr/share/?proj/doc
+      docdir=/usr/share/doc/?proj
       datadir=/usr/share/?proj/data
-      nimbleDir="/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
+      nimbleDir="/usr/share/nimble/pkgs/?c.nimblePkgName-?c.version"
       ;;
     "/usr/local/bin")
       bindir=/usr/local/bin
       configdir=/etc
       libdir=/usr/local/lib/?proj
-      docdir=/usr/local/share/?proj/doc
+      docdir=/usr/local/share/doc/?proj
       datadir=/usr/local/share/?proj/data
-      nimbleDir="/opt/nimble/pkgs/?c.nimblePkgName-?c.version"
+      nimbleDir="/usr/share/nimble/pkgs/?c.nimblePkgName-?c.version"
       ;;
     "/opt")
       bindir="/opt/?proj/bin"
