Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

130 lines
2.6 KiB
Bash
Executable File

#! /usr/bin/env bash
#
# Makes release tarballs for the repository in the current directory;
# and if --recursive is given, also for all submodules.
DEST="$(pwd)/build/dist" # Where to put the TGZs.
LOGS="$DEST/.log" # Where to put build logs.
dists=""
function usage() {
echo "Usage: $(basename $0) [--recursive]"
}
function release() {
mod=$1
tmp="$LOGS/make-release.$(basename $mod).log"
cat </dev/null >$tmp
echo "--- Building distribution for $mod" >&2
echo "Log in $tmp." >&2
make dist >$tmp 2>&1
cat $tmp | awk '/CPack:.*generated/ {print $4} /^Package: / {print $2}' | while read tgz; do
if echo $tgz | grep -qv ^/; then
tgz="$(pwd)/$tgz"
fi
version=$(git tag --contains HEAD | grep -E '^(release|beta)$')
if [ "$version" == "" ]; then
version="git"
fi
echo "Distribution in $tgz ($version)" >&2
ls -al $tgz | awk '{print " ", $0; }' >&2
echo "$tgz#$version"
done
}
if [ "$1" == "--recursive" ]; then
submodules=1
shift
fi
if [ "$submodules" == "1" ]; then
mods=$(git submodule foreach -q --recursive pwd | grep -v /cmake)
fi
if [ -e $DEST ]; then
echo
echo "$DEST exists already, proceeding will delete it."
echo ">> Continue? (y/n)"
read line
if [ "$line" != "y" ]; then
exit 1
fi
fi
rm -rf $DEST
install -d $DEST
install -d $LOGS
mods="$mods ."
build=
for mod in $mods; do
cwd=$(pwd)
cd $mod
if [ "$mod" = "." ]; then
mod=$(pwd)
mod=$(basename $mod)
fi
if [ ! '(' -e CMakeLists.txt -o -e Makefile ')' ]; then
echo "No CMakeLists.txt or Makefile in $mod, skipping."
cd $cwd
continue
fi
ignore=1
if [ "$(git describe HEAD)" = "$(git describe release 2>/dev/null)" ]; then
ignore=0
fi
if [ "$(git describe HEAD)" = "$(git describe beta 2>/dev/null)" ]; then
ignore=0
fi
if [ "$ignore" = "1" ]; then
echo "Module $mod is not tagged for release or beta, skipping."
cd $cwd
continue
fi
dist=$(release $mod)
(echo $dist | grep -qv "^ *$") || echo "No distribution found for $mod."
dists="$dists $dist"
echo
cd $cwd
done
for dist in $dists; do
tgz=$(echo $dist | cut -d '#' -f 1)
version=$(echo $dist | cut -d '#' -f 2)
dst=$(basename $tgz)
dst="$DEST/$version/$(echo $dst | sed 's/\.tgz/.tar.gz/g')"
install -d $DEST/$version
mv $tgz $dst
echo Signing $dst ...
sign-file $dst
done
echo "--- All distributions in $DEST:"
all=$(find $DEST -path '*gz*')
test "$all" != "" && ls -rl $all || echo "None."
echo