aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-12-05 16:49:24 -0700
committerSelene ToyKeeper2023-12-05 16:49:24 -0700
commit50ae5684534ec9333a648794d4f371b882e53075 (patch)
treee666fea7d540632dc99643468184b519e647c12d /bin
parentd3aa: made it easy to switch between vddio2 and external voltage divider (diff)
parentmoved version string calculation to bin/version-string.sh (diff)
downloadanduril-50ae5684534ec9333a648794d4f371b882e53075.tar.gz
anduril-50ae5684534ec9333a648794d4f371b882e53075.tar.bz2
anduril-50ae5684534ec9333a648794d4f371b882e53075.zip
Merge branch 'trunk' into emisar-d3aa
* trunk: moved version string calculation to bin/version-string.sh forgot one item in the ChangeLog ChangeLog: added 2023-12-03 release notes, converted @modelname to &modelname docs: expanded / reorganized info on Version Check formats updated MODELS, bin/models.py, and hw/BRANDS... fw3x: document how it ships with the wrong fuse values, and how to fix it github CI: fetch history too, to allow detection of version tags build-all: handle the case where "git describe" can't get any tags run CI on all branches, not just on trunk fetch tags on CI checkout, so 'git describe' can work added docs/battery-rainbow.png from old repo, since it's still relevant added bin/make-release.sh to generate a .zip file ready for release build-all.sh: re-indented, started organizing code into functions changed version number to use the latest release tag instead of build date
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 "$@"
+