Merge pull request #305 from algernon/builder-fixes

Various kaleidoscope-builder fixes
pull/308/head
Jesse Vincent 7 years ago committed by GitHub
commit cd94ffe24c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -2,10 +2,15 @@ dist: trusty
sudo: false sudo: false
os: os:
- linux - linux
addons:
apt:
packages:
- shellcheck
install: install:
- git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr - git clone --depth 1 --recurse-submodules https://github.com/keyboardio/Arduino-Boards hardware/keyboardio/avr
script: script:
- make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware - make travis-test BOARD_HARDWARE_PATH=$(pwd)/hardware
- shellcheck bin/kaleidoscope-builder
notifications: notifications:
irc: irc:
channels: channels:

@ -1,4 +1,4 @@
#! /bin/sh #!/usr/bin/env bash
set -e set -e
@ -7,10 +7,10 @@ set -e
###### ######
build_version () { build_version () {
GIT_VERSION="$(cd $(find_sketch); git describe --abbrev=4 --dirty --always)" GIT_VERSION="$(cd "$(find_sketch)"; git describe --abbrev=4 --dirty --always)"
LIB_VERSION="$(cd $(find_sketch); (grep version= ../../library.properties 2>/dev/null || echo version=0.0.0) | cut -d= -f2)-g${GIT_VERSION}" LIB_VERSION="$(cd "$(find_sketch)"; (grep version= ../../library.properties 2>/dev/null || echo version=0.0.0) | cut -d= -f2)-g${GIT_VERSION}"
BUILD_PATH="${BUILD_PATH:-$(mktemp -d 2>/dev/null || mktemp -d -t 'build')}" BUILD_PATH="${BUILD_PATH:-"$(mktemp -d 2>/dev/null || mktemp -d -t 'build')"}"
OUTPUT_DIR="${OUTPUT_DIR:-output/${LIBRARY}}" OUTPUT_DIR="${OUTPUT_DIR:-output/${LIBRARY}}"
OUTPUT_PATH="${OUTPUT_PATH:-${SOURCEDIR}/${OUTPUT_DIR}}" OUTPUT_PATH="${OUTPUT_PATH:-${SOURCEDIR}/${OUTPUT_DIR}}"
} }
@ -24,23 +24,26 @@ build_filenames () {
firmware_size () { firmware_size () {
if [ "${BOARD}" = "virtual" ]; then if [ "${BOARD}" = "virtual" ]; then
echo "[Size not computed for virtual build]" echo "[Size not computed for virtual build]"
return return
fi fi
## This is a terrible hack, please don't hurt me. - algernon ## This is a terrible hack, please don't hurt me. - algernon
MAX_PROG_SIZE=28672 MAX_PROG_SIZE=28672
output="$($@ | grep "\\(Program\\|Data\\):" | sed -e 's,^, - ,' && echo)" output="$("$@" | grep "\\(Program\\|Data\\):" | sed -e 's,^, - ,' && echo)"
PROGSIZE="$(echo "${output}" | grep Program: | cut -d: -f2 | awk '{print $1}')" PROGSIZE="$(echo "${output}" | grep "Program:" | cut -d: -f2 | awk '{print $1}')"
PERCENT="$(echo ${PROGSIZE} ${MAX_PROG_SIZE} | awk "{ printf \"%02.01f\", \$1 / \$2 * 100 }")" PERCENT="$(echo "${PROGSIZE}" "${MAX_PROG_SIZE}" | awk "{ printf \"%02.01f\", \$1 / \$2 * 100 }")"
# we want the sed there, doing with shell builtins would be worse.
# shellcheck disable=SC2001
echo "${output}" | sed -e "s/\(Program:.*\)(\([0-9\.]*%\) Full)/\1(${PERCENT}% Full)/" echo "${output}" | sed -e "s/\(Program:.*\)(\([0-9\.]*%\) Full)/\1(${PERCENT}% Full)/"
} }
find_sketch () { find_sketch () {
SKETCH="${SKETCH:-${DEFAULT_SKETCH}}" SKETCH="${SKETCH:-${DEFAULT_SKETCH}}"
LIBRARY="${LIBRARY:-${SKETCH}}" LIBRARY="${LIBRARY:-${SKETCH}}"
@ -68,7 +71,10 @@ prepare_to_flash () {
fi fi
echo "Press ENTER when ready..." echo "Press ENTER when ready..."
read a
# We do not want to permit line continuations here. We just want a newline.
# shellcheck disable=SC2162
read
} }
flash () { flash () {
@ -85,7 +91,7 @@ flash_over_usb () {
return 1 return 1
fi fi
sleep 1s sleep 1s
${AVRDUDE} -q -q -C ${AVRDUDE_CONF} -p${MCU} -cavr109 -D -P ${DEVICE_PORT_BOOTLOADER} -b57600 "-Uflash:w:${HEX_FILE_PATH}:i" ${AVRDUDE} -q -q -C "${AVRDUDE_CONF}" -p"${MCU}" -cavr109 -D -P "${DEVICE_PORT_BOOTLOADER}" -b57600 "-Uflash:w:${HEX_FILE_PATH}:i"
} }
flash_from_bootloader() { flash_from_bootloader() {
@ -101,8 +107,8 @@ program() {
flash_with_programmer() { flash_with_programmer() {
${AVRDUDE} -v \ ${AVRDUDE} -v \
-C ${AVRDUDE_CONF} \ -C "${AVRDUDE_CONF}" \
-p${MCU} \ -p"${MCU}" \
-cusbtiny \ -cusbtiny \
-D \ -D \
-B 1 \ -B 1 \
@ -114,24 +120,24 @@ hex_with_bootloader () {
compile compile
fi fi
cat ${HEX_FILE_PATH} | awk '/^:00000001FF/ == 0' > ${HEX_FILE_WITH_BOOTLOADER_PATH} awk '/^:00000001FF/ == 0' "${HEX_FILE_PATH}" > "${HEX_FILE_WITH_BOOTLOADER_PATH}"
echo "Using ${BOOTLOADER_PATH}" echo "Using ${BOOTLOADER_PATH}"
${MD5} ${BOOTLOADER_PATH} ${MD5} "${BOOTLOADER_PATH}"
cat ${BOOTLOADER_PATH} >> ${HEX_FILE_WITH_BOOTLOADER_PATH} cat "${BOOTLOADER_PATH}" >> "${HEX_FILE_WITH_BOOTLOADER_PATH}"
ln -sf "${HEX_FILE_WITH_BOOTLOADER_PATH}" "${OUTPUT_PATH}/${SKETCH}-latest-with-bootloader.hex" ln -sf -- "${HEX_FILE_WITH_BOOTLOADER_PATH}" "${OUTPUT_PATH}/${SKETCH}-latest-with-bootloader.hex"
cat <<EOF cat <<- EOF
Combined firmware and bootloader are now at ${HEX_FILE_WITH_BOOTLOADER_PATH} Combined firmware and bootloader are now at ${HEX_FILE_WITH_BOOTLOADER_PATH}
Make sure you have the bootloader version you expect. Make sure you have the bootloader version you expect.
And TEST THIS ON REAL HARDWARE BEFORE YOU GIVE IT TO ANYONE And TEST THIS ON REAL HARDWARE BEFORE YOU GIVE IT TO ANYONE
EOF EOF
} }
build () { build () {
compile $@ compile "$@"
size $@ size "$@"
} }
compile () { compile () {
@ -140,37 +146,47 @@ compile () {
install -d "${OUTPUT_PATH}" install -d "${OUTPUT_PATH}"
echo "Building ${OUTPUT_DIR}/${SKETCH} (${LIB_VERSION}) ..." echo "Building ${OUTPUT_DIR}/${SKETCH} (${LIB_VERSION}) ..."
# This is defined in the (optional) user config.
# shellcheck disable=SC2154
${compile_HOOKS} ${compile_HOOKS}
if [ -d "${ARDUINO_LOCAL_LIB_PATH}/libraries" ]; then if [ -d "${ARDUINO_LOCAL_LIB_PATH}/libraries" ]; then
# shellcheck disable=SC2089
# We want literal backslashes here, not arrays.
local_LIBS="-libraries \"${ARDUINO_LOCAL_LIB_PATH}/libraries\"" local_LIBS="-libraries \"${ARDUINO_LOCAL_LIB_PATH}/libraries\""
fi fi
ARDUINO_PACKAGES="" ARDUINO_PACKAGES=""
if [ -d ${ARDUINO_PACKAGE_PATH} ]; then if [ -d "${ARDUINO_PACKAGE_PATH}" ]; then
ARDUINO_PACKAGES="-hardware \"${ARDUINO_PACKAGE_PATH}\"" # shellcheck disable=SC2089
# We want literal backslashes here, not arrays.
ARDUINO_PACKAGES="-hardware \"${ARDUINO_PACKAGE_PATH}\""
fi fi
# SC2091: We do not care if quotes or backslashes are not respected.
# SC2086: We want word splitting.
# shellcheck disable=SC2086,SC2090
${ARDUINO_BUILDER} \ ${ARDUINO_BUILDER} \
-compile \ -compile \
${ARDUINO_PACKAGES} \ ${ARDUINO_PACKAGES} \
-hardware "${ARDUINO_PATH}/hardware" \ -hardware "${ARDUINO_PATH}/hardware" \
-hardware "${BOARD_HARDWARE_PATH}" \ -hardware "${BOARD_HARDWARE_PATH}" \
${ARDUINO_TOOLS_PARAM} \ ${ARDUINO_TOOLS_PARAM} \
-tools "${ARDUINO_PATH}/tools-builder" \ -tools "${ARDUINO_PATH}/tools-builder" \
-fqbn "${FQBN}" \ -fqbn "${FQBN}" \
-libraries "." \ -libraries "." \
-libraries "${ROOT}" \ -libraries "${ROOT}" \
-libraries "${BOARD_HARDWARE_PATH}/.." \ -libraries "${BOARD_HARDWARE_PATH}/.." \
${local_LIBS} \ ${local_LIBS} \
${EXTRA_BUILDER_ARGS} \ ${EXTRA_BUILDER_ARGS} \
-build-path "${BUILD_PATH}" \ -build-path "${BUILD_PATH}" \
-ide-version "${ARDUINO_IDE_VERSION}" \ -ide-version "${ARDUINO_IDE_VERSION}" \
-prefs "compiler.cpp.extra_flags=-std=c++11 -Woverloaded-virtual -Wno-unused-parameter -Wno-unused-variable -Wno-ignored-qualifiers ${ARDUINO_CFLAGS} ${LOCAL_CFLAGS}" \ -prefs "compiler.cpp.extra_flags=-std=c++11 -Woverloaded-virtual -Wno-unused-parameter -Wno-unused-variable -Wno-ignored-qualifiers ${ARDUINO_CFLAGS} ${LOCAL_CFLAGS}" \
-warnings all \ -warnings all \
${ARDUINO_VERBOSE} \ ${ARDUINO_VERBOSE} \
${ARDUINO_AVR_GCC_PREFIX_PARAM} \ ${ARDUINO_AVR_GCC_PREFIX_PARAM} \
"$(find_sketch)/${SKETCH}.ino" "$(find_sketch)/${SKETCH}.ino"
cp "${BUILD_PATH}/${SKETCH}.ino.hex" "${HEX_FILE_PATH}" cp "${BUILD_PATH}/${SKETCH}.ino.hex" "${HEX_FILE_PATH}"
cp "${BUILD_PATH}/${SKETCH}.ino.elf" "${ELF_FILE_PATH}" cp "${BUILD_PATH}/${SKETCH}.ino.elf" "${ELF_FILE_PATH}"
@ -178,17 +194,17 @@ compile () {
ln -sf "${OUTPUT_FILE_PREFIX}.elf" "${OUTPUT_PATH}/${SKETCH}-latest.elf" ln -sf "${OUTPUT_FILE_PREFIX}.elf" "${OUTPUT_PATH}/${SKETCH}-latest.elf"
if [ "${ARDUINO_VERBOSE}" = "-verbose" ]; then if [ "${ARDUINO_VERBOSE}" = "-verbose" ]; then
echo "Build artifacts can be found in ${BUILD_PATH}"; echo "Build artifacts can be found in ${BUILD_PATH}";
else else
rm -rf "${BUILD_PATH}" rm -rf "${BUILD_PATH}"
fi fi
} }
_find_all () { _find_all () {
for plugin in ./*.ino \ for plugin in ./*.ino \
examples/* \ examples/* \
src/*.ino; do src/*.ino; do
if [ -d "$(dirname ${plugin})" ] || [ -f "${plugin}" ]; then if [ -d "$(dirname "${plugin}")" ] || [ -f "${plugin}" ]; then
p="$(basename "${plugin}" .ino)" p="$(basename "${plugin}" .ino)"
if [ "${p}" != '*' ]; then if [ "${p}" != '*' ]; then
echo "${p}" echo "${p}"
@ -203,7 +219,7 @@ build_all () {
for plugin in ${plugins}; do for plugin in ${plugins}; do
export SKETCH="${plugin}" export SKETCH="${plugin}"
export LIBRARY="${plugin}" export LIBRARY="${plugin}"
$0 ${plugin} build $0 "${plugin}" build
done done
} }
@ -239,7 +255,7 @@ decompile () {
} }
clean () { clean () {
rm -rf "${OUTPUT_PATH}" rm -rf -- "${OUTPUT_PATH}"
} }
reset_device() { reset_device() {
@ -277,11 +293,11 @@ EOF
$DEVICE_PORT is not writable: $DEVICE_PORT is not writable:
`ls -l $DEVICE_PORT` $(ls -l "$DEVICE_PORT")
You are currently in the following groups: You are currently in the following groups:
`id -Gn` $(id -Gn)
Please ensure you have followed the instructions on setting up your Please ensure you have followed the instructions on setting up your
account to be in the right group: account to be in the right group:
@ -294,43 +310,43 @@ EOF
} }
usage () { usage () {
cat <<EOF cat <<- EOF
Usage: $0 SKETCH commands... Usage: $0 SKETCH commands...
Runs all of the commands in the context of the Sketch. Runs all of the commands in the context of the Sketch.
Available commands: Available commands:
help help
This help screen. This help screen.
compile compile
Compiles the sketch. Compiles the sketch.
size size
Reports the size of the compiled sketch. Reports the size of the compiled sketch.
build build
Runs compile and report-size. Runs compile and report-size.
clean clean
Cleans up the output directory. Cleans up the output directory.
size-map size-map
Displays the size map for the sketch. Displays the size map for the sketch.
disassemble disassemble
Decompile the sketch. Decompile the sketch.
reset-device reset-device
Reset the device. Reset the device.
flash flash
Flashes the firmware using avrdude. Flashes the firmware using avrdude.
build-all build-all
Build all Sketches we can find. Build all Sketches we can find.
EOF EOF
} }
help () { help () {
@ -349,23 +365,28 @@ fi
## ##
## - if there is only one argument, that's a command ## - if there is only one argument, that's a command
ROOT="$(cd $(dirname $0)/..; pwd)" ROOT="$(cd "$(dirname "$0")"/..; pwd)"
export ROOT export ROOT
# shellcheck disable=SC2155
export SOURCEDIR="$(pwd)" export SOURCEDIR="$(pwd)"
if [ -e "${HOME}/.kaleidoscope-builder.conf" ]; then if [ -e "${HOME}/.kaleidoscope-builder.conf" ]; then
# shellcheck disable=SC1090
. "${HOME}/.kaleidoscope-builder.conf" . "${HOME}/.kaleidoscope-builder.conf"
fi fi
if [ -e "${SOURCEDIR}/.kaleidoscope-builder.conf" ]; then if [ -e "${SOURCEDIR}/.kaleidoscope-builder.conf" ]; then
# shellcheck disable=SC1090
. "${SOURCEDIR}/.kaleidoscope-builder.conf" . "${SOURCEDIR}/.kaleidoscope-builder.conf"
fi fi
if [ -e "${SOURCEDIR}/kaleidoscope-builder.conf" ]; then if [ -e "${SOURCEDIR}/kaleidoscope-builder.conf" ]; then
# shellcheck disable=SC1090
. "${SOURCEDIR}/kaleidoscope-builder.conf" . "${SOURCEDIR}/kaleidoscope-builder.conf"
fi fi
. ${ROOT}/etc/kaleidoscope-builder.conf # shellcheck disable=SC1090
. "${ROOT}/etc/kaleidoscope-builder.conf"
if [ ! -z "${VERBOSE}" ] && [ "${VERBOSE}" -gt 0 ]; then if [ ! -z "${VERBOSE}" ] && [ "${VERBOSE}" -gt 0 ]; then
ARDUINO_VERBOSE="-verbose" ARDUINO_VERBOSE="-verbose"
@ -382,6 +403,8 @@ for i in $(seq 1 $#); do
case "${v}" in case "${v}" in
*=*) *=*)
# Exporting an expansion is *precisely* what we want here.
# shellcheck disable=SC2086,SC2163
export ${v} export ${v}
;; ;;
*) *)
@ -390,10 +413,12 @@ for i in $(seq 1 $#); do
esac esac
done done
# Word splitting is desired here.
# shellcheck disable=SC2086
set -- ${cmds} set -- ${cmds}
if [ $# -eq 1 ]; then if [ $# -eq 1 ]; then
cmd="$(echo $1 | tr '-' '_')" cmd="$(echo "$1" | tr '-' '_')"
${cmd} ${cmd}
exit $? exit $?
fi fi
@ -407,8 +432,9 @@ fi
cmds="" cmds=""
# shellcheck disable=2034
for i in $(seq 1 $#); do for i in $(seq 1 $#); do
cmds="${cmds} $(echo $1 | tr '-' '_')" cmds="${cmds} $(echo "$1" | tr '-' '_')"
shift shift
done done

Loading…
Cancel
Save