From 77a04a01a3a87ee74e1f31aae375f0abf12acd8a Mon Sep 17 00:00:00 2001 From: me-no-dev Date: Sat, 28 Jan 2017 13:09:20 +0200 Subject: [PATCH] Initial travis pull from esp8266 --- .travis.yml | 54 ++++++++++++++++++++ tools/build.py | 130 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/common.sh | 86 ++++++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+) create mode 100644 .travis.yml create mode 100755 tools/build.py create mode 100755 tools/common.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..756f4670 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,54 @@ +sudo: false +language: bash +os: + - linux + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.8 + +script: + - set -e + - export CXX="g++-4.8" CC="gcc-4.8" GCOV="gcov-4.8" + - echo -e "travis_fold:start:host_tests" + - pushd $TRAVIS_BUILD_DIR/tests/host + - make + - make clean-objects + - echo -e "travis_fold:end:host_tests" + - echo -e "travis_fold:start:sketch_test_env_prepare" + - popd + - wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz + - tar xf arduino.tar.xz + - mv arduino-nightly $HOME/arduino_ide + - cd $HOME/arduino_ide/hardware + - mkdir espressif + - cd espressif + - ln -s $TRAVIS_BUILD_DIR esp32 + - cd esp32/tools + - python get.py + - export PATH="$HOME/arduino_ide:$TRAVIS_BUILD_DIR/tools/xtensa-esp32-elf/bin:$PATH" + - which arduino + - cd $TRAVIS_BUILD_DIR + - source tools/common.sh + - install_libraries + - echo -e "travis_fold:end:sketch_test_env_prepare" + - echo -e "travis_fold:start:sketch_test" + - build_sketches $HOME/arduino_ide $TRAVIS_BUILD_DIR/libraries "-l $HOME/Arduino/libraries" + - echo -e "travis_fold:end:sketch_test" + - echo -e "travis_fold:start:size_report" + - cat size.log + - echo -e "travis_fold:end:size_report" + +notifications: + email: + on_success: change + on_failure: change + webhooks: + urls: + - https://webhooks.gitter.im/e/cb057279c430d91a47a8 + on_success: change # options: [always|never|change] default: always + on_failure: always # options: [always|never|change] default: always + on_start: false # default: false diff --git a/tools/build.py b/tools/build.py new file mode 100755 index 00000000..148f3964 --- /dev/null +++ b/tools/build.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# build.py — build a sketch using arduino-builder +# +# Wrapper script around arduino-builder which accepts some ESP8266-specific +# options and translates them into FQBN +# +# Copyright © 2016 Ivan Grokhotkov +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# + + +from __future__ import print_function +import sys +import os +import argparse +import subprocess +import tempfile +import shutil + +def compile(tmp_dir, sketch, tools_dir, hardware_dir, ide_path, f, args): + cmd = ide_path + '/arduino-builder ' + cmd += '-compile -logger=human ' + cmd += '-build-path "' + tmp_dir + '" ' + cmd += '-tools "' + ide_path + '/tools-builder" ' + if args.library_path: + for lib_dir in args.library_path: + cmd += '-libraries "' + lib_dir + '" ' + cmd += '-hardware "' + ide_path + '/hardware" ' + if args.hardware_dir: + for hw_dir in args.hardware_dir: + cmd += '-hardware "' + hw_dir + '" ' + else: + cmd += '-hardware "' + hardware_dir + '" ' + # Debug=Serial,DebugLevel=Core____ + cmd += '-fqbn=espressif:esp32:{board_name}:' \ + 'FlashFreq={flash_freq},' \ + 'UploadSpeed=921600' + cmd += ' ' + cmd += '-ide-version=10607 ' + cmd += '-warnings={warnings} '.format(**vars(args)) + if args.verbose: + cmd += '-verbose ' + cmd += sketch + + if args.verbose: + print('Building: ' + cmd, file=f) + + cmds = cmd.split(' ') + p = subprocess.Popen(cmds, stdout=f, stderr=subprocess.STDOUT) + p.wait() + return p.returncode + +def parse_args(): + parser = argparse.ArgumentParser(description='Sketch build helper') + parser.add_argument('-v', '--verbose', help='Enable verbose output', + action='store_true') + parser.add_argument('-i', '--ide_path', help='Arduino IDE path') + parser.add_argument('-p', '--build_path', help='Build directory') + parser.add_argument('-l', '--library_path', help='Additional library path', + action='append') + parser.add_argument('-d', '--hardware_dir', help='Additional hardware path', + action='append') + parser.add_argument('-b', '--board_name', help='Board name', default='esp32') + parser.add_argument('-w', '--warnings', help='Compilation warnings level', + default='none', choices=['none', 'all', 'more']) + parser.add_argument('-o', '--output_binary', help='File name for output binary') + parser.add_argument('-k', '--keep', action='store_true', + help='Don\'t delete temporary build directory') + parser.add_argument('--flash_freq', help='Flash frequency', default=40, + type=int, choices=[40, 80]) + parser.add_argument('sketch_path', help='Sketch file path') + return parser.parse_args() + +def main(): + args = parse_args() + + ide_path = args.ide_path + if not ide_path: + ide_path = os.environ.get('ARDUINO_IDE_PATH') + if not ide_path: + print("Please specify Arduino IDE path via --ide_path option" + "or ARDUINO_IDE_PATH environment variable.", file=sys.stderr) + return 2 + + sketch_path = args.sketch_path + tmp_dir = args.build_path + created_tmp_dir = False + if not tmp_dir: + tmp_dir = tempfile.mkdtemp() + created_tmp_dir = True + + tools_dir = os.path.dirname(os.path.realpath(__file__)) + '/../tools' + # this is not the correct hardware folder to add. + hardware_dir = os.path.dirname(os.path.realpath(__file__)) + '/../cores' + + output_name = tmp_dir + '/' + os.path.basename(sketch_path) + '.bin' + if args.verbose: + print("Sketch: ", sketch_path) + print("Build dir: ", tmp_dir) + print("Output: ", output_name) + + if args.verbose: + f = sys.stdout + else: + f = open(tmp_dir + '/build.log', 'w') + + res = compile(tmp_dir, sketch_path, tools_dir, hardware_dir, ide_path, f, args) + if res != 0: + return res + + if args.output_binary is not None: + shutil.copy(output_name, args.output_binary) + + if created_tmp_dir and not args.keep: + shutil.rmtree(tmp_dir, ignore_errors=True) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tools/common.sh b/tools/common.sh new file mode 100755 index 00000000..36db0c8d --- /dev/null +++ b/tools/common.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +function print_size_info() +{ + elf_file=$1 + + if [ -z "$elf_file" ]; then + printf "sketch data rodata bss text irom0.text dram flash\n" + return 0 + fi + + elf_name=$(basename $elf_file) + sketch_name="${elf_name%.*}" + # echo $sketch_name + declare -A segments + while read -a tokens; do + seg=${tokens[0]} + seg=${seg//./} + size=${tokens[1]} + addr=${tokens[2]} + if [ "$addr" -eq "$addr" -a "$addr" -ne "0" ] 2>/dev/null; then + segments[$seg]=$size + fi + + + done < <(xtensa-esp32-elf-size --format=sysv $elf_file) + + total_ram=$((${segments[data]} + ${segments[rodata]} + ${segments[bss]})) + total_flash=$((${segments[data]} + ${segments[rodata]} + ${segments[text]} + ${segments[irom0text]})) + + printf "%-28s %-8d %-8d %-8d %-8d %-8d %-8d %-8d\n" $sketch_name ${segments[data]} ${segments[rodata]} ${segments[bss]} ${segments[text]} ${segments[irom0text]} $total_ram $total_flash + return 0 +} + +function build_sketches() +{ + set +e + local arduino=$1 + local srcpath=$2 + local build_arg=$3 + local build_dir=build.tmp + mkdir -p $build_dir + local build_cmd="python tools/build.py -b generic -v -k -p $PWD/$build_dir $build_arg " + local sketches=$(find $srcpath -name *.ino) + print_size_info >size.log + export ARDUINO_IDE_PATH=$arduino + for sketch in $sketches; do + rm -rf $build_dir/* + local sketchdir=$(dirname $sketch) + local sketchdirname=$(basename $sketchdir) + local sketchname=$(basename $sketch) + if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then + echo "Skipping $sketch, beacause it is not the main sketch file"; + continue + fi; + if [[ -f "$sketchdir/.test.skip" ]]; then + echo -e "\n ------------ Skipping $sketch ------------ \n"; + continue + fi + echo -e "\n ------------ Building $sketch ------------ \n"; + # $arduino --verify $sketch; + echo "$build_cmd $sketch" + time ($build_cmd $sketch >build.log) + local result=$? + if [ $result -ne 0 ]; then + echo "Build failed ($1)" + echo "Build log:" + cat build.log + return $result + fi + rm build.log + print_size_info $build_dir/*.elf >>size.log + done + set -e +} + +function install_libraries() +{ + mkdir -p $HOME/Arduino/libraries + pushd $HOME/Arduino/libraries + + # install ArduinoJson library + #wget https://github.com/bblanchon/ArduinoJson/releases/download/v4.6.1/ArduinoJson-v4.6.1.zip && unzip ArduinoJson-v4.6.1.zip + + popd +}