Add a new tool to help build the firmware

The tool - a work in progress - is meant to eventually replace the Makefile. It
is set up so that it can easily be reused by third-party libraries to build
their own examples, with minimal amount of configuration.

Signed-off-by: Gergely Nagy <algernon@madhouse-project.org>
pull/84/head
Gergely Nagy 8 years ago
parent 230722caee
commit f655c446a1

@ -0,0 +1,257 @@
#! /bin/sh
set -e
firmware_size () {
## This is a terrible hack, please don't hurt me. - algernon
MAX_PROG_SIZE=28672
output="$($@ | grep "\\(Program\\|Data\\):" | sed -e 's,^, - ,' && echo)"
PROGSIZE="$(echo "${output}" | grep Program: | cut -d: -f2 | awk '{print $1}')"
PERCENT=$(cat <<EOF
scale=2
${PROGSIZE} / ${MAX_PROG_SIZE} * 100
EOF
)
PERCENT=$(printf %02.01f $(echo "${PERCENT}" | bc -q))
echo "${output}" | sed -e "s,\(Program:.*\)(\([0-9\.]*%\) Full),\1(${PERCENT}% Full),"
}
submodule_update () {
cd $(dirname $0)/..
echo Syncing submodules...
git submodule --quiet sync --recursive
echo Updating submodules...
git submodule --quiet update --init --recursive
echo
for lib in hardware/keyboardio/avr/libraries/* lib/*; do
echo Updating $(basename ${lib})...
(cd $lib; git checkout -q master; git pull -q --ff)
done
}
find_sketch () {
for path in "hardware/keyboardio/avr/libraries/Akela-${LIBRARY}/examples/${SKETCH}" \
"examples/${LIBRARY}" \
"src"; do
if [ -f "${path}/${SKETCH}.ino" ]; then
echo "${path}"
return
fi
done
exit 1
}
flash () {
cd "$(find_sketch)"
. ${ROOT}/tools/settings.sh
echo "Press ENTER when ready..."
read a
stty -F /dev/ttyACM* 1200 hupcl
sleep 3s
avrdude -q -q -patmega32u4 -cavr109 -D -P /dev/ttyACM* -b57600 "-Uflash:w:${OUTPUT_PATH}/${SKETCH}-latest.hex:i"
cd "${SOURCEDIR}"
}
build () {
compile $@
report_size $@
}
compile () {
cd "$(find_sketch)"
. ${ROOT}/tools/settings.sh
install -d "${OUTPUT_PATH}"
echo "Building ${OUTPUT_DIR}/${SKETCH} (${LIB_VERSION}) ..."
${ARDUINO_BUILDER} \
-compile \
-hardware "${ARDUINO_PATH}/hardware" \
-hardware "${BOARD_HARDWARE_PATH}" \
${ARDUINO_TOOLS_PARAM} \
-tools "${ARDUINO_PATH}/tools-builder" \
-fqbn "${FQBN}" \
-libraries "${ROOT}/libraries" \
-libraries "${BOARD_HARDWARE_PATH}/.." \
-libraries "${ROOT}" \
${EXTRA_BUILDER_ARGS} \
-build-path "${BUILD_PATH}" \
-ide-version "${ARDUINO_IDE_VERSION}" \
-warnings all \
${ARDUINO_VERBOSE} \
-prefs "compiler.cpp.extra_flags=-std=c++11 -Woverloaded-virtual -Wno-unused-parameter -Wno-unused-variable -Wno-ignored-qualifiers" \
${ARDUINO_AVR_GCC_PREFIX_PARAM} \
"${SKETCH}.ino"
cp "${BUILD_PATH}/${SKETCH}.ino.hex" "${HEX_FILE_PATH}"
cp "${BUILD_PATH}/${SKETCH}.ino.elf" "${ELF_FILE_PATH}"
ln -sf "${OUTPUT_FILE_PREFIX}.hex" "${OUTPUT_PATH}/${SKETCH}-latest.hex"
ln -sf "${OUTPUT_FILE_PREFIX}.elf" "${OUTPUT_PATH}/${SKETCH}-latest.elf"
rm -rf "${BUILD_PATH}"
cd "${SOURCEDIR}"
}
_find_all () {
for plugin in hardware/keyboardio/avr/libraries/Akela-*/examples/* \
examples/* \
src/*.ino; do
if [ -d "$(dirname ${plugin})" ] || [ -f "${plugin}" ]; then
p="$(basename "${plugin}" .ino)"
if [ "${p}" != '*' ]; then
echo "${p}"
fi
fi
done | sort
}
build_all () {
plugins="$(_find_all)"
for plugin in ${plugins}; do
export SKETCH="${plugin}"
export LIBRARY="${plugin}"
(build ${plugin})
done
}
report_size () {
cd "$(find_sketch)"
. ${ROOT}/tools/settings.sh
echo "- Size: firmware/${LIBRARY}/${OUTPUT_FILE_PREFIX}.elf"
firmware_size "${AVR_SIZE}" -C --mcu="${MCU}" "${ELF_FILE_PATH}"
echo
cd "${SOURCEDIR}"
}
size_map () {
cd "$(find_sketch)"
. ${ROOT}/tools/settings.sh
"${AVR_NM}" --size-sort -C -r -l "${ELF_FILE_PATH}"
cd "${SOURCEDIR}"
}
clean () {
cd "$(find_sketch)"
. ${ROOT}/tools/settings.sh
rm -rf "${OUTPUT_PATH}"
cd "${SOURCEDIR}"
}
usage () {
cat <<EOF
Usage: $0 SKETCH commands...
Runs all of the commands in the context of the Sketch.
Available commands:
help
This help screen.
compile
Compiles the sketch.
report-size
Reports the size of the compiled sketch.
build
Runs compile and report-size.
clean
Cleans up the output directory.
size-map
Displays the size map for the sketch.
flash
Flashes the firmware using avrdude.
build-all
Build all Sketches we can find.
EOF
}
help () {
usage
}
if [ $# -lt 1 ]; then
usage
exit 1
fi
## Parse the command-line
## - anything that has a =, is an env var
## - from the remaining stuff, the first one is the Library/Sketch
## - everything else are commands
##
## - if there is only one argument, that's a command
ROOT="$(cd $(dirname $0)/..; pwd)"
export ROOT
export SOURCEDIR="$(pwd)"
if [ $# -eq 1 ]; then
cmd="$(echo $1 | tr '-' '_')"
${cmd}
exit $?
fi
cmds=""
## Export vars
for i in $(seq 1 $#); do
v="$1"
shift
case "${v}" in
*=*)
export ${v}
;;
*)
cmds="${cmds} ${v}"
;;
esac
done
set -- ${cmds}
SKETCH="$1"
shift
cmds=""
for i in $(seq 1 $#); do
cmds="${cmds} $(echo $1 | tr '-' '_')"
shift
done
LIBRARY="${SKETCH}"
export SKETCH
export LIBRARY
for cmd in ${cmds}; do
${cmd}
done

@ -0,0 +1,59 @@
## NEEDS: LIBRARY, SKETCH, ROOT, SOURCEDIR
## Should be included when the current directory is the dir of the Sketch.
if [ -z "${SKETCH}" ] || [ -z "${LIBRARY}" ] || [ -z "${ROOT}" ] || [ -z "${SOURCEDIR}" ]; then
echo "SKETCH, LIBRARY, SOURCEDIR, and ROOT need to be set before including this file!" >&2
exit 1
fi
case "$0" in
*/settings.sh)
echo "This file must be included, never run directly!" >&2
exit 1
;;
esac
if [ -e "${SOURCEDIR}/settings.sh" ]; then
. "${SOURCEDIR}/settings.sh"
fi
BOARD="model01"
MCU="atmega32u4"
FQBN="keyboardio:avr:model01"
ARDUINO_PATH="${ARDUINO_PATH:-${HOME}/install/arduino}"
ARDUINO_TOOLS_PATH="${ARDUINO_TOOLS_PATH:-${ARDUINO_PATH}/hardware/tools}"
ARDUINO_BUILDER="${ARDUINO_BUILDER:-${ARDUINO_PATH}/arduino-builder}"
ARDUINO_IDE_VERSION="100607"
BOARD_HARDWARE_PATH="${BOARD_HARDWARE_PATH:-${ROOT}/hardware}"
AVR_SIZE="${AVR_SIZE:-${ARDUINO_TOOLS_PATH}/avr/bin/avr-size}"
AVR_NM="${AVR_NM:-${ARDUINO_TOOLS_PATH}/avr/bin/avr-nm}"
BUILD_PATH="${BUILD_PATH:-$(mktemp -d 2>/dev/null || mktemp -d -t 'build')}"
OUTPUT_DIR="${OUTPUT_DIR:-output/${LIBRARY}}"
OUTPUT_PATH="${OUTPUT_PATH:-${SOURCEDIR}/${OUTPUT_DIR}}"
GIT_VERSION="$(git describe --abbrev=4 --dirty --always)"
LIB_VERSION="$( (grep version= ../../library.properties 2>/dev/null || echo version=0.0.0) | cut -d= -f2)-g${GIT_VERSION}"
OUTPUT_FILE_PREFIX="${SKETCH}-${LIB_VERSION}"
HEX_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.hex"
ELF_FILE_PATH="${OUTPUT_PATH}/${OUTPUT_FILE_PREFIX}.elf"
ARDUINO_TOOLS_PARAM="-tools ${ARDUINO_TOOLS_PATH}"
if [ -z "${ARDUINO_TOOLS_PATH}" ]; then
ARDUINO_TOOLS_PARAM=""
fi
if [ ! -z "${AVR_GCC_PREFIX}" ]; then
ARDUINO_AVR_GCC_PREFIX_PARAM="-prefs \"runtime.tools.avr-gcc.path=${AVR_GCC_PREFIX}\""
fi
if [ ! -z "${VERBOSE}" ] && [ "${VERBOSE}" -gt 0 ]; then
ARDUINO_VERBOSE="-verbose"
else
ARDUINO_VERBOSE="-quiet"
fi
Loading…
Cancel
Save