diff --git a/bin/glitz b/bin/glitz index f20f60ca..1c01df00 100755 --- a/bin/glitz +++ b/bin/glitz @@ -3,9 +3,8 @@ # Copyright 2021 Nathan L. Conrad # # 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, either version 3 of the License, or (at your option) any later -# version. +# the terms of version 3 of the GNU General Public License as published by the +# Free Software Foundation. # # 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 diff --git a/bin/ino b/bin/ino new file mode 100755 index 00000000..33e7a949 --- /dev/null +++ b/bin/ino @@ -0,0 +1,136 @@ +#!/usr/bin/env -S bash -e +# +# Copyright 2021 Nathan L. Conrad +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of version 3 of the GNU General Public License as published by the +# Free Software Foundation. +# +# 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. + +# Establish usage +IFS= read -rd '' usage << '__eof__' || true +Usage: ino [-cdghu] [sketch] + +Streamlines the compilation and development of an Arduino sketch + +Optional arguments: + -c, --clean Delete build output and if -d/--compilation-db, + -g/--debug, and -u/--upload are not set, exit + -d, --compilation-db Construct the compilation command database and exit + -g, --debug Optimize compilation for debugging + -h, --help Show this help message and exit + -u, --upload Upload after successful build + +Positional arguments: + sketch The Arduino sketch directory. Defaults to the current + working directory. +__eof__ + +# Usage: argerr msg +# +# Write an argument usage error message to standard error and fail +# +# Positional arguments: +# msg The core error message +function argerr +{ + echo "$1. Use -h for help." >&2 + exit 1 +} + +# Parse optional arguments +clean=0 +compilation_db=0 +debug=0 +upload=0 +while (( $# )) +do + # If the argument is a single hyphen followed by multiple single-character + # options, separate the first option from the argument and leave the rest + # for the next iteration + (( ${#1} > 2 )) && [[ $1 =~ ^-[^-]*$ ]] && \ + set -- "${1::2}" "-${1:2}" "${@:2}" + + # Handle the argument + case $1 in + -c|--clean) + clean=1 + ;; + -d|--compilation_db) + (( upload )) && argerr "$1 is incompatible with -u/--upload" + compilation_db=1 + ;; + -g|--debug) + debug=1 + ;; + -h|--help) + echo -n "$usage" + exit 0 + ;; + -u|--upload) + (( compilation_db )) && \ + argerr "$1 is incompatible with -d/--compilation-db" + upload=1 + ;; + --) + shift + break + ;; + -*|--*) + argerr "Invalid argument '$1'" + ;; + *) + break + esac + + # Advance to the next argument + shift +done + +# Change into the sketch directory +if (( $# )) +then + (( $# < 2 )) || argerr 'Too many positional arguments' + cd "$1" +fi + +# Clean +if (( clean )) +then + rm -fr .compilation-db bin + rm -f compile_commands.json + if (( !(compilation_db || debug || upload) )) + then + exit 0 + fi +fi + +# Construct Arduino CLI compile options +if [[ -f .ino ]] +then + IFS=$'\n' compile_opts=($(grep -v '^#' .ino | xargs -n 1)) +else + compile_opts=() +fi +if (( debug )) +then + compile_opts+=(--optimize-for-debug) +fi + +# Construct the compilation database +rm -fr .compilation-db +arduino-cli compile "${compile_opts[@]}" --only-compilation-database \ + --build-path .compilation-db +cp .compilation-db/compile_commands.json ./ + +# Build and upload +if (( upload )) +then + compile_opts+=(--upload) + compile_opts+=(--verify) +fi +arduino-cli compile "${compile_opts[@]}" --output-dir bin diff --git a/bin/sockhop b/bin/sockhop index 95e66b52..19ac4cf7 100755 --- a/bin/sockhop +++ b/bin/sockhop @@ -3,9 +3,8 @@ # Copyright 2021 Nathan L. Conrad # # 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, either version 3 of the License, or (at your option) any later -# version. +# the terms of version 3 of the GNU General Public License as published by the +# Free Software Foundation. # # 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