aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/build-all.sh140
-rwxr-xr-xbin/build.sh2
-rwxr-xr-xbin/make-release.sh55
-rwxr-xr-xbin/models.py33
-rwxr-xr-xbin/version-string.sh58
5 files changed, 220 insertions, 68 deletions
diff --git a/bin/build-all.sh b/bin/build-all.sh
index df72ad5..f2420a7 100755
--- a/bin/build-all.sh
+++ b/bin/build-all.sh
@@ -9,68 +9,82 @@
# enable "**" for recursive glob (requires bash)
shopt -s globstar
-if [ "$#" -gt 0 ]; then
- # multiple search terms with "AND"
- SEARCH=( "$@" )
- # memes
- [ "$1" = "me" ] && shift && shift && echo "Make your own $*." && exit 1
-fi
-
-# TODO: detect UI from $0 and/or $*
-UI=anduril
-
-mkdir -p hex
-
-# TODO: use a git tag for the version, instead of build date
-# TODO: use build/version.h instead of $UI/version.h ?
-date '+#define VERSION_NUMBER "%Y-%m-%d"' > ui/$UI/version.h
-
-PASS=0
-FAIL=0
-PASSED=''
-FAILED=''
-
-# build targets are hw/$vendor/$model/**/$ui.h
-for TARGET in hw/*/*/**/"$UI".h ; do
-
- # friendly name for this build
- NAME=$(echo "$TARGET" | perl -ne 's|/|-|g; /hw-(.*)-'"$UI"'.h/ && print "$1\n";')
-
- # limit builds to searched patterns, if given
- SKIP=0
- if [ ${#SEARCH[@]} -gt 0 ]; then
- for text in "${SEARCH[@]}" ; do
- if ! echo "$NAME $TARGET" | grep -i -- "$text" > /dev/null ; then
- SKIP=1
+function main {
+
+ if [ "$#" -gt 0 ]; then
+ # multiple search terms with "AND"
+ SEARCH=( "$@" )
+ # memes
+ [ "$1" = "me" ] && shift && shift && echo "Make your own $*." && exit 1
+ fi
+
+ # TODO: detect UI from $0 and/or $*
+ UI=anduril
+
+ mkdir -p hex
+
+ make-version-h # generate a version.h file
+
+ PASS=0
+ FAIL=0
+ PASSED=''
+ FAILED=''
+
+ # build targets are hw/$vendor/$model/**/$ui.h
+ for TARGET in hw/*/*/**/"$UI".h ; do
+
+ # friendly name for this build
+ NAME=$(echo "$TARGET" | perl -ne 's|/|-|g; /hw-(.*)-'"$UI"'.h/ && print "$1\n";')
+
+ # limit builds to searched patterns, if given
+ SKIP=0
+ if [ ${#SEARCH[@]} -gt 0 ]; then
+ for text in "${SEARCH[@]}" ; do
+ if ! echo "$NAME $TARGET" | grep -i -- "$text" > /dev/null ; then
+ SKIP=1
+ fi
+ done
fi
+ if [ 1 = $SKIP ]; then continue ; fi
+
+ # announce what we're going to build
+ echo "===== $UI $REV : $NAME ====="
+
+ # try to compile, track result, and rename compiled files
+ if bin/build.sh "$TARGET" ; then
+ HEX_OUT="hex/$UI.$NAME.hex"
+ mv -f "ui/$UI/$UI".hex "$HEX_OUT"
+ MD5=$(md5sum "$HEX_OUT" | cut -d ' ' -f 1)
+ echo " # $MD5"
+ echo " > $HEX_OUT"
+ PASS=$((PASS + 1))
+ PASSED="$PASSED $NAME"
+ else
+ echo "ERROR: build failed"
+ FAIL=$((FAIL + 1))
+ FAILED="$FAILED $NAME"
+ fi
+
done
- fi
- if [ 1 = $SKIP ]; then continue ; fi
-
- # announce what we're going to build
- echo "===== $UI : $NAME ====="
-
- # try to compile, track result, and rename compiled files
- if bin/build.sh "$TARGET" ; then
- HEX_OUT="hex/$UI.$NAME.hex"
- mv -f "ui/$UI/$UI".hex "$HEX_OUT"
- MD5=$(md5sum "$HEX_OUT" | cut -d ' ' -f 1)
- echo " # $MD5"
- echo " > $HEX_OUT"
- PASS=$((PASS + 1))
- PASSED="$PASSED $NAME"
- else
- echo "ERROR: build failed"
- FAIL=$((FAIL + 1))
- FAILED="$FAILED $NAME"
- fi
-
-done
-
-# summary
-echo "===== $PASS builds succeeded, $FAIL failed ====="
-#echo "PASS: $PASSED"
-if [ 0 != $FAIL ]; then
- echo "FAIL:$FAILED"
- exit 1
-fi
+
+ # summary
+ echo "===== $PASS builds succeeded, $FAIL failed ====="
+ #echo "PASS: $PASSED"
+ if [ 0 != $FAIL ]; then
+ echo "FAIL:$FAILED"
+ exit 1
+ fi
+}
+
+function make-version-h {
+ # old: version = build date
+ #date '+#define VERSION_NUMBER "%Y-%m-%d"' > ui/$UI/version.h
+
+ REV=$(bin/version-string.sh c)
+ # save the version name to version.h
+ mkdir -p ".build/$UI"
+ echo '#define VERSION_NUMBER "'"$REV"'"' > ".build/$UI/version.h"
+}
+
+main "$@"
+
diff --git a/bin/build.sh b/bin/build.sh
index 9b4b0b3..d044ca5 100755
--- a/bin/build.sh
+++ b/bin/build.sh
@@ -49,7 +49,7 @@ export CPP=avr-cpp
export OBJCOPY=avr-objcopy
export DFPFLAGS="-B $DFPPATH/gcc/dev/$MCUNAME/ -I $DFPPATH/include/"
# TODO: include $user/ first so it can override other stuff
-INCLUDES="-I ui -I hw -I. -I.. -I../.. -I../../.."
+INCLUDES="-I .build -I ui -I hw -I. -I.. -I../.. -I../../.."
export CFLAGS=" -Wall -g -Os -mmcu=$MCUNAME -c -std=gnu99 -fgnu89-inline -fwhole-program $MCUFLAGS $INCLUDES -fshort-enums $DFPFLAGS"
export CPPFLAGS="-Wall -g -Os -mmcu=$MCUNAME -C -std=gnu99 -fgnu89-inline -fwhole-program $MCUFLAGS $INCLUDES -fshort-enums $DFPFLAGS"
export OFLAGS="-Wall -g -Os -mmcu=$MCUNAME -mrelax $DFPFLAGS"
diff --git a/bin/make-release.sh b/bin/make-release.sh
new file mode 100755
index 0000000..da985d1
--- /dev/null
+++ b/bin/make-release.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+# Create a release file for Anduril .hex files.
+# Copyright (C) 2023 Selene ToyKeeper
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+set -e # abort on error
+
+# run from repo root
+REPODIR=$(dirname "$0")/..
+cd "$REPODIR"
+
+# get rid of 1st arg if it's "release" passed from 'make'
+[[ "$1" = "release" ]] && shift
+
+# try to get the repo ready for a release
+# (or not; probably better to do these steps manually)
+#make clean
+#make
+
+# release name
+#REV=$(date +'%Y-%m-%d')
+REV=$(git describe --tags --dirty --match='r2*')
+REV="${REV:1}" # convert 'r2023-...' to '2023-...'
+# allow manually specifying a release name
+[[ -n "$1" ]] && REV="$1"
+
+# releases are named "$project.$revision"
+RELNAME="anduril.$REV"
+
+# release directory
+RELDIR="releases/$RELNAME"
+mkdir -p "$RELDIR" "$RELDIR/hex"
+
+# add documentation and stuff
+cp -a \
+ ChangeLog.md \
+ LICENSE \
+ MODELS \
+ README.md \
+ docs/anduril-manual.md \
+ docs/battery-rainbow.png \
+ docs/which-hex-file.md \
+ "$RELDIR"
+
+# add the .hex files
+rename -f 's|hex/anduril.|'"$RELDIR/hex/$RELNAME"'.|;' hex/*.hex
+
+# make a .zip file
+cd releases
+mkdir -p zip
+ZPATH=zip/"$RELNAME".zip
+zip -q -r "$ZPATH" "$RELNAME"
+cd ..
+ls -l "releases/$ZPATH"
+
diff --git a/bin/models.py b/bin/models.py
index 8e54d1c..1a1152e 100755
--- a/bin/models.py
+++ b/bin/models.py
@@ -24,12 +24,18 @@ def main(args):
foo.sort()
models = [x[-1] for x in foo]
+ colsizes = [
+ max(len(m.model) for m in models),
+ max(len(m.mcu) for m in models),
+ max(len(m.name) for m in models),
+ ]
+
print('Models: %i\n' % len(models))
- fmt = '%s\t%-30s\t%s'
- print(fmt % ('Model', 'Name', 'MCU'))
- print(fmt % ('-----', '----', '---'))
+ fmt = '%%-%is %%-%is %%s' % (colsizes[0], colsizes[1])
+ print(fmt % ('Model', 'MCU', 'Name'))
+ print(fmt % ('-----', '---', '----'))
for m in models:
- print(fmt % (m.model, m.name, m.mcu))
+ print(fmt % (m.model, m.mcu, m.name))
print('\nDuplicates:')
for i, m in enumerate(models):
@@ -56,6 +62,7 @@ def load_model(path):
m.name = path.replace('hw/','').replace('/', '-')
m.mcu = inherit(path, 'arch')
m.model = inherit(path, 'model')
+ if m.model: m.model = model_translate(m.model)
return m
@@ -73,6 +80,24 @@ def inherit(path, field):
return None
+def model_translate(m):
+ """Convert raw ordinal hex codes into human-friendly a-f digits.
+ """
+ m = str(m)
+ replace = {
+ chr(ord('0') + 10): 'a',
+ chr(ord('0') + 11): 'b',
+ chr(ord('0') + 12): 'c',
+ chr(ord('0') + 13): 'd',
+ chr(ord('0') + 14): 'e',
+ chr(ord('0') + 15): 'f',
+ }
+ for s, r in replace.items():
+ m = m.replace(s, r)
+
+ return m
+
+
if __name__ == "__main__":
import sys
main(sys.argv[1:])
diff --git a/bin/version-string.sh b/bin/version-string.sh
new file mode 100755
index 0000000..c1c5155
--- /dev/null
+++ b/bin/version-string.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+# Print a version string for the currently-checked-out code.
+# Copyright (C) 2023 Selene ToyKeeper
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# Usage: version-string.sh [c|git|both]
+# Prints in C or Git format. Defaults to both.
+
+function main {
+ # eat first arg if invoked via 'make'
+ [[ "version" = "$1" ]] && shift
+
+ # default to showing both formats
+ ARGS="$*"
+ [[ -z "$ARGS" ]] && ARGS="both"
+
+ for arg in $ARGS ; do
+ case "$arg" in
+ git|g)
+ git-describe
+ ;;
+ c|C)
+ c-version-string
+ ;;
+ *)
+ echo -n 'C: ' ; c-version-string
+ echo -n 'git: ' ; git-describe
+ ;;
+ esac
+ done
+}
+
+function git-describe {
+ git describe --tags --dirty --match='r2*'
+}
+
+function c-version-string {
+ # version = git tag + revs since + dirty flag
+ REV=$(git-describe)
+ # convert "r2020-01-01-158-g0abcdef-dirty" to "2020-01-01+158#1"
+ REV=$(echo "$REV" |
+ sed -E 's/^r//;
+ s/-dirty/#1/;
+ s/-g[0-9a-f]+//;
+ s/^([0-9]{4}-[0-9]{2}-[0-9]{2})-/\1+/;
+ '
+ )
+ # handle an empty name (can happen during github action runs)
+ if [[ -z "$REV" ]]; then
+ HASH=$(git describe --always)
+ REV="0.$HASH"
+ fi
+ # print the version string
+ echo "$REV"
+}
+
+main "$@"
+