#!/usr/bin/env bash # kaleidoscope-builder - Kaleidoscope helper tool # Copyright (C) 2017-2018 Keyboard.io, Inc. # # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free Software # Foundation, version 3. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program. If not, see . set -e ###### ###### Build and output configuration ###### _run_arduino_cli() { "${ARDUINO_CLI}" "$@" } _arduino_prop() { pref=$1 # Strip the preference name. And then strip leading and trailing quotations _arduino_props | grep --max-count=1 "${pref}=" | sed -e s/^.*"${pref}"=// -e 's/^"//' -e 's/"$//' } _arduino_props() { if [ "x${_ARDUINO_PREFS}x" == "xx" ]; then _ARDUINO_PREFS=$(_run_arduino_cli --fqbn "${FQBN}" compile --show-properties "${SKETCH_FILE_PATH}") fi echo "$_ARDUINO_PREFS" } _find_sketch() { if [ -z "${SKETCH_FILE_PATH}" ] || [ ! -f "${SKETCH_FILE_PATH}" ]; then # Didn't find a sketch echo "I couldn't find your sketch (.ino file)" >&2 exit 1 fi } cmd_flash() { #TODO (arduino team) I'd love to do this with their json output #but it's short some of the data we kind of need port=$(_run_arduino_cli board list --format=text | grep "$FQBN" |cut -d' ' -f 1) flashing_instructions=$(_arduino_prop 'build.flashing_instructions') : "${flashing_instructions:="If your keyboard needs you to do something to put it in flashing mode, do that now."}" printf '%b\n\n' "${flashing_instructions}" echo "When you're ready to proceed, press 'Enter'." # We do not want to permit line continuations here. We just want a newline. # shellcheck disable=SC2162 read _run_arduino_cli upload --fqbn "${FQBN}" --port "${port}" "${ARDUINO_VERBOSE}" } cmd_compile() { install -d "${OUTPUT_PATH}" echo "Building ${SKETCH_FILE_PATH}" # This is defined in the (optional) user config. # shellcheck disable=SC2154 # shellcheck disable=SC2086 _run_arduino_cli compile \ --fqbn "${FQBN}" \ --libraries "${KALEIDOSCOPE_DIR}/.." \ --build-path "${BUILD_PATH}" \ --output-dir "${OUTPUT_PATH}" \ --build-cache-path "${CORE_CACHE_PATH}" \ --build-properties "compiler.cpp.extra_flags=${LOCAL_CFLAGS}" \ --warnings all ${ARDUINO_VERBOSE} \ "${SKETCH_FILE_PATH}" if [ -z "${LIBONLY}" ]; then cp "${BUILD_PATH}/${SKETCH_FILE_NAME}.hex" "${HEX_FILE_PATH}" cp "${BUILD_PATH}/${SKETCH_FILE_NAME}.elf" "${ELF_FILE_PATH}" ln -sf "${OUTPUT_FILE_PREFIX}.hex" "${OUTPUT_PATH}/${SKETCH_BASE_NAME}-latest.hex" ln -sf "${OUTPUT_FILE_PREFIX}.elf" "${OUTPUT_PATH}/${SKETCH_BASE_NAME}-latest.elf" else cp "${BUILD_PATH}/${SKETCH_FILE_NAME}.a" "${LIB_FILE_PATH}" ln -sf "${OUTPUT_FILE_PREFIX}.a" "${OUTPUT_PATH}/${SKETCH_BASE_NAME}-latest.a" fi if [ "${ARDUINO_VERBOSE}" == "--verbose" ]; then echo "Build artifacts can be found in ${BUILD_PATH}" fi } cmd_help() { 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. clean Cleans up the output directory. size-map Displays the size map for the sketch. disassemble Decompile the sketch. flash Flashes the firmware using avrdude. EOF } if [ $# -lt 1 ]; then cmd_help exit 1 fi # shellcheck disable=SC1090 if [ $# -eq 1 ]; then cmd="$(echo "$1" | tr '-' '_')" "cmd_${cmd}" exit $? else "You passed more than two arguments to $0" help exit 1 / fi