From 1b64c0ca9f6438c5bb35f34a46344030b61b789a Mon Sep 17 00:00:00 2001
From: midipix <writeonce@midipix.org>
Date: Sun, 28 Apr 2024 17:47:08 +0000
Subject: build system: imported sofort, a project-agnostic build system.

---
 sofort/tools/pkgconf.sh | 136 ++++++++++++++++++++++++++++++++++++++++++++++++
 sofort/tools/srctree.sh |  83 +++++++++++++++++++++++++++++
 sofort/tools/version.sh |  75 ++++++++++++++++++++++++++
 3 files changed, 294 insertions(+)
 create mode 100755 sofort/tools/pkgconf.sh
 create mode 100755 sofort/tools/srctree.sh
 create mode 100755 sofort/tools/version.sh

(limited to 'sofort/tools')

diff --git a/sofort/tools/pkgconf.sh b/sofort/tools/pkgconf.sh
new file mode 100755
index 0000000..a69c25b
--- /dev/null
+++ b/sofort/tools/pkgconf.sh
@@ -0,0 +1,136 @@
+#!/bin/sh
+
+# pkgconf.sh: generate a pkgconf manifest file.
+# this file is covered by COPYING.SOFORT.
+
+set -eu
+
+# prefix, exec_prefix
+if [ "$PKGCONF_PREFIX" = "$PKGCONF_EXEC_PREFIX" ]; then
+	pkgconf_prefix="${PKGCONF_PREFIX}"
+	pkgconf_exec_prefix='${prefix}'
+else
+	pkgconf_prefix="${PKGCONF_PREFIX}"
+	pkgconf_exec_prefix="${PKGCONF_EXEC_PREFIX}"
+fi
+
+
+# (relative) includedir
+if [ -z "$PKGCONF_INCLUDEDIR" ]; then
+	pkgconf_includedir=
+	pkgconf_cflags=
+else
+	prefix=$(dirname "$PKGCONF_INCLUDEDIR")
+	base=$(basename "$PKGCONF_INCLUDEDIR")
+
+	if [ "$prefix" = '/' ]; then
+		prefix=
+	fi
+
+	if [ "$prefix/$base" = "$PKGCONF_PREFIX/$base" ]; then
+		pkgconf_includedir='${prefix}/'"${base}"
+		pkgconf_cflags='-I${includedir}'
+	else
+		pkgconf_includedir="${PKGCONF_INCLUDEDIR}"
+		pkgconf_cflags='-I${includedir}'
+	fi
+fi
+
+
+# (relative) libdir (blank unless needed)
+if [ -z "$PKGCONF_LIBDIR" ]; then
+	pkgconf_libdir=
+else
+	prefix=$(dirname "$PKGCONF_LIBDIR")
+	base=$(basename "$PKGCONF_LIBDIR")
+
+	if [ "$prefix" = '/' ]; then
+		prefix=
+	fi
+
+	if [ "$prefix/$base" = "$PKGCONF_EXEC_PREFIX/$base" ]; then
+		pkgconf_libdir='${exec_prefix}/'"${base}"
+	else
+		pkgconf_libdir='${prefix}/'"${PKGCONF_LIBDIR}"
+	fi
+fi
+
+
+# ldflags (--libs)
+if [ -n "$pkgconf_libdir" ] &&  [ -n "${PKGCONF_NAME}" ]; then
+	pkgconf_ldflags='-L${libdir}'" -l${PKGCONF_NAME}"
+elif [ -n "${PKGCONF_NAME}" ]; then
+	pkgconf_ldflags="-l${PKGCONF_NAME}"
+else
+	pkgconf_ldflags='-L${libdir}'
+fi
+
+
+# cflags
+if [ -n "$pkgconf_cflags" ] || [ -n "${PKGCONF_DEFS}" ]; then
+	pkgconf_cflags="$pkgconf_cflags ${PKGCONF_DEFS}"
+	pkgconf_cflags=$(printf '%s' "$pkgconf_cflags" | sed -e 's/^[ \t]*//g')
+fi
+
+
+# repo (optional)
+if [ -z "${PKGCONF_REPO}" ]; then
+	pkgconf_repo='#'
+else
+	pkgconf_repo="Repo:        ${PKGCONF_REPO}"
+fi
+
+# patches (optional)
+if [ -z "${PKGCONF_PSRC}" ]; then
+	pkgconf_psrc='#'
+else
+	pkgconf_psrc="Patches:     ${PKGCONF_PSRC}"
+fi
+
+# distro (optional)
+if [ -z "${PKGCONF_DURL}" ]; then
+	pkgconf_durl='#'
+else
+	pkgconf_durl="Distro:      ${PKGCONF_DURL}"
+fi
+
+# bug reports (optional)
+if [ -z "${PKGCONF_BUGS}" ]; then
+	pkgconf_bugs='#'
+else
+	pkgconf_bugs="Bug reports: ${PKGCONF_BUGS}"
+fi
+
+# project home page (optional)
+if [ -z "${PKGCONF_HOME}" ]; then
+	pkgconf_home='#'
+else
+	pkgconf_home="Home page:   ${PKGCONF_HOME}"
+fi
+
+
+# output (without trailing spaces)
+cat << _EOF | grep -v '^#' | sed 's/[ \t]*$//'
+###
+prefix=$pkgconf_prefix
+exec_prefix=$pkgconf_exec_prefix
+includedir=$pkgconf_includedir
+libdir=$pkgconf_libdir
+
+Name:        ${PKGCONF_NAME}
+Description: ${PKGCONF_DESC}
+URL:         ${PKGCONF_USRC}
+Version:     ${PKGCONF_VERSION}
+$pkgconf_repo
+$pkgconf_psrc
+$pkgconf_durl
+$pkgconf_bugs
+$pkgconf_home
+
+Cflags:      $pkgconf_cflags
+Libs:        $pkgconf_ldflags
+###
+_EOF
+
+# all done
+exit 0
diff --git a/sofort/tools/srctree.sh b/sofort/tools/srctree.sh
new file mode 100755
index 0000000..90a1d89
--- /dev/null
+++ b/sofort/tools/srctree.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+# srctree.sh: support for out-of-tree builds in posix make mode.
+# this file is covered by COPYING.SOFORT.
+
+set -eu
+
+usage()
+{
+cat << EOF >&2
+
+Usage:
+  --help              show this HELP message
+  --srctree=SRCTREE   set source directory
+
+EOF
+exit 1
+}
+
+
+# one
+workdir=$(pwd -P)
+srctree=
+argloop=
+
+
+for arg ; do
+	case "$arg" in
+		--help)
+			usage
+			;;
+
+		--srctree=*)
+			srctree=${arg#*=}
+			;;
+
+		--)
+			argloop='done'
+			;;
+
+		*)
+			if [ -z "$argloop" ]; then
+				printf 'Invalid option: %s\n' "$arg" >&2
+				usage
+			fi
+			;;
+	esac
+done
+
+
+# two
+if [ -z "$srctree" ] ; then
+	usage
+fi
+
+cd -- "$srctree"
+srctree=$(pwd -P)
+cd -- "$workdir"
+
+if [ "$srctree" = "$workdir" ]; then
+	exit 0
+fi
+
+
+# three
+for arg ; do
+	case "$arg" in
+		--srctree=*)
+			;;
+
+		--)
+			;;
+
+		*)
+			stat "$arg" > /dev/null 2>&1 \
+				|| ln -s -- "$srctree/$arg" "$arg"
+			;;
+	esac
+done
+
+
+# all done
+exit 0
diff --git a/sofort/tools/version.sh b/sofort/tools/version.sh
new file mode 100755
index 0000000..8c49cb3
--- /dev/null
+++ b/sofort/tools/version.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# version.sh: detect git repository info, output defs as a C header.
+# this file is covered by COPYING.SOFORT.
+
+set -eu
+
+usage()
+{
+cat << EOF >&2
+
+Usage:
+  -h            show this HELP message
+  -s  SRCDIR    set source directory
+  -o  OUTPUT    set output header
+  -p  PREFIX    set macro prefix
+
+EOF
+exit 1
+}
+
+
+# one
+workdir=$(pwd -P)
+srcdir=
+output=
+prefix=
+
+
+while getopts "hs:o:p:" opt; do
+	case $opt in
+	h)
+  		usage
+  		;;
+	s)
+    		srcdir="$OPTARG"
+    		;;
+	o)
+    		output="$OPTARG"
+    		;;
+	p)
+    		prefix="$OPTARG"
+    		;;
+	\?)
+		printf 'Invalid option: -%s' "$OPTARG" >&2
+    		usage
+    		;;
+	esac
+done
+
+
+# two
+if [ -z "$srcdir" ] || [ -z "$output" ] || [ -z "$prefix" ]; then
+	usage
+fi
+
+cd -- "$srcdir"
+
+gitver=$(git rev-parse --verify HEAD      2>/dev/null) || gitver="unknown"
+cvdate=$(git show -s --format=%ci $gitver 2>/dev/null) || cvdate=$(date)
+
+vmacro=$(printf '%s' "$prefix"'_GIT_VERSION' | tr '[:lower:]' '[:upper:]')
+dmacro=$(printf '%s' "$prefix"'_GIT_DATE   ' | tr '[:lower:]' '[:upper:]')
+
+cd -- "$workdir"
+
+
+# three
+printf '#define %s "%s"\n#define %s "%s"\n' \
+		"$vmacro" "$gitver" \
+		"$dmacro" "$cvdate" \
+	> "$output"
+
+# all done
+exit 0
-- 
cgit v1.2.3