aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormerakor <cem@ckyln.com>2020-12-27 13:51:37 +0000
committermerakor <cem@ckyln.com>2020-12-27 13:51:37 +0000
commit0ffdfa53151ab7844edcff52d361bc9f137c4654 (patch)
tree18359249f76b7c6963dbb529ed87af476a8f0793
parent05b0ba223335dfa01eefcd46f0498e6a93517048 (diff)
downloadcpt-0ffdfa53151ab7844edcff52d361bc9f137c4654.tar.gz
tools: add install.sh
FossilOrigin-Name: ba9f9fd3cd76c916c02529ef75189536fe0e3f35e0af65b2c22a268b19878d42
-rw-r--r--install.do20
-rwxr-xr-xtools/install.sh90
2 files changed, 96 insertions, 14 deletions
diff --git a/install.do b/install.do
index ae82131..dcab154 100644
--- a/install.do
+++ b/install.do
@@ -1,25 +1,17 @@
. ./config.rc
redo all
+PHONY
+
+INSTALLSH=./tools/install.sh
# Install executables.
-mkdir -p "${DESTDIR}${BINDIR}"
-getbin | while read -r file; do
- cp "$file" "${DESTDIR}${BINDIR}/${file##*/}"
- chmod 755 "${DESTDIR}${BINDIR}/${file##*/}"
-done
+"$INSTALLSH" -Dm755 -t "$DESTDIR$BINDIR" $(getbin)
# Install manual pages.
-mkdir -p "${DESTDIR}${MAN1}"
-for man in man/*.1; do
- cp "$man" "${DESTDIR}${MAN1}/${man##*/}"
- chmod 644 "${DESTDIR}${MAN1}/${man##*/}"
-done
+"$INSTALLSH" -Dm644 -t "$DESTDIR$MAN1" man/*.1
# Install the documentation info page.
# We don't want to bother if the info page wasn't created, just exit without an
# error.
[ -f docs/cpt.info ] || exit 0
-
-mkdir -p "${DESTDIR}${INFODIR}"
-cp docs/cpt.info "${DESTDIR}${INFODIR}/cpt.info"
-chmod 644 "${DESTDIR}${INFODIR}/cpt.info"
+"$INSTALLSH" -Dm644 docs/cpt.info "$DESTDIR$INFODIR/cpt.info"
diff --git a/tools/install.sh b/tools/install.sh
new file mode 100755
index 0000000..f79cb3b
--- /dev/null
+++ b/tools/install.sh
@@ -0,0 +1,90 @@
+#!/bin/sh -e
+# Portable install version that supports -D -m and -t
+usage() {
+ printf '%s\n' "usage: $0 [-D] [-m mode] source dest" \
+ " or: $0 [-D] [-m mode] [-t dir] [source...]" >&2
+ exit 1
+}
+
+die() { printf '%s\n' "$@" >&2; exit 1;}
+
+mkdirp=''
+target=''
+mode=''
+REST=''
+parse() {
+ OPTIND=$(($#+1))
+ while OPTARG= && [ $# -gt 0 ]; do
+ case $1 in
+ -[tm]?*) OPTARG=$1; shift
+ eval 'set -- "${OPTARG%"${OPTARG#??}"}" "${OPTARG#??}"' ${1+'"$@"'}
+ ;;
+ -[!-]?*) OPTARG=$1; shift
+ eval 'set -- "${OPTARG%"${OPTARG#??}"}" -"${OPTARG#??}"' ${1+'"$@"'}
+ OPTARG= ;;
+ esac
+ case $1 in
+ '-D')
+ [ "${OPTARG:-}" ] && OPTARG=${OPTARG#*\=} && set "noarg" "$1" && break
+ eval '[ ${OPTARG+x} ] &&:' && OPTARG='1' || OPTARG=''
+ mkdirp="$OPTARG"
+ ;;
+ '-t')
+ [ $# -le 1 ] && set "required" "$1" && break
+ OPTARG=$2
+ target="$OPTARG"
+ shift ;;
+ '-m')
+ [ $# -le 1 ] && set "required" "$1" && break
+ OPTARG=$2
+ mode="$OPTARG"
+ shift ;;
+ '-h'|'--help')
+ usage
+ exit 0 ;;
+ --)
+ shift
+ while [ $# -gt 0 ]; do
+ REST="${REST} \"\${$((OPTIND-$#))}\""
+ shift
+ done
+ break ;;
+ [-]?*) set "unknown" "$1"; break ;;
+ *)
+ REST="${REST} \"\${$((OPTIND-$#))}\""
+ esac
+ shift
+ done
+ [ $# -eq 0 ] && { OPTIND=1; unset OPTARG; return 0; }
+ case $1 in
+ unknown) set "Unrecognized option: $2" "$@" ;;
+ noarg) set "Does not allow an argument: $2" "$@" ;;
+ required) set "Requires an argument: $2" "$@" ;;
+ pattern:*) set "Does not match the pattern (${1#*:}): $2" "$@" ;;
+ notcmd) set "Not a command: $2" "$@" ;;
+ *) set "Validation error ($1): $2" "$@"
+ esac
+ echo "$1" >&2
+ exit 1
+}
+
+parse "$@" && eval set -- "$REST"
+
+if [ "$target" ]; then
+ [ "$mkdirp" ] || [ -d "$target" ] || die "$target doesn't exist"
+ mkdir -p "$target"
+ for arg; do
+ [ -d "$target/${arg##*/}" ] && die "$target/${arg##*/} is a directory"
+ cp "$arg" "$target/${arg##*/}"
+
+ # Most implementations set the mode to 0755 by default when -t is set.
+ chmod "${mode:=0755}" "$target/${arg##*/}"
+ done
+else
+ case "$2" in */*) [ "$mkdirp" ] || [ -d "${2%/*}" ] || die "${2%/*} doesn't exist"
+ mkdir -p "${2%/*}"
+ esac
+ [ -d "$2" ] && die "$2 is a directory"
+ cp "$1" "$2"
+ chmod "${mode:=0755}" "$2"
+fi