diff options
author | Zach van Rijn <me@zv.io> | 2023-02-04 01:03:24 -0600 |
---|---|---|
committer | Zach van Rijn <me@zv.io> | 2024-08-10 06:27:01 +0000 |
commit | 8609f79a1f92eb9b553d0928d6c39ec5fbad3c34 (patch) | |
tree | 71c8927aebecad3bc9d90d48cda92eefbb0a2a58 /scripts | |
parent | 6f94d419b70e2881ce6d9c37233b5a13dca61d08 (diff) | |
download | packages-zv/genmake.tar.gz packages-zv/genmake.tar.bz2 packages-zv/genmake.tar.xz packages-zv/genmake.zip |
scripts/*: add Makefile generator.zv/genmake
This commit adds a few scripts to the packages repository:
* configure
Typical 'configure' script; run to see usage.
* scripts/genmake
Generates a top-level 'Makefile' that will either
build packages in the correct order, or sleep to
simulate package builds. The main purpose of this
tool is to enable concurrent package builds, and
to provide a framework to analyze build strategies.
When a dependency is updated, it is the responsibility of
the maintainer to relbump all dependent packages. This tool
is intended to facilitate concurrent package builds, not be
a comprehensive maintenance tool.
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/genmake | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/scripts/genmake b/scripts/genmake new file mode 100755 index 000000000..79a89175a --- /dev/null +++ b/scripts/genmake @@ -0,0 +1,93 @@ +#!/bin/sh -e + +# ./scripts/deplist system | ./scripts/genmake [0|1] + +## +# This script reads from stdin and generates +# a Makefile in the repository's root. +# +# The first argument to this script is a value {0,1} +# indicating whether to generate real rules or fake +# (simulation) rules. Fake rules might be 'sleep 1' +# or can be user-defined. +# +# NOTE: out-of-tree builds are not supported. +# + +HERE="$(dirname $(readlink -f ${0}))"; +DEST="${HERE}"/../Makefile; +TEMP="$(mktemp)"; + +## +# Build recipes. +# +# FIXME: is $(@D) POSIX or $(%/built=%) required? +# +rule_real=$(cat <<"EOF" + @cd $(@D) && abuild -r +EOF +); +rule_fake=$(cat <<"EOF" + @echo $(@D) + @sleep 1 +EOF +); + +## +# Read deplist from stdin, synthesize Makefile targets. +# +awk '{ $(NF+1)=$1; print $0 }' `# duplicate first column to last` \ + | sed > "${TEMP}" -E `# use extended regex, write to temp file ` \ + -e 's/ /: /' `# append colon to first column` \ + -e '/: /s@( |$)@/built @2g' `# append '/built' to all dependencies` \ + -e 's/ $//g' `# trim trailing spaces` \ + ; + +## +# Internal; convenience only. +# +list=$(grep : "${TEMP}" \ + | cut -d: -f1 \ + | xargs \ +); + +## +# Create (or truncate) the output Makefile. +# +# Default target builds everything. +# +printf "all: %s\n" "${list}" > "${DEST}"; + +## +# Append generic target build recipe. +# +rule=; +case ${1} in + 0) rule="${rule_real}"; ;; + 1) rule="${rule_fake}"; ;; + *) printf "E: Invalid mode '%s'\n" "${1}"; exit 1; ;; +esac +cat >> "${DEST}" <<EOF +%/built: %/APKBUILD +${rule} + @touch \$@ +clean: + @find \$(CURDIR) -type f -name built -print -delete +distclean: + @rm -fv \ + \$(CURDIR)/Makefile \ + \$(CURDIR)/scripts/.index \ + \$(CURDIR)/scripts/sgrep \ + \$(CURDIR)/scripts/tsort \ + ; +EOF + +## +# Append target rules to output Makefile. +# +cat >> "${DEST}" "${TEMP}"; + +## +# Clean up. +# +rm "${TEMP}"; |