]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
feat: Add install script for binary Linux releases
authorJoel Rosdahl <joel@rosdahl.net>
Wed, 18 Mar 2026 18:17:48 +0000 (19:17 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Thu, 19 Mar 2026 13:46:51 +0000 (14:46 +0100)
This makes it possible to install without having make(1) available.

ci/prepare-release
misc/Makefile.posix-binary-release
misc/install.sh [new file with mode: 0755]

index 2984bbcd69b3570d5c8ec1b1bb7ee1caf2171f5a..20a286a03c908ea11c329f8f9ae63a87417fd3e2 100755 (executable)
@@ -29,6 +29,7 @@ prepare_posix_binary_release() {
     mkdir "${name}"
     cp "${arch}-binary/ccache" "${name}"
     chmod +x "${name}/ccache"
+    cp misc/install.sh "${name}"
     cp misc/Makefile.posix-binary-release "${name}/Makefile"
     cp misc/patch-binary.py "${name}"
     cp GPL-3.0.txt README.md "${name}"
@@ -48,8 +49,10 @@ test_posix_binary_release() {
     tar -C "${tmpdir}" -xf "${PWD}/release/${name}.tar.xz"
     (
         cd "${tmpdir}/${name}"
-        make install prefix=/foo/bar DESTDIR=destdir
-        destdir/foo/bar/bin/ccache --version
+        ./install.sh --prefix /foo/bar --destdir destdir1
+        destdir1/foo/bar/bin/ccache --version -p
+        make install prefix=/foo/bar DESTDIR=destdir2
+        destdir2/foo/bar/bin/ccache --version -p
     )
     rm -r "${tmpdir}"
 }
index e7bd8c0978fccb26c797f39c99cfbef43ec43354..17cb4262b05469181beb50831a327705bb7a44ea 100644 (file)
@@ -1,24 +1,4 @@
 prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-datarootdir = $(prefix)/share
-docdir = $(datarootdir)/doc/ccache
-libexecdir = $(exec_prefix)/libexec
-mandir = $(datarootdir)/man
-man1dir = $(mandir)/man1
-sysconfdir = $(prefix)/etc
-
-doc_files = \
-    GPL-3.0.txt \
-    LICENSE.html \
-    LICENSE.md \
-    MANUAL.html \
-    MANUAL.md \
-    NEWS.html \
-    NEWS.md \
-    README.md
-
-PYTHON = python3
 
 all:
        @echo "Available make targets:"
@@ -28,12 +8,4 @@ all:
        @echo "Default prefix: $(prefix)"
 
 install:
-       mkdir -p "$(DESTDIR)$(bindir)"
-       $(PYTHON) patch-binary.py "$(libexecdir)" "$(sysconfdir)" <ccache >"$(DESTDIR)$(bindir)/ccache"
-       chmod +x "$(DESTDIR)$(bindir)/ccache"
-
-       mkdir -p "$(DESTDIR)$(docdir)"
-       cp $(doc_files) "$(DESTDIR)$(docdir)"
-
-       mkdir -p "$(DESTDIR)$(man1dir)"
-       cp ccache.1 "$(DESTDIR)$(man1dir)"
+       ./install.sh --prefix="$(prefix)" --destdir="$(DESTDIR)"
diff --git a/misc/install.sh b/misc/install.sh
new file mode 100755 (executable)
index 0000000..20e3d31
--- /dev/null
@@ -0,0 +1,114 @@
+#!/bin/sh
+
+set -eu
+
+script_dir="$(cd "$(dirname "$0")" && pwd)"
+
+prefix=/usr/local
+exec_prefix=
+bindir=
+datarootdir=
+docdir=
+libexecdir=
+mandir=
+man1dir=
+sysconfdir=
+destdir=
+PYTHON="${PYTHON:-python3}"
+
+doc_files="
+    GPL-3.0.txt
+    LICENSE.html
+    LICENSE.md
+    MANUAL.html
+    MANUAL.md
+    NEWS.html
+    NEWS.md
+    README.md
+"
+
+usage() {
+    cat <<EOF
+Usage: $0 [OPTIONS]
+
+Install ccache from a binary release.
+
+Installation directories (following GNU conventions):
+  --prefix=DIR         Top-level installation prefix [${prefix}]
+  --exec-prefix=DIR    Exec prefix [PREFIX]
+  --bindir=DIR         User executables [EXEC_PREFIX/bin]
+  --datarootdir=DIR    Read-only architecture-independent data [PREFIX/share]
+  --docdir=DIR         Documentation [DATAROOTDIR/doc/ccache]
+  --libexecdir=DIR     Program executables [EXEC_PREFIX/libexec]
+  --mandir=DIR         Man documentation [DATAROOTDIR/man]
+  --sysconfdir=DIR     Read-only single-machine data [PREFIX/etc]
+
+Other options:
+  --destdir=DIR        Stage installation under DIR
+  -h, --help           Print this help and exit
+
+Environment variables:
+  PYTHON               Python interpreter to use [python3]
+EOF
+}
+
+error() {
+    printf '%s: error: %s\n' "$0" "$1" >&2
+    exit 1
+}
+
+while [ $# -gt 0 ]; do
+    arg=$1
+    case ${arg} in
+        --bindir=*)      bindir=${arg#*=} ;;
+        --bindir)        shift; bindir=$1 ;;
+        --datarootdir=*) datarootdir=${arg#*=} ;;
+        --datarootdir)   shift; datarootdir=$1 ;;
+        --destdir=*)     destdir=${arg#*=} ;;
+        --destdir)       shift; destdir=$1 ;;
+        --docdir=*)      docdir=${arg#*=} ;;
+        --docdir)        shift; docdir=$1 ;;
+        --exec-prefix=*) exec_prefix=${arg#*=} ;;
+        --exec-prefix)   shift; exec_prefix=$1 ;;
+        --libexecdir=*)  libexecdir=${arg#*=} ;;
+        --libexecdir)    shift; libexecdir=$1 ;;
+        --mandir=*)      mandir=${arg#*=} ;;
+        --mandir)        shift; mandir=$1 ;;
+        --prefix=*)      prefix=${arg#*=} ;;
+        --prefix)        shift; prefix=$1 ;;
+        --sysconfdir=*)  sysconfdir=${arg#*=} ;;
+        --sysconfdir)    shift; sysconfdir=$1 ;;
+        -h|--help)       usage; exit 0 ;;
+        *)               error "unknown option: ${arg}" ;;
+    esac
+    shift
+done
+
+: "${exec_prefix:=${prefix}}"
+: "${bindir:=${exec_prefix}/bin}"
+: "${datarootdir:=${prefix}/share}"
+: "${docdir:=${datarootdir}/doc/ccache}"
+: "${libexecdir:=${exec_prefix}/libexec}"
+: "${mandir:=${datarootdir}/man}"
+: "${man1dir:=${mandir}/man1}"
+: "${sysconfdir:=${prefix}/etc}"
+
+command -v "${PYTHON}" >/dev/null 2>&1 || error "Python interpreter not found: ${PYTHON}"
+
+echo "Installing binary: ${destdir}${bindir}/ccache"
+mkdir -p "${destdir}${bindir}"
+"${PYTHON}" "${script_dir}/patch-binary.py" "$libexecdir" "$sysconfdir" \
+    <"${script_dir}/ccache" >"${destdir}${bindir}/ccache"
+chmod 755 "${destdir}${bindir}/ccache"
+
+echo "Installing documentation: ${destdir}${docdir}"
+mkdir -p "${destdir}${docdir}"
+for f in ${doc_files}; do
+    cp "${script_dir}/${f}" "${destdir}${docdir}"
+done
+
+echo "Installing man page: ${destdir}${man1dir}/ccache.1"
+mkdir -p "${destdir}${man1dir}"
+cp "${script_dir}/ccache.1" "${destdir}${man1dir}"
+
+echo "Installation complete."