|
|
- #!/bin/bash
- set -e
-
- # Utility
- is_git() {
- command -v git >/dev/null 2>&1 || return 1
- command git rev-parse >/dev/null 2>&1 || return 1
-
- return 0
- }
-
- stat_bytes() {
- case "$(uname -s)" in
- Darwin) stat -f %z "$1";;
- *) stat -c %s "$1";;
- esac
- }
-
- # Script settings
-
- destination=../firmware
- version_file=espurna/config/version.h
- version=$(grep -E '^#define APP_VERSION' $version_file | awk '{print $3}' | sed 's/"//g')
- script_build_environments=true
- script_build_webui=true
-
- release_mode=false
-
- if ${TRAVIS:-false}; then
- git_revision=${TRAVIS_COMMIT::7}
- git_tag=${TRAVIS_TAG}
- elif is_git; then
- git_revision=$(git rev-parse --short HEAD)
- git_tag=$(git tag --contains HEAD)
- else
- git_revision=unknown
- git_tag=
- fi
-
- if [[ -n $git_tag ]]; then
- new_version=${version/-*}
- sed -i -e "s@$version@$new_version@" $version_file
- version=$new_version
- trap "git checkout -- $version_file" EXIT
- fi
-
- # Available environments
- list_envs() {
- grep -E '^\[env:' platformio.ini | sed 's/\[env:\(.*\)\]/\1/g'
- }
-
- available=$(list_envs | grep -Ev -- '-ota$|-ssl$|-secure-client.*$|^esp8266-.*base$' | sort)
-
- # Functions
- print_available() {
- echo "--------------------------------------------------------------"
- echo "Available environments:"
- for environment in $available; do
- echo "* $environment"
- done
- }
-
- print_environments() {
- echo "--------------------------------------------------------------"
- echo "Current environments:"
- for environment in $environments; do
- echo "* $environment"
- done
- }
-
- set_default_environments() {
- # Fallback to all available environments
- environments=$available
- }
-
- build_webui() {
- # Build system uses gulpscript.js to build web interface
- if [ ! -e node_modules/gulp/bin/gulp.js ]; then
- echo "--------------------------------------------------------------"
- echo "Installing dependencies..."
- npm install --only=dev
- fi
-
- # Recreate web interface (espurna/data/index.html.*.gz.h)
- echo "--------------------------------------------------------------"
- echo "Building web interface..."
- node node_modules/gulp/bin/gulp.js || exit
-
- # TODO: do something if webui files are different
- # for now, just print in travis log
- if ${TRAVIS:-false}; then
- git --no-pager diff --stat
- fi
- }
-
- build_release() {
- echo "--------------------------------------------------------------"
- echo "Building release images..."
- python scripts/generate_release_sh.py --ignore secure-client $version > release.sh
- bash release.sh
- echo "--------------------------------------------------------------"
- }
-
- build_environments() {
- echo "--------------------------------------------------------------"
- echo "Building firmware images..."
- mkdir -p $destination/espurna-$version
-
- for environment in $environments; do
- echo "* espurna-$version-$environment.bin"
- platformio run --silent --environment $environment || exit 1
- echo -n "SIZE: "
- stat_bytes .pio/build/$environment/firmware.bin
- [[ "${TRAVIS_BUILD_STAGE_NAME}" = "Test" ]] || \
- mv .pio/build/$environment/firmware.bin $destination/espurna-$version/espurna-$version-$environment.bin
- done
- echo "--------------------------------------------------------------"
- }
-
- # Parameters
- print_getopts_help() {
- cat <<EOF
- Usage: $(basename "$0") [OPTION] <ENVIRONMENT>...
-
- Where ENVIRONMENT is environment name(s) from platformio.ini
-
- Options:
-
- -f VALUE Filter build stage by name to skip it
- Supported VALUEs are "environments" and "webui"
- Can be specified multiple times.
- -r Release mode
- Generate build list through an external script.
- -l Print available environments
- -d VALUE Destination to move .bin files after building environments
- -h Display this message
- EOF
- }
-
- while getopts "f:lrpd:h" opt; do
- case $opt in
- f)
- case "$OPTARG" in
- webui) script_build_webui=false ;;
- environments) script_build_environments=false ;;
- esac
- ;;
- l)
- print_available
- exit
- ;;
- d)
- destination=$OPTARG
- ;;
- r)
- release_mode=true
- ;;
- h)
- print_getopts_help
- exit
- esac
- done
-
- shift $((OPTIND-1))
-
- # Welcome
- echo "--------------------------------------------------------------"
- echo "ESPURNA FIRMWARE BUILDER"
- echo "Building for version ${version}" ${git_revision:+($git_revision)}
-
- # Environments to build
- environments=$@
-
- if $script_build_webui ; then
- build_webui
- fi
-
- if $script_build_environments ; then
- if [ $# -eq 0 ]; then
- set_default_environments
- fi
-
- if $release_mode ; then
- build_release
- else
- build_environments
- fi
- fi
-
|