Compare commits
No commits in common. "master" and "dm-zero" have entirely different histories.
14 changed files with 178 additions and 1557 deletions
20
.github/workflows/githubci.yml
vendored
20
.github/workflows/githubci.yml
vendored
|
|
@ -1,20 +0,0 @@
|
|||
name: Github Arduino Library CI
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: pre-install
|
||||
run: bash ./actions_install.sh
|
||||
- name: test platforms
|
||||
run: |
|
||||
python3 build_platform.py uno leonardo mega2560 zero esp8266 esp32 pico_rp2040
|
||||
|
||||
22
.travis.yml
22
.travis.yml
|
|
@ -1,28 +1,12 @@
|
|||
language: python
|
||||
|
||||
dist: focal
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- ~/arduino_ide
|
||||
|
||||
git:
|
||||
depth: false
|
||||
quiet: true
|
||||
|
||||
|
||||
language: c
|
||||
sudo: false
|
||||
before_install:
|
||||
- source $TRAVIS_BUILD_DIR/install.sh
|
||||
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/${TRAVIS_REPO_SLUG}/${TRAVIS_BRANCH}/install.sh)
|
||||
script:
|
||||
- build_platform nrf52840
|
||||
- build_platform esp32
|
||||
- build_platform uno
|
||||
- build_platform leonardo
|
||||
- build_platform zero
|
||||
- build_platform esp8266
|
||||
- build_platform m4
|
||||
|
||||
notifications:
|
||||
email:
|
||||
on_success: change
|
||||
|
|
|
|||
|
|
@ -820,11 +820,45 @@ FILE_PATTERNS = *.c \
|
|||
*.cxx \
|
||||
*.cpp \
|
||||
*.c++ \
|
||||
*.java \
|
||||
*.ii \
|
||||
*.ixx \
|
||||
*.ipp \
|
||||
*.i++ \
|
||||
*.inl \
|
||||
*.idl \
|
||||
*.ddl \
|
||||
*.odl \
|
||||
*.h \
|
||||
*.hh \
|
||||
*.hxx \
|
||||
*.hpp \
|
||||
*.h++
|
||||
*.h++ \
|
||||
*.cs \
|
||||
*.d \
|
||||
*.php \
|
||||
*.php4 \
|
||||
*.php5 \
|
||||
*.phtml \
|
||||
*.inc \
|
||||
*.m \
|
||||
*.markdown \
|
||||
*.md \
|
||||
*.mm \
|
||||
*.dox \
|
||||
*.py \
|
||||
*.pyw \
|
||||
*.f90 \
|
||||
*.f95 \
|
||||
*.f03 \
|
||||
*.f08 \
|
||||
*.f \
|
||||
*.for \
|
||||
*.tcl \
|
||||
*.vhd \
|
||||
*.vhdl \
|
||||
*.ucf \
|
||||
*.qsf
|
||||
|
||||
# The RECURSIVE tag can be used to specify whether or not subdirectories should
|
||||
# be searched for input files as well.
|
||||
|
|
@ -855,7 +889,7 @@ EXCLUDE_SYMLINKS = NO
|
|||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories for example use the pattern */test/*
|
||||
|
||||
EXCLUDE_PATTERNS = *.md
|
||||
EXCLUDE_PATTERNS =
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
|
|
@ -2065,7 +2099,7 @@ INCLUDE_FILE_PATTERNS =
|
|||
# recursively expanded use the := operator instead of the = operator.
|
||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||
|
||||
PREDEFINED = __cdecl=
|
||||
PREDEFINED =
|
||||
|
||||
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
|
||||
# tag can be used to specify a list of macro names that should be expanded. The
|
||||
|
|
|
|||
189
README.md
189
README.md
|
|
@ -1,9 +1,9 @@
|
|||
# Travis CI Arduino Init Script [](https://travis-ci.com/adafruit/travis-ci-arduino)
|
||||
# Travis CI Arduino Init Script [](https://travis-ci.org/adafruit/travis-ci-arduino)
|
||||
|
||||
The purpose of this repo is to create a centrally managed dependency
|
||||
install script for all Adafruit Arduino Library Travis CI and Github Actions configs.
|
||||
install script for all Adafruit Arduino Library Travis CI configs.
|
||||
This will allow us to easily update the install steps without
|
||||
having to manually or programmatically update 100+ `.travis.yml` files.
|
||||
having to manually or programatically update 100+ `.travis.yml` files.
|
||||
|
||||
We have a guide that you can use to follow along to install both TravisCI and Doxygen generation here https://learn.adafruit.com/the-well-automated-arduino-library/
|
||||
|
||||
|
|
@ -12,59 +12,26 @@ We have a guide that you can use to follow along to install both TravisCI and Do
|
|||
You will need to source the script in the `before_install` step of your
|
||||
`.travis.yml` file.
|
||||
|
||||
```sh
|
||||
```
|
||||
source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
```
|
||||
|
||||
If you only want to install and build on certain platforms, you can set the
|
||||
`INSTALL_PLATFORMS` environment variable to a comma-separated list of platforms.
|
||||
|
||||
**Example `.travis.yml`:**
|
||||
```yaml
|
||||
```
|
||||
language: c
|
||||
sudo: false
|
||||
cache:
|
||||
directories:
|
||||
- ~/arduino_ide
|
||||
- ~/.arduino15/packages/
|
||||
git:
|
||||
depth: false
|
||||
quiet: true
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-trusty-5.0
|
||||
- key_url: 'http://apt.llvm.org/llvm-snapshot.gpg.key'
|
||||
packages:
|
||||
- clang-format-5.0
|
||||
env:
|
||||
global:
|
||||
# - ARDUINO_IDE_VERSION="1.8.10"
|
||||
- PRETTYNAME="Adafruit FT6206 Arduino Library"
|
||||
# Optional, will default to "$TRAVIS_BUILD_DIR/Doxyfile"
|
||||
# - DOXYFILE: $TRAVIS_BUILD_DIR/Doxyfile
|
||||
|
||||
before_install:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
- curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/run-clang-format.py > run-clang-format.py
|
||||
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
install:
|
||||
- arduino --install-library "Adafruit ILI9341","Adafruit GFX Library"
|
||||
|
||||
- arduino --install-library "Adafruit SleepyDog Library","Adafruit FONA Library"
|
||||
script:
|
||||
- python run-clang-format.py -r .
|
||||
- build_main_platforms
|
||||
|
||||
# Generate and deploy documentation
|
||||
after_success:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
|
||||
- build_main_platforms
|
||||
notifications:
|
||||
email:
|
||||
on_success: change
|
||||
on_failure: change
|
||||
```
|
||||
|
||||
**Choosing Arduino IDE version**
|
||||
|
||||
You could use any version of IDE by setting `ARDUINO_IDE_VERSION` variable but we recommend keeping this variable unused because script gets updated and you then will not have to modify `.travis.yml` manually.
|
||||
|
||||
## Automated Example Verification Bash Functions
|
||||
|
||||
`build_platform` will build all `.ino` examples in the repo using the passed platform. The platforms
|
||||
|
|
@ -74,13 +41,13 @@ All of the examples will be built with the platforms in `MAIN_PLATFORMS` if you
|
|||
and `AUX_PLATFORMS` can be used to define other platforms that don't need to be verified for every repo.
|
||||
|
||||
Build the examples using the platforms in the MAIN_PLATFORMS array:
|
||||
```yaml
|
||||
```
|
||||
script:
|
||||
- build_main_platforms
|
||||
```
|
||||
|
||||
Build the examples only using the trinket:
|
||||
```yaml
|
||||
```
|
||||
script:
|
||||
- build_platform trinket
|
||||
```
|
||||
|
|
@ -95,7 +62,7 @@ you wish to skip.
|
|||
For example, if you would like to skip the `esp8266` platform for an example
|
||||
in your lib called `blink.ino`, you would need to do something like this in your library repo:
|
||||
|
||||
```sh
|
||||
```
|
||||
$ touch examples/blink/.esp8266.test.skip
|
||||
$ git add -A
|
||||
$ git commit -a
|
||||
|
|
@ -104,7 +71,7 @@ $ git push
|
|||
|
||||
If you need an easy way to skip a platform, you can also add something like this to your `~/.bash_profile`:
|
||||
|
||||
```sh
|
||||
```
|
||||
function travis_skip()
|
||||
{
|
||||
|
||||
|
|
@ -129,128 +96,6 @@ function travis_skip()
|
|||
You will then be able to skip a platform for all examples by running the `travis_skip` function from your library repo.
|
||||
It will automatically add the `.YOUR_PLATFORM_HERE.test.skip` files to the examples.
|
||||
|
||||
```sh
|
||||
```
|
||||
$ travis_skip esp8266
|
||||
```
|
||||
|
||||
## Using external libraries
|
||||
External libraries (which are not hosted by the Arduino library manager) can be installed using the following command:
|
||||
```sh
|
||||
- if [ ! -d "$HOME/arduino_ide/libraries/<Name>" ]; then git clone <URL> $HOME/arduino_ide/libraries/<Name>; fi
|
||||
```
|
||||
|
||||
## Deploying compiled artifacts
|
||||
If you need to get hold of the compiled sketches of your project, in order to release them or forward them to an
|
||||
deployment pipeline, you can find them in the `$ARDUINO_HEX_DIR` directory. Specifically, if `Foo` is the name
|
||||
of your project, you are compiling for an `Arduino Mega` and the primary sketch is called `Foo.ino`, the flashable
|
||||
`.hex` files will be found inside `$ARDUINO_HEX_DIR/mega2560/Foo` as `Foo.ino.hex` and `Foo.ino.with_bootloader.hex`.
|
||||
Similarly for the rest of the platforms.
|
||||
|
||||
For example, assuming you have a `Foo` project as outlined above, to create a release which includes the `.hex`
|
||||
files on GitHub, you could add this to your `.travis.yml` configuration:
|
||||
|
||||
```yaml
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: YOUR_API_KEY_ENCRYPTED
|
||||
file:
|
||||
- $ARDUINO_HEX_DIR/mega2560/Foo/Foo.ino.hex
|
||||
- $ARDUINO_HEX_DIR/mega2560/Foo/Foo.ino.with_bootloader.hex
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
```
|
||||
|
||||
## Running build_platforms.py locally
|
||||
1. Install arduino-cli from here: https://arduino.github.io/arduino-cli/installation/
|
||||
2. Download ci-arduino
|
||||
* `git clone https://github.com/adafruit/ci-arduino`
|
||||
3. Put these lines at the end of your `.bashrc` or `.bash_profile` if you're on OSX. Make sure to fill in the path to where you installed ci-arduino and replacing USER with your username.
|
||||
```bash
|
||||
alias test-platforms='python3 ~/path/to/ci-arduino/build_platform.py'
|
||||
export HOME=/home/USER/
|
||||
```
|
||||
4. Run this at the top level of the library you want to test
|
||||
```bash
|
||||
adafruit@adafruit:~/Adafruit_BMP183_Library$ export GITHUB_WORKSPACE=$(pwd)
|
||||
```
|
||||
5. Remove everything in test library, and re-create it
|
||||
```bash
|
||||
adafruit@adafruit:~/Adafruit_BMP183_Library$ rm -rf ~/Arduino/libraries/Adafruit_Test_Library/; mkdir ~/Arduino/libraries/Adafruit_Test_Library
|
||||
```
|
||||
6. Still in the top-level directory of the library you'll be testing, copy the current library to Adafruit_Test_Library
|
||||
```bash
|
||||
adafruit@adafruit:~/Adafruit_BMP183_Library$ cp * ~/Arduino/libraries/Adafruit_Test_Library/
|
||||
```
|
||||
7. Grep for build_platform.py in githubci.yml to find out what boards to test.
|
||||
```bash
|
||||
adafruit@adafruit:~/Adafruit_BMP183_Library$ grep 'build_platform.py' .github/workflows/githubci.yml
|
||||
run: python3 ci/build_platform.py main_platforms
|
||||
```
|
||||
8. Run test-platforms. This may take a while, and tests for some boards sometimes run orders of magnitude slower than tests for other boards.
|
||||
```bash
|
||||
test-platforms main_platforms
|
||||
```
|
||||
OR, if githubci.yml specified other boards, let's say the metro m0 and pyportal, you'd run this:
|
||||
```bash
|
||||
test-platforms metro_m0 pyportal
|
||||
```
|
||||
|
||||
Here's what that returns
|
||||
```bash
|
||||
adafruit@adafruit:~/Adafruit_BMP183_Library$ test-platforms main_platforms
|
||||
build dir: /home/dherrada/Adafruit_BMP183_Library
|
||||
|
||||
########################################
|
||||
INSTALLING ARDUINO BOARDS
|
||||
########################################
|
||||
arduino-cli core update-index --additional-urls https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json,https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json > /dev/null
|
||||
|
||||
Installing Adafruit Unified Sensor
|
||||
arduino-cli lib install "Adafruit Unified Sensor" > /dev/null
|
||||
arduino-cli lib uninstall "Adafruit BMP183 Library"
|
||||
Library Adafruit BMP183 Library is not installed
|
||||
Libraries installed: ['/home/adafruit/Arduino/libraries/Adafruit_VL53L0X', '/home/adafruit/Arduino/libraries/RTClib', '/home/adafruit/Arduino/libraries/Adafruit-RGB-LCD-Shield-Library', '/home/adafruit/Arduino/libraries/readme.txt', '/home/adafruit/Arduino/libraries/Adafruit_Test_Library', '/home/adafruit/Arduino/libraries/Adafruit_Unified_Sensor']
|
||||
elif isinstance(platform, collections.Iterable):
|
||||
################################################################################
|
||||
SWITCHING TO arduino:avr:uno
|
||||
Installing arduino:avr ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO arduino:avr:leonardo
|
||||
Installing arduino:avr ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO arduino:avr:mega:cpu=atmega2560
|
||||
Installing arduino:avr ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO arduino:samd:arduino_zero_native
|
||||
Installing arduino:samd ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO esp8266:esp8266:huzzah:eesz=4M3M,xtal=80
|
||||
Installing esp8266:esp8266 ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO esp32:esp32:featheresp32:FlashFreq=80
|
||||
Installing esp32:esp32 ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO adafruit:samd:adafruit_metro_m4:speed=120
|
||||
Installing adafruit:samd ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
################################################################################
|
||||
SWITCHING TO adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0
|
||||
Installing adafruit:nrf52 ✓
|
||||
################################################################################
|
||||
BMP183test.ino ✓
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
pip3 install clint pyserial setuptools adafruit-nrfutil
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libllvm8 -V
|
||||
sudo apt install -fy cppcheck clang-format-8
|
||||
if [ ! -f /usr/bin/clang-format ]; then
|
||||
sudo ln -s /usr/bin/clang-format-8 /usr/bin/clang-format
|
||||
fi
|
||||
|
||||
# make all our directories we need for files and libraries
|
||||
mkdir ${HOME}/.arduino15
|
||||
mkdir ${HOME}/.arduino15/packages
|
||||
mkdir ${HOME}/Arduino
|
||||
mkdir ${HOME}/Arduino/libraries
|
||||
|
||||
# install arduino IDE
|
||||
export PATH=$PATH:$GITHUB_WORKSPACE/bin
|
||||
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
|
||||
arduino-cli config init > /dev/null
|
||||
arduino-cli core update-index > /dev/null
|
||||
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="96" height="20"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="96" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="37" height="20" fill="#555"/><rect x="37" width="59" height="20" fill="#007ec6"/><rect width="96" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><text x="195" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="270">Docs</text><text x="195" y="140" transform="scale(.1)" textLength="270">Docs</text><text x="655" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="490">Doxygen</text><text x="655" y="140" transform="scale(.1)" textLength="490">Doxygen</text></g></svg>
|
||||
|
Before Width: | Height: | Size: 970 B |
|
|
@ -1,439 +0,0 @@
|
|||
import sys
|
||||
import glob
|
||||
import time
|
||||
import os
|
||||
import shutil
|
||||
from distutils.dir_util import copy_tree
|
||||
import subprocess
|
||||
import collections
|
||||
|
||||
# optional wall option cause build failed if has warnings
|
||||
BUILD_WALL = False
|
||||
BUILD_WARN = True
|
||||
if "--wall" in sys.argv:
|
||||
BUILD_WALL = True
|
||||
sys.argv.remove("--wall")
|
||||
|
||||
if "--no_warn" in sys.argv:
|
||||
BUILD_WARN = False
|
||||
sys.argv.remove("--no_warn")
|
||||
|
||||
# add user bin to path!
|
||||
BUILD_DIR = ''
|
||||
# add user bin to path!
|
||||
try:
|
||||
# If we're on actions
|
||||
BUILD_DIR = os.environ["GITHUB_WORKSPACE"]
|
||||
except KeyError:
|
||||
try:
|
||||
# If we're on travis
|
||||
BUILD_DIR = os.environ["TRAVIS_BUILD_DIR"]
|
||||
except KeyError:
|
||||
# If we're running on local machine
|
||||
BUILD_DIR = os.path.abspath(".")
|
||||
pass
|
||||
|
||||
os.environ["PATH"] += os.pathsep + BUILD_DIR + "/bin"
|
||||
print("build dir:", BUILD_DIR)
|
||||
|
||||
IS_LEARNING_SYS = False
|
||||
if "Adafruit_Learning_System_Guides" in BUILD_DIR:
|
||||
print("Found learning system repo")
|
||||
IS_LEARNING_SYS = True
|
||||
os.remove(BUILD_DIR + "/ci/examples/Blink/Blink.ino")
|
||||
os.rmdir(BUILD_DIR + "/ci/examples/Blink")
|
||||
elif "METROX-Examples-and-Project-Sketches" in BUILD_DIR:
|
||||
print("Found MetroX Examples Repo")
|
||||
IS_LEARNING_SYS = True
|
||||
|
||||
#os.system('pwd')
|
||||
#os.system('ls -lA')
|
||||
|
||||
CROSS = u'\N{cross mark}'
|
||||
CHECK = u'\N{check mark}'
|
||||
|
||||
ALL_PLATFORMS={
|
||||
# classic Arduino AVR
|
||||
"uno" : ["arduino:avr:uno", None],
|
||||
"leonardo" : ["arduino:avr:leonardo", None],
|
||||
"mega2560" : ["arduino:avr:mega:cpu=atmega2560", None],
|
||||
# Arduino SAMD
|
||||
"zero" : ["arduino:samd:arduino_zero_native", "0x68ed2b88"],
|
||||
"cpx" : ["arduino:samd:adafruit_circuitplayground_m0", "0x68ed2b88"],
|
||||
# Espressif
|
||||
"esp8266" : ["esp8266:esp8266:huzzah:eesz=4M3M,xtal=80", None],
|
||||
"esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None],
|
||||
"magtag" : ["esp32:esp32:adafruit_magtag29_esp32s2", "0xbfdd4eee"],
|
||||
"funhouse" : ["esp32:esp32:adafruit_funhouse_esp32s2", "0xbfdd4eee"],
|
||||
"metroesp32s2" : ["esp32:esp32:adafruit_metro_esp32s2", "0xbfdd4eee"],
|
||||
"qtpy_esp32s2" : ["esp32:esp32:adafruit_qtpy_esp32s2", "0xbfdd4eee"],
|
||||
"feather_esp32s2" : ["esp32:esp32:adafruit_feather_esp32s2", "0xbfdd4eee"],
|
||||
"feather_esp32s2_tft" : ["esp32:esp32:adafruit_feather_esp32s2_tft", "0xbfdd4eee"],
|
||||
# Adafruit AVR
|
||||
"trinket_3v" : ["adafruit:avr:trinket3", None],
|
||||
"trinket_5v" : ["adafruit:avr:trinket5", None],
|
||||
"protrinket_3v" : ["adafruit:avr:protrinket3", None],
|
||||
"protrinket_5v" : ["adafruit:avr:protrinket5", None],
|
||||
"gemma" : ["adafruit:avr:gemma", None],
|
||||
"flora" : ["adafruit:avr:flora8", None],
|
||||
"feather32u4" : ["adafruit:avr:feather32u4", None],
|
||||
"cpc" : ["arduino:avr:circuitplay32u4cat", None],
|
||||
# Adafruit SAMD
|
||||
"gemma_m0" : ["adafruit:samd:adafruit_gemma_m0", "0x68ed2b88"],
|
||||
"trinket_m0" : ["adafruit:samd:adafruit_trinket_m0", "0x68ed2b88"],
|
||||
"feather_m0_express" : ["adafruit:samd:adafruit_feather_m0_express", "0x68ed2b88"],
|
||||
"feather_m4_express" : ["adafruit:samd:adafruit_feather_m4:speed=120", "0x68ed2b88"],
|
||||
"feather_m4_express_tinyusb" : ["adafruit:samd:adafruit_feather_m4:speed=120,usbstack=tinyusb", "0x68ed2b88"],
|
||||
"feather_m4_can" : ["adafruit:samd:adafruit_feather_m4_can:speed=120", "0x68ed2b88"],
|
||||
"feather_m4_can_tinyusb" : ["adafruit:samd:adafruit_feather_m4_can:speed=120,usbstack=tinyusb", "0x68ed2b88"],
|
||||
"metro_m0" : ["adafruit:samd:adafruit_metro_m0", "0x68ed2b88"],
|
||||
"metro_m0_tinyusb" : ["adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", "0x68ed2b88"],
|
||||
"metro_m4" : ["adafruit:samd:adafruit_metro_m4:speed=120", "0x55114460"],
|
||||
"metro_m4_tinyusb" : ["adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"metro_m4_airliftlite" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120", "0x55114460"],
|
||||
"metro_m4_airliftlite_tinyusb" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"pybadge" : ["adafruit:samd:adafruit_pybadge_m4:speed=120", "0x55114460"],
|
||||
"pybadge_tinyusb" : ["adafruit:samd:adafruit_pybadge_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"pygamer" : ["adafruit:samd:adafruit_pygamer_m4:speed=120", "0x55114460"],
|
||||
"pygamer_tinyusb" : ["adafruit:samd:adafruit_pygamer_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"hallowing_m0" : ["adafruit:samd:adafruit_hallowing", "0x68ed2b88"],
|
||||
"hallowing_m4" : ["adafruit:samd:adafruit_hallowing_m4:speed=120", "0x55114460"],
|
||||
"hallowing_m4_tinyusb" : ["adafruit:samd:adafruit_hallowing_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"neotrellis_m4" : ["adafruit:samd:adafruit_trellis_m4:speed=120", "0x55114460"],
|
||||
"monster_m4sk" : ["adafruit:samd:adafruit_monster_m4sk:speed=120", "0x55114460"],
|
||||
"monster_m4sk_tinyusb" : ["adafruit:samd:adafruit_monster_m4sk:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"pyportal" : ["adafruit:samd:adafruit_pyportal_m4:speed=120", "0x55114460"],
|
||||
"pyportal_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"pyportal_titano" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120", "0x55114460"],
|
||||
"pyportal_titano_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"cpx_ada" : ["adafruit:samd:adafruit_circuitplayground_m0", "0x68ed2b88"],
|
||||
"grand_central" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120", "0x55114460"],
|
||||
"grand_central_tinyusb" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"matrixportal" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120", "0x55114460"],
|
||||
"matrixportal_tinyusb" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120,usbstack=tinyusb", "0x55114460"],
|
||||
"neotrinkey_m0" : ["adafruit:samd:adafruit_neotrinkey_m0", "0x68ed2b88"],
|
||||
"rotarytrinkey_m0" : ["adafruit:samd:adafruit_rotarytrinkey_m0", "0x68ed2b88"],
|
||||
"neokeytrinkey_m0" : ["adafruit:samd:adafruit_neokeytrinkey_m0", "0x68ed2b88"],
|
||||
"slidetrinkey_m0" : ["adafruit:samd:adafruit_slidetrinkey_m0", "0x68ed2b88"],
|
||||
"proxlighttrinkey_m0" : ["adafruit:samd:adafruit_proxlighttrinkey_m0", "0x68ed2b88"],
|
||||
"qtpy_m0" : ["adafruit:samd:adafruit_qtpy_m0", "0x68ed2b88"],
|
||||
"qtpy_m0_tinyusb" : ["adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", "0x68ed2b88"],
|
||||
# Arduino nRF
|
||||
"microbit" : ["sandeepmistry:nRF5:BBCmicrobit:softdevice=s110", None],
|
||||
# Adafruit nRF
|
||||
"nrf52832" : ["adafruit:nrf52:feather52832:softdevice=s132v6,debug=l0", None],
|
||||
"nrf52840" : ["adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0", "0xada52840"],
|
||||
"cpb" : ["adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0", "0xada52840"],
|
||||
"clue" : ["adafruit:nrf52:cluenrf52840:softdevice=s140v6,debug=l0", "0xada52840"],
|
||||
"ledglasses_nrf52840" : ["adafruit:nrf52:ledglasses_nrf52840:softdevice=s140v6,debug=l0", "0xada52840"],
|
||||
# RP2040 (Philhower)
|
||||
"pico_rp2040" : ["rp2040:rp2040:rpipico:freq=125,flash=2097152_0", "0xe48bff56"],
|
||||
"pico_rp2040_tinyusb" : ["rp2040:rp2040:rpipico:flash=2097152_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
|
||||
"feather_rp2040" : ["rp2040:rp2040:adafruit_feather:freq=125,flash=8388608_0", "0xe48bff56"],
|
||||
"feather_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_feather:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
|
||||
"qt2040_trinkey" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:freq=125,flash=8388608_0", "0xe48bff56"],
|
||||
"qt2040_trinkey_tinyusb" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56"],
|
||||
# Attiny8xy, 16xy, 32xy (SpenceKonde)
|
||||
"attiny3217" : ["megaTinyCore:megaavr:atxy7:chip=3217", None],
|
||||
"attiny3216" : ["megaTinyCore:megaavr:atxy6:chip=3216", None],
|
||||
"attiny1617" : ["megaTinyCore:megaavr:atxy7:chip=1617", None],
|
||||
"attiny1616" : ["megaTinyCore:megaavr:atxy6:chip=1616", None],
|
||||
"attiny1607" : ["megaTinyCore:megaavr:atxy7:chip=1607", None],
|
||||
"attiny1606" : ["megaTinyCore:megaavr:atxy6:chip=1606", None],
|
||||
"attiny817" : ["megaTinyCore:megaavr:atxy7:chip=817", None],
|
||||
"attiny816" : ["megaTinyCore:megaavr:atxy6:chip=816", None],
|
||||
"attiny807" : ["megaTinyCore:megaavr:atxy7:chip=807", None],
|
||||
"attiny806" : ["megaTinyCore:megaavr:atxy6:chip=806", None],
|
||||
# groupings
|
||||
"main_platforms" : ("uno", "leonardo", "mega2560", "zero", "qtpy_m0",
|
||||
"esp8266", "esp32", "metro_m4", "trinket_m0"),
|
||||
"arcada_platforms" : ("pybadge", "pygamer", "hallowing_m4",
|
||||
"cpb", "cpx_ada"),
|
||||
"wippersnapper_platforms" : ("metro_m4_airliftlite_tinyusb", "pyportal_tinyusb"),
|
||||
"rp2040_platforms" : ("pico_rp2040", "feather_rp2040")
|
||||
}
|
||||
|
||||
BSP_URLS = "https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json,https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json,https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json,http://drazzy.com/package_drazzy.com_index.json"
|
||||
|
||||
class ColorPrint:
|
||||
|
||||
@staticmethod
|
||||
def print_fail(message, end = '\n'):
|
||||
sys.stdout.write('\x1b[1;31m' + message.strip() + '\x1b[0m' + end)
|
||||
|
||||
@staticmethod
|
||||
def print_pass(message, end = '\n'):
|
||||
sys.stdout.write('\x1b[1;32m' + message.strip() + '\x1b[0m' + end)
|
||||
|
||||
@staticmethod
|
||||
def print_warn(message, end = '\n'):
|
||||
sys.stdout.write('\x1b[1;33m' + message.strip() + '\x1b[0m' + end)
|
||||
|
||||
@staticmethod
|
||||
def print_info(message, end = '\n'):
|
||||
sys.stdout.write('\x1b[1;34m' + message.strip() + '\x1b[0m' + end)
|
||||
|
||||
@staticmethod
|
||||
def print_bold(message, end = '\n'):
|
||||
sys.stdout.write('\x1b[1;37m' + message.strip() + '\x1b[0m' + end)
|
||||
|
||||
|
||||
def install_platform(platform):
|
||||
print("Installing", platform, end=" ")
|
||||
if platform == "adafruit:avr": # we have a platform dep
|
||||
install_platform("arduino:avr")
|
||||
if os.system("arduino-cli core install "+platform+" --additional-urls "+BSP_URLS+" > /dev/null") != 0:
|
||||
ColorPrint.print_fail("FAILED to install "+platform)
|
||||
exit(-1)
|
||||
ColorPrint.print_pass(CHECK)
|
||||
# print installed core version
|
||||
print(os.popen('arduino-cli core list | grep {}'.format(platform)).read(), end='')
|
||||
|
||||
def run_or_die(cmd, error):
|
||||
print(cmd)
|
||||
attempt = 0
|
||||
while attempt < 3:
|
||||
if os.system(cmd) == 0:
|
||||
return
|
||||
attempt += 1
|
||||
print('attempt {} failed, {} retry left'.format(attempt, 3-attempt))
|
||||
time.sleep(5)
|
||||
ColorPrint.print_fail(error)
|
||||
exit(-1)
|
||||
|
||||
################################ Install Arduino IDE
|
||||
print()
|
||||
ColorPrint.print_info('#'*40)
|
||||
print("INSTALLING ARDUINO BOARDS")
|
||||
ColorPrint.print_info('#'*40)
|
||||
|
||||
run_or_die("arduino-cli core update-index --additional-urls "+BSP_URLS+
|
||||
" > /dev/null", "FAILED to update core indices")
|
||||
print()
|
||||
|
||||
################################ Install dependencies
|
||||
our_name=None
|
||||
try:
|
||||
if IS_LEARNING_SYS:
|
||||
libprop = open(BUILD_DIR+'/library.deps')
|
||||
else:
|
||||
libprop = open(BUILD_DIR+'/library.properties')
|
||||
for line in libprop:
|
||||
if line.startswith("name="):
|
||||
our_name = line.replace("name=", "").strip()
|
||||
if line.startswith("depends="):
|
||||
deps = line.replace("depends=", "").split(",")
|
||||
for dep in deps:
|
||||
dep = dep.strip()
|
||||
print("Installing "+dep)
|
||||
run_or_die('arduino-cli lib install "'+dep+'" > /dev/null',
|
||||
"FAILED to install dependency "+dep)
|
||||
except OSError:
|
||||
print("No library dep or properties found!")
|
||||
pass # no library properties
|
||||
|
||||
# Delete the existing library if we somehow downloaded
|
||||
# due to dependencies
|
||||
if our_name:
|
||||
run_or_die("arduino-cli lib uninstall \""+our_name+"\"", "Could not uninstall")
|
||||
|
||||
print("Libraries installed: ", glob.glob(os.environ['HOME']+'/Arduino/libraries/*'))
|
||||
|
||||
# link our library folder to the arduino libraries folder
|
||||
if not IS_LEARNING_SYS:
|
||||
try:
|
||||
os.symlink(BUILD_DIR, os.environ['HOME']+'/Arduino/libraries/' + os.path.basename(BUILD_DIR))
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
||||
################################ UF2 Utils.
|
||||
|
||||
def glob1(pattern):
|
||||
result = glob.glob(pattern)
|
||||
if len(result) != 1:
|
||||
raise RuntimeError(f"Required pattern {pattern} to match exactly 1 file, got {result}")
|
||||
return result[0]
|
||||
|
||||
def download_uf2_utils():
|
||||
"""Downloads uf2conv tools if we don't already have them
|
||||
"""
|
||||
cmd = "wget -nc --no-check-certificate http://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2families.json https://raw.githubusercontent.com/microsoft/uf2/master/utils/uf2conv.py"
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
||||
r = proc.wait(timeout=60)
|
||||
out = proc.stdout.read()
|
||||
err = proc.stderr.read()
|
||||
if r != 0:
|
||||
ColorPrint.print_fail("Failed to download UF2 Utils!")
|
||||
ColorPrint.print_fail(out.decode("utf-8"))
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
return False
|
||||
return True
|
||||
|
||||
def generate_uf2(example_path):
|
||||
"""Generates a .uf2 file from a .bin or .hex file.
|
||||
:param str example_path: A path to the compiled .bin or .hex file.
|
||||
|
||||
"""
|
||||
if not download_uf2_utils():
|
||||
return None
|
||||
cli_build_path = "build/*.*." + fqbn.split(':')[2] + "/*.hex"
|
||||
input_file = glob1(os.path.join(example_path, cli_build_path))
|
||||
output_file = os.path.splitext(input_file)[0] + ".uf2"
|
||||
family_id = ALL_PLATFORMS[platform][1]
|
||||
cmd = ['python3', 'uf2conv.py', input_file, '-c', '-f', family_id, '-o', output_file]
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
r = proc.wait(timeout=60)
|
||||
out = proc.stdout.read()
|
||||
err = proc.stderr.read()
|
||||
if r == 0 and not err:
|
||||
ColorPrint.print_pass(CHECK)
|
||||
ColorPrint.print_info(out.decode("utf-8"))
|
||||
else:
|
||||
ColorPrint.print_fail(CROSS)
|
||||
ColorPrint.print_fail(out.decode("utf-8"))
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
return None
|
||||
return output_file
|
||||
|
||||
################################ Test platforms
|
||||
platforms = []
|
||||
success = 0
|
||||
|
||||
# expand groups:
|
||||
for arg in sys.argv[1:]:
|
||||
platform = ALL_PLATFORMS.get(arg, None)
|
||||
if isinstance(platform, list):
|
||||
platforms.append(arg)
|
||||
elif isinstance(platform, tuple):
|
||||
for p in platform:
|
||||
platforms.append(p)
|
||||
else:
|
||||
print("Unknown platform: ", arg)
|
||||
exit(-1)
|
||||
|
||||
def test_examples_in_folder(folderpath):
|
||||
global success
|
||||
for example in sorted(os.listdir(folderpath)):
|
||||
examplepath = folderpath+"/"+example
|
||||
if os.path.isdir(examplepath):
|
||||
test_examples_in_folder(examplepath)
|
||||
continue
|
||||
if not examplepath.endswith(".ino"):
|
||||
continue
|
||||
|
||||
print('\t'+example, end=' ')
|
||||
# check if we should SKIP
|
||||
skipfilename = folderpath+"/."+platform+".test.skip"
|
||||
onlyfilename = folderpath+"/."+platform+".test.only"
|
||||
# check if we should GENERATE UF2
|
||||
gen_file_name = folderpath+"/."+platform+".generate"
|
||||
if os.path.exists(skipfilename):
|
||||
ColorPrint.print_warn("skipping")
|
||||
continue
|
||||
if glob.glob(folderpath+"/.*.test.only"):
|
||||
platformname = glob.glob(folderpath+"/.*.test.only")[0].split('.')[1]
|
||||
if platformname != "none" and not platformname in ALL_PLATFORMS:
|
||||
# uh oh, this isnt a valid testonly!
|
||||
ColorPrint.print_fail(CROSS)
|
||||
ColorPrint.print_fail("This example does not have a valid .platform.test.only file")
|
||||
success = 1
|
||||
continue
|
||||
if not os.path.exists(onlyfilename):
|
||||
ColorPrint.print_warn("skipping")
|
||||
continue
|
||||
if os.path.exists(gen_file_name):
|
||||
ColorPrint.print_info("generating")
|
||||
|
||||
if BUILD_WARN:
|
||||
if os.path.exists(gen_file_name):
|
||||
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, '-e', folderpath]
|
||||
else:
|
||||
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, folderpath]
|
||||
else:
|
||||
cmd = ['arduino-cli', 'compile', '--warnings', 'none', '--export-binaries', '--fqbn', fqbn, folderpath]
|
||||
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
try:
|
||||
out, err = proc.communicate(timeout=60)
|
||||
r = proc.returncode
|
||||
except:
|
||||
proc.kill()
|
||||
out, err = proc.communicate()
|
||||
r = 1
|
||||
|
||||
if r == 0 and not (err and BUILD_WALL == True):
|
||||
ColorPrint.print_pass(CHECK)
|
||||
if err:
|
||||
# also print out warning message
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
if os.path.exists(gen_file_name):
|
||||
if ALL_PLATFORMS[platform][1] == None:
|
||||
ColorPrint.print_info("Platform does not support UF2 files, skipping...")
|
||||
else:
|
||||
ColorPrint.print_info("Generating UF2...")
|
||||
filename = generate_uf2(folderpath)
|
||||
if filename is None:
|
||||
success = 1 # failure
|
||||
if IS_LEARNING_SYS:
|
||||
fqbnpath, uf2file = filename.split("/")[-2:]
|
||||
os.makedirs(BUILD_DIR+"/build", exist_ok=True)
|
||||
os.makedirs(BUILD_DIR+"/build/"+fqbnpath, exist_ok=True)
|
||||
shutil.copy(filename, BUILD_DIR+"/build/"+fqbnpath+"-"+uf2file)
|
||||
os.system("ls -lR "+BUILD_DIR+"/build")
|
||||
else:
|
||||
ColorPrint.print_fail(CROSS)
|
||||
ColorPrint.print_fail(out.decode("utf-8"))
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
success = 1
|
||||
|
||||
def test_examples_in_learningrepo(folderpath):
|
||||
global success
|
||||
for project in os.listdir(folderpath):
|
||||
projectpath = folderpath+"/"+project
|
||||
if os.path.isdir(learningrepo):
|
||||
test_examples_in_learningrepo(projectpath)
|
||||
continue
|
||||
if not projectpath.endswith(".ino"):
|
||||
continue
|
||||
# found an INO!
|
||||
print('\t'+projectpath, end=' ', flush=True)
|
||||
# check if we should SKIP
|
||||
skipfilename = folderpath+"/."+platform+".test.skip"
|
||||
onlyfilename = folderpath+"/."+platform+".test.only"
|
||||
if os.path.exists(skipfilename):
|
||||
ColorPrint.print_warn("skipping")
|
||||
continue
|
||||
elif glob.glob(folderpath+"/.*.test.only") and not os.path.exists(onlyfilename):
|
||||
ColorPrint.print_warn("skipping")
|
||||
continue
|
||||
|
||||
cmd = ['arduino-cli', 'compile', '--warnings', 'all', '--fqbn', fqbn, projectpath]
|
||||
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
r = proc.wait()
|
||||
out = proc.stdout.read()
|
||||
err = proc.stderr.read()
|
||||
if r == 0:
|
||||
ColorPrint.print_pass(CHECK)
|
||||
if err:
|
||||
# also print out warning message
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
else:
|
||||
ColorPrint.print_fail(CROSS)
|
||||
ColorPrint.print_fail(out.decode("utf-8"))
|
||||
ColorPrint.print_fail(err.decode("utf-8"))
|
||||
success = 1
|
||||
|
||||
|
||||
for platform in platforms:
|
||||
fqbn = ALL_PLATFORMS[platform][0]
|
||||
print('#'*80)
|
||||
ColorPrint.print_info("SWITCHING TO "+fqbn)
|
||||
install_platform(":".join(fqbn.split(':', 2)[0:2])) # take only first two elements
|
||||
print('#'*80)
|
||||
if not IS_LEARNING_SYS:
|
||||
test_examples_in_folder(BUILD_DIR+"/examples")
|
||||
else:
|
||||
test_examples_in_folder(BUILD_DIR)
|
||||
exit(success)
|
||||
|
|
@ -29,7 +29,7 @@ __AUTHOR__="Jeroen de Bruijn, modified by ladyada"
|
|||
# the gh-pages branch of a repository
|
||||
# Before this script is used there should already be a gh-pages branch in the
|
||||
# repository.
|
||||
#
|
||||
#
|
||||
################################################################################
|
||||
|
||||
################################################################################
|
||||
|
|
@ -38,32 +38,10 @@ echo 'Setting up the script...'
|
|||
# Exit with nonzero exit code if anything fails
|
||||
set -e
|
||||
|
||||
export IS_PULL=0
|
||||
|
||||
if [[ -z "${TRAVIS_BUILD_DIR}" ]]; then
|
||||
export BUILD_DIR=${GITHUB_WORKSPACE}
|
||||
export AUTH=${GITHUB_ACTOR}:${GH_REPO_TOKEN}
|
||||
export REPO_SLUG=${GITHUB_REPOSITORY}
|
||||
export COMMIT_SHA1=${GITHUB_SHA}
|
||||
export BUILD_ID="GitHub Actions run: ${GITHUB_RUN_ID}"
|
||||
if [ "$GITHUB_EVENT_NAME" == "pull_request" ]; then
|
||||
export IS_PULL=1
|
||||
fi
|
||||
else
|
||||
export BUILD_DIR=${TRAVIS_BUILD_DIR}
|
||||
export AUTH=${GH_REPO_TOKEN}
|
||||
export REPO_SLUG=${TRAVIS_REPO_SLUG}
|
||||
export COMMIT_SHA1=${TRAVIS_COMMIT}
|
||||
export BUILD_ID="Travis build: ${TRAVIS_BUILD_NUMBER}"
|
||||
if [ "${TRAVIS_PULL_REQUEST}" != "false" ]; then
|
||||
export IS_PULL=1
|
||||
fi
|
||||
fi
|
||||
|
||||
cd $BUILD_DIR
|
||||
cd $TRAVIS_BUILD_DIR
|
||||
|
||||
# The default version of doxygen is too old so we'll use a modern version
|
||||
wget -q https://cdn-learn.adafruit.com/assets/assets/000/067/405/original/doxygen-1.8.13.linux.bin.tar.gz
|
||||
wget -q ftp://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.13.linux.bin.tar.gz
|
||||
tar -xf doxygen-1.8.13.linux.bin.tar.gz
|
||||
mv doxygen-1.8.13/bin/doxygen .
|
||||
chmod +x doxygen
|
||||
|
|
@ -73,16 +51,16 @@ mkdir code_docs
|
|||
cd code_docs
|
||||
|
||||
# Get the current gh-pages branch
|
||||
git clone -b gh-pages https://github.com/${REPO_SLUG}.git
|
||||
export REPO_NAME=${REPO_SLUG#*/}
|
||||
cd ${REPO_NAME}
|
||||
git clone -b gh-pages https://github.com/${TRAVIS_REPO_SLUG}.git
|
||||
export TRAVIS_REPO_NAME=${TRAVIS_REPO_SLUG#*/}
|
||||
cd ${TRAVIS_REPO_NAME}
|
||||
|
||||
##### Configure git.
|
||||
# Set the push default to simple i.e. push only the current branch.
|
||||
git config --global push.default simple
|
||||
# Pretend to be an user called Doxygen CI.
|
||||
git config user.name "Doxygen CI"
|
||||
git config user.email "ci-arduino@invalid"
|
||||
# Pretend to be an user called Travis CI.
|
||||
git config user.name "Travis CI"
|
||||
git config user.email "travis@travis-ci.org"
|
||||
|
||||
# Remove everything currently in the gh-pages branch.
|
||||
# GitHub is smart enough to know which files have changed and which files have
|
||||
|
|
@ -90,7 +68,7 @@ git config user.email "ci-arduino@invalid"
|
|||
# can be safely cleaned, and it is sure that everything pushed later is the new
|
||||
# documentation.
|
||||
# If there's no index.html (forwarding stub) grab our default one
|
||||
shopt -s extglob
|
||||
shopt -s extglob
|
||||
if [ ! -f index.html ]; then
|
||||
rm -rf *
|
||||
curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_index.html > index.html
|
||||
|
|
@ -110,9 +88,9 @@ echo "" > .nojekyll
|
|||
echo 'Generating Doxygen code documentation...'
|
||||
# Redirect both stderr and stdout to the log file AND the console.
|
||||
|
||||
export DOXYFILE=${BUILD_DIR}/Doxyfile
|
||||
if [ ! -f ${DOXYFILE} ]; then
|
||||
if [ ! -f "$DOXYFILE" ]; then
|
||||
echo "Grabbing default Doxyfile"
|
||||
export DOXYFILE=${TRAVIS_BUILD_DIR}/Doxyfile
|
||||
|
||||
curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/Doxyfile.default > ${DOXYFILE}
|
||||
#sed -i "s/^INPUT .*/INPUT = ..\/../" ${DOXYFILE}
|
||||
|
|
@ -123,17 +101,11 @@ if [ ! -f ${DOXYFILE} ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
sed -i "s;^HTML_OUTPUT .*;HTML_OUTPUT = code_docs/${REPO_NAME}/html;" ${DOXYFILE}
|
||||
cd $BUILD_DIR
|
||||
sed -i "s;^HTML_OUTPUT .*;HTML_OUTPUT = code_docs/${TRAVIS_REPO_NAME}/html;" ${DOXYFILE}
|
||||
cd $TRAVIS_BUILD_DIR
|
||||
|
||||
if [ ! -z $1 ]
|
||||
then
|
||||
# Print out doxygen warnings in red, use specified path (for when everything is in src)
|
||||
( cat $DOXYFILE; echo "INPUT=${BUILD_DIR}/$1" ) | ${BUILD_DIR}/doxygen - 2>&1 | tee foo.txt > >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
|
||||
else
|
||||
# Print out doxygen warnings in red, use default path
|
||||
${BUILD_DIR}/doxygen $DOXYFILE 2>&1 | tee foo.txt > >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
|
||||
fi
|
||||
# Print out doxygen warnings in red
|
||||
${TRAVIS_BUILD_DIR}/doxygen $DOXYFILE 2>&1 | tee foo.txt > >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
|
||||
|
||||
# if any warnings, bail!
|
||||
if [ -s foo.txt ]; then exit 1 ; fi
|
||||
|
|
@ -141,14 +113,14 @@ if [ -s foo.txt ]; then exit 1 ; fi
|
|||
rm foo.txt
|
||||
|
||||
# If we're a pull request, don't push docs to github!
|
||||
if [ ${IS_PULL} == 1 ]; then
|
||||
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
|
||||
echo "This is a Pull Request, we're done!"
|
||||
exit 0
|
||||
else
|
||||
echo "This is a Commit, Uploading documentation..."
|
||||
fi
|
||||
|
||||
cd code_docs/${REPO_NAME}
|
||||
cd code_docs/${TRAVIS_REPO_NAME}
|
||||
|
||||
################################################################################
|
||||
##### Upload the documentation to the gh-pages branch of the repository. #####
|
||||
|
|
@ -165,7 +137,7 @@ if [ -d "html" ] && [ -f "html/index.html" ]; then
|
|||
echo 'Adding all files'
|
||||
git add --all
|
||||
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "Changes to commit"
|
||||
else
|
||||
echo "No changes to commit"
|
||||
|
|
@ -175,15 +147,13 @@ if [ -d "html" ] && [ -f "html/index.html" ]; then
|
|||
# Commit the added files with a title and description containing the Travis CI
|
||||
# build number and the GitHub commit reference that issued this build.
|
||||
echo 'Git committing'
|
||||
git commit \
|
||||
-m "Deploy docs to GitHub Pages from commit ${COMMIT_SHA1:0:10}" \
|
||||
-m "Commit: ${COMMIT_SHA1}"$'\n'"${BUILD_ID}"
|
||||
git commit -m "Deploy code docs to GitHub Pages Travis build: ${TRAVIS_BUILD_NUMBER}" -m "Commit: ${TRAVIS_COMMIT}"
|
||||
|
||||
# Force push to the remote gh-pages branch.
|
||||
# The output is redirected to /dev/null to hide any sensitive credential data
|
||||
# The ouput is redirected to /dev/null to hide any sensitive credential data
|
||||
# that might otherwise be exposed.
|
||||
echo 'Git pushing'
|
||||
git push --force "https://${AUTH}@github.com/${REPO_SLUG}.git" > /dev/null 2>&1
|
||||
git push --force "https://${GH_REPO_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git" > /dev/null 2>&1
|
||||
else
|
||||
echo '' >&2
|
||||
echo 'Warning: No documentation (html) files have been found!' >&2
|
||||
|
|
|
|||
|
|
@ -1,32 +0,0 @@
|
|||
name: Arduino Library CI
|
||||
|
||||
on: [pull_request, push, repository_dispatch]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
repository: adafruit/ci-arduino
|
||||
path: ci
|
||||
|
||||
- name: pre-install
|
||||
run: bash ci/actions_install.sh
|
||||
|
||||
- name: test platforms
|
||||
run: python3 ci/build_platform.py main_platforms
|
||||
|
||||
- name: clang
|
||||
run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r .
|
||||
|
||||
- name: doxygen
|
||||
env:
|
||||
GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }}
|
||||
PRETTYNAME : "Adafruit Arduino Library"
|
||||
run: bash ci/doxy_gen_and_deploy.sh
|
||||
|
|
@ -1,40 +1,27 @@
|
|||
language: c
|
||||
sudo: false
|
||||
cache:
|
||||
directories:
|
||||
- ~/arduino_ide
|
||||
- ~/.arduino15/packages/
|
||||
git:
|
||||
depth: false
|
||||
quiet: true
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-trusty-5.0
|
||||
- key_url: 'http://apt.llvm.org/llvm-snapshot.gpg.key'
|
||||
packages:
|
||||
- python3-pip
|
||||
- python3-wheel
|
||||
- clang-format-5.0
|
||||
|
||||
# Blacklist
|
||||
branches:
|
||||
except:
|
||||
- gh-pages
|
||||
|
||||
env:
|
||||
global:
|
||||
# - ARDUINO_IDE_VERSION="1.8.10"
|
||||
- PRETTYNAME="Adafruit FT6206 Arduino Library"
|
||||
# Optional, will default to "$TRAVIS_BUILD_DIR/Doxyfile"
|
||||
# - DOXYFILE: $TRAVIS_BUILD_DIR/Doxyfile
|
||||
|
||||
before_install:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh)
|
||||
- curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/run-clang-format.py > run-clang-format.py
|
||||
|
||||
install:
|
||||
- arduino --install-library "Adafruit ILI9341","Adafruit GFX Library"
|
||||
|
||||
script:
|
||||
- python run-clang-format.py -r .
|
||||
- build_main_platforms
|
||||
|
||||
# Generate and deploy documentation
|
||||
after_success:
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh)
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
|
||||
- source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh)
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
Blink
|
||||
|
||||
Turns an LED on for one second, then off for one second, repeatedly.
|
||||
|
||||
Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
|
||||
it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
|
||||
the correct LED pin independent of which board is used.
|
||||
If you want to know what pin the on-board LED is connected to on your Arduino
|
||||
model, check the Technical Specs of your board at:
|
||||
https://www.arduino.cc/en/Main/Products
|
||||
|
||||
modified 8 May 2014
|
||||
by Scott Fitzgerald
|
||||
modified 2 Sep 2016
|
||||
by Arturo Guadalupi
|
||||
modified 8 Sep 2016
|
||||
by Colby Newman
|
||||
|
||||
This example code is in the public domain.
|
||||
|
||||
http://www.arduino.cc/en/Tutorial/Blink
|
||||
*/
|
||||
|
||||
// the setup function runs once when you press reset or power the board
|
||||
void setup() {
|
||||
// initialize digital pin LED_BUILTIN as an output.
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
}
|
||||
|
||||
// the loop function runs over and over again forever
|
||||
void loop() {
|
||||
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
|
||||
delay(1000); // wait for a second
|
||||
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
|
||||
delay(1000); // wait for a second
|
||||
}
|
||||
49
examples/BlinkPlus/BlinkPlus.ino
Normal file
49
examples/BlinkPlus/BlinkPlus.ino
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
Blink
|
||||
Turns on an LED on for one second, then off for one second, repeatedly.
|
||||
|
||||
Most Arduinos have an on-board LED you can control. On the Uno and
|
||||
Leonardo, it is attached to digital pin 13. If you're unsure what
|
||||
pin the on-board LED is connected to on your Arduino model, check
|
||||
the documentation at http://www.arduino.cc
|
||||
|
||||
This example code is in the public domain.
|
||||
|
||||
modified 8 May 2014
|
||||
by Scott Fitzgerald
|
||||
|
||||
modified 19 Dec 2015
|
||||
by Olivier Chatelain
|
||||
|
||||
modified 9 Jan 2016
|
||||
by Olivier Chatelain
|
||||
For Digispark
|
||||
|
||||
*/
|
||||
|
||||
// #define LED_PIN_FIRST 0 // First pin
|
||||
#define LED_PIN_FIRST 1 // Digispark
|
||||
// #define LED_PIN_FIRST 13 // Arduino UNO
|
||||
|
||||
// #define LED_PIN_LAST 19
|
||||
#ifndef LED_PIN_LAST
|
||||
#define LED_PIN_LAST LED_PIN_FIRST
|
||||
#endif
|
||||
|
||||
#define DELAY_HIGH_ON 400
|
||||
#define DELAY_LOW_OFF 600
|
||||
|
||||
|
||||
// the setup function runs once when you press reset or power the board
|
||||
void setup() {
|
||||
// initialize the pin range "first" to "last" as an output.
|
||||
for(int i = LED_PIN_FIRST; i <= LED_PIN_LAST; i++) pinMode(i, OUTPUT);
|
||||
}
|
||||
|
||||
// the loop function runs over and over again forever
|
||||
void loop() {
|
||||
for(int i = LED_PIN_FIRST; i <= LED_PIN_LAST; i++) digitalWrite(i, HIGH); // turn the LED on (HIGH is the voltage level)
|
||||
delay( DELAY_HIGH_ON ); // wait for a second
|
||||
for(int i = LED_PIN_FIRST; i <= LED_PIN_LAST; i++) digitalWrite(i, LOW); // turn the LED off by making the voltage LOW
|
||||
delay( DELAY_LOW_OFF ); // wait for a second
|
||||
}
|
||||
457
install.sh
Executable file → Normal file
457
install.sh
Executable file → Normal file
|
|
@ -8,156 +8,72 @@ fi
|
|||
|
||||
# associative array for the platforms that will be verified in build_main_platforms()
|
||||
# this will be eval'd in the functions below because arrays can't be exported
|
||||
# Uno is ATmega328, Zero is SAMD21G18, ESP8266, Leonardo is ATmega32u4, M4 is SAMD51, Mega is ATmega2560, ESP32
|
||||
export MAIN_PLATFORMS='declare -A main_platforms=( [uno]="arduino:avr:uno" [zero]="arduino:samd:arduino_zero_native" [esp8266]="esp8266:esp8266:huzzah:eesz=4M3M,xtal=80" [leonardo]="arduino:avr:leonardo" [m4]="adafruit:samd:adafruit_metro_m4:speed=120" [mega2560]="arduino:avr:mega:cpu=atmega2560" [esp32]="esp32:esp32:featheresp32:FlashFreq=80" )'
|
||||
export MAIN_PLATFORMS='declare -A main_platforms=( [uno]="arduino:avr:uno" [due]="arduino:sam:arduino_due_x" [zero]="arduino:samd:arduino_zero_native" [esp8266]="esp8266:esp8266:huzzah:FlashSize=4M3M,CpuFrequency=80" [leonardo]="arduino:avr:leonardo" )'
|
||||
|
||||
# associative array for other platforms that can be called explicitly in .travis.yml configs
|
||||
# this will be eval'd in the functions below because arrays can't be exported
|
||||
export AUX_PLATFORMS='declare -A aux_platforms=( [trinket]="adafruit:avr:trinket5" [gemma]="arduino:avr:gemma" )'
|
||||
|
||||
export CPLAY_PLATFORMS='declare -A cplay_platforms=( [cplayClassic]="arduino:avr:circuitplay32u4cat" [cplayExpress]="arduino:samd:adafruit_circuitplayground_m0" [cplayExpressAda]="adafruit:samd:adafruit_circuitplayground_m0" [cplayBluefruit]="adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0" )'
|
||||
export CPLAY_PLATFORMS='declare -A cplay_platforms=( [cplayClassic]="arduino:avr:circuitplay32u4cat" [cplayExpress]="arduino:samd:adafruit_circuitplayground_m0" ) '
|
||||
|
||||
export SAMD_PLATFORMS='declare -A samd_platforms=( [zero]="arduino:samd:arduino_zero_native", [cplayExpress]="arduino:samd:adafruit_circuitplayground_m0", [m4]="adafruit:samd:adafruit_metro_m4:speed=120" )'
|
||||
|
||||
export M4_PLATFORMS='declare -A m4_platforms=( [m4]="adafruit:samd:adafruit_metro_m4:speed=120", [trellis_m4]="adafruit:samd:adafruit_trellis_m4:speed=120", [grand_central_m4]="adafruit:samd:adafruit_grand_central_m4:speed=120" )'
|
||||
|
||||
export ARCADA_PLATFORMS='declare -A arcada_platforms=( [pybadge]="adafruit:samd:adafruit_pybadge_m4:speed=120", [pygamer]="adafruit:samd:adafruit_pygamer_m4:speed=120", [hallowing_m4]="adafruit:samd:adafruit_hallowing_m4:speed=120", [cplayExpressAda]="adafruit:samd:adafruit_circuitplayground_m0" )'
|
||||
|
||||
export IO_PLATFORMS='declare -A io_platforms=( [zero]="arduino:samd:arduino_zero_native", [m4wifi]="adafruit:samd:adafruit_metro_m4_airliftlite:speed=120", [esp8266]="esp8266:esp8266:huzzah:eesz=4M3M,xtal=80" [esp32]="esp32:esp32:featheresp32:FlashFreq=80" )'
|
||||
|
||||
export NRF5X_PLATFORMS='declare -A nrf5x_platforms=( [nrf52840]="adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0")'
|
||||
export SAMD_PLATFORMS='declare -A samd_platforms=( [zero]="arduino:samd:arduino_zero_native", [cplayExpress]="arduino:samd:adafruit_circuitplayground_m0" )'
|
||||
|
||||
# make display available for arduino CLI
|
||||
/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16
|
||||
sleep 3
|
||||
export DISPLAY=:1.0
|
||||
|
||||
#This condition is to avoid reruning install when build argument is passed
|
||||
if [[ $# -eq 0 ]] ; then
|
||||
# define colors
|
||||
GRAY='\033[1;30m'; RED='\033[0;31m'; LRED='\033[1;31m'; GREEN='\033[0;32m'; LGREEN='\033[1;32m'; ORANGE='\033[0;33m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; LBLUE='\033[1;34m'; PURPLE='\033[0;35m'; LPURPLE='\033[1;35m'; CYAN='\033[0;36m'; LCYAN='\033[1;36m'; LGRAY='\033[0;37m'; WHITE='\033[1;37m';
|
||||
# download and install arduino 1.8.5
|
||||
wget --quiet https://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz
|
||||
tar xf arduino-1.8.5-linux64.tar.xz
|
||||
mv arduino-1.8.5 $HOME/arduino_ide
|
||||
|
||||
echo -e "\n########################################################################";
|
||||
echo -e "${YELLOW}INSTALLING ARDUINO IDE"
|
||||
echo "########################################################################";
|
||||
|
||||
# if .travis.yml does not set version
|
||||
if [ -z $ARDUINO_IDE_VERSION ]; then
|
||||
export ARDUINO_IDE_VERSION="1.8.11"
|
||||
echo "NOTE: YOUR .TRAVIS.YML DOES NOT SPECIFY ARDUINO IDE VERSION, USING $ARDUINO_IDE_VERSION"
|
||||
fi
|
||||
|
||||
# if newer version is requested
|
||||
if [ ! -f $HOME/arduino_ide/$ARDUINO_IDE_VERSION ] && [ -f $HOME/arduino_ide/arduino ]; then
|
||||
echo -n "DIFFERENT VERSION OF ARDUINO IDE REQUESTED: "
|
||||
shopt -s extglob
|
||||
cd $HOME/arduino_ide/
|
||||
rm -rf *
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
cd $OLDPWD
|
||||
fi
|
||||
|
||||
# if not already cached, download and install arduino IDE
|
||||
echo -n "ARDUINO IDE STATUS: "
|
||||
if [ ! -f $HOME/arduino_ide/arduino ]; then
|
||||
echo -n "DOWNLOADING: "
|
||||
wget --quiet https://downloads.arduino.cc/arduino-$ARDUINO_IDE_VERSION-linux64.tar.xz
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
echo -n "UNPACKING ARDUINO IDE: "
|
||||
[ ! -d $HOME/arduino_ide/ ] && mkdir $HOME/arduino_ide
|
||||
tar xf arduino-$ARDUINO_IDE_VERSION-linux64.tar.xz -C $HOME/arduino_ide/ --strip-components=1
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
touch $HOME/arduino_ide/$ARDUINO_IDE_VERSION
|
||||
else
|
||||
echo -n "CACHED: "
|
||||
echo -e """$GREEN""\xe2\x9c\x93"
|
||||
fi
|
||||
|
||||
# define output directory for .hex files
|
||||
export ARDUINO_HEX_DIR=arduino_build_$TRAVIS_BUILD_NUMBER
|
||||
|
||||
# link test library folder to the arduino libraries folder
|
||||
ln -s $TRAVIS_BUILD_DIR $HOME/arduino_ide/libraries/Adafruit_Test_Library
|
||||
# move this library to the arduino libraries folder
|
||||
ln -s $PWD $HOME/arduino_ide/libraries/Adafruit_Test_Library
|
||||
|
||||
# add the arduino CLI to our PATH
|
||||
export PATH="$HOME/arduino_ide:$PATH"
|
||||
|
||||
echo -e "\n########################################################################";
|
||||
echo -e "${YELLOW}INSTALLING DEPENDENCIES"
|
||||
echo "INSTALLING DEPENDENCIES"
|
||||
echo "########################################################################";
|
||||
|
||||
# install dependancy libraries in library.properties
|
||||
grep "depends=" $HOME/arduino_ide/libraries/Adafruit_Test_Library/library.properties | sed 's/depends=//' | sed -n 1'p' | tr ',' '\n' | while read word; do arduino --install-library "$word"; done
|
||||
|
||||
# install the zero, esp8266, and adafruit board packages
|
||||
# install the due, esp8266, and adafruit board packages
|
||||
echo -n "ADD PACKAGE INDEX: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --pref "boardsmanager.additional.urls=https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json" --save-prefs 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
DEPENDENCY_OUTPUT=$(arduino --pref "boardsmanager.additional.urls=https://adafruit.github.io/arduino-board-index/package_adafruit_index.json,http://arduino.esp8266.com/stable/package_esp8266com_index.json" --save-prefs 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
# This is a hack, we have to install by hand so lets delete it
|
||||
echo "Removing ESP32 cache"
|
||||
rm -rf ~/.arduino15/packages/esp32
|
||||
echo -n "Current packages list:"
|
||||
[ -d ~/.arduino15/packages/ ] && ls ~/.arduino15/packages/
|
||||
echo -n "DUE: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards arduino:sam 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
INSTALL_ESP32=$([[ $INSTALL_PLATFORMS == *"esp32"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
INSTALL_ZERO=$([[ $INSTALL_PLATFORMS == *"zero"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
INSTALL_ESP8266=$([[ $INSTALL_PLATFORMS == *"esp8266"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
INSTALL_AVR=$([[ $INSTALL_PLATFORMS == *"avr"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
INSTALL_SAMD=$([[ $INSTALL_PLATFORMS == *"samd"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
INSTALL_NRF52=$([[ $INSTALL_PLATFORMS == *"nrf52"* || -z "$INSTALL_PLATFORMS" ]] && echo 1 || echo 0)
|
||||
echo -n "ZERO: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards arduino:samd 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
if [[ $INSTALL_ESP32 == 1 ]]; then
|
||||
echo -n "ESP32: "
|
||||
pip install pyserial
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards esp32:esp32 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
echo -n "ESP8266: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards esp8266:esp8266 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
if [[ $INSTALL_ZERO == 1 ]]; then
|
||||
echo -n "ZERO: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards arduino:samd 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
echo -n "ADAFRUIT AVR: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:avr 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
if [[ $INSTALL_ESP8266 == 1 ]]; then
|
||||
echo -n "ESP8266: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards esp8266:esp8266 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
|
||||
if [[ $INSTALL_AVR == 1 ]]; then
|
||||
echo -n "ADAFRUIT AVR: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:avr 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
|
||||
if [[ $INSTALL_SAMD == 1 ]]; then
|
||||
echo -n "ADAFRUIT SAMD: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:samd 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
|
||||
if [[ $INSTALL_NRF52 == 1 ]]; then
|
||||
echo -n "ADAFRUIT NRF5X: "
|
||||
pip install wheel
|
||||
pip install setuptools
|
||||
pip install adafruit-nrfutil
|
||||
pip install pyserial
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:nrf52 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96 OR CACHED"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
fi
|
||||
echo -n "ADAFRUIT SAMD: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-boards adafruit:samd 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
# install random lib so the arduino IDE grabs a new library index
|
||||
# see: https://github.com/arduino/Arduino/issues/3535
|
||||
echo -n "UPDATE LIBRARY INDEX: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --install-library USBHost > /dev/null 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
# set the maximal compiler warning level
|
||||
echo -n "SET BUILD PREFERENCES: "
|
||||
DEPENDENCY_OUTPUT=$(arduino --pref "compiler.warning_level=all" --save-prefs 2>&1)
|
||||
if [ $? -ne 0 ]; then echo -e """$RED""\xe2\x9c\x96"; else echo -e """$GREEN""\xe2\x9c\x93"; fi
|
||||
if [ $? -ne 0 ]; then echo -e "\xe2\x9c\x96"; else echo -e "\xe2\x9c\x93"; fi
|
||||
|
||||
# init the json temp var for the current platform
|
||||
export PLATFORM_JSON=""
|
||||
|
|
@ -167,10 +83,8 @@ export PASS_COUNT=0
|
|||
export SKIP_COUNT=0
|
||||
export FAIL_COUNT=0
|
||||
export PDE_COUNT=0
|
||||
# close if [[ $# -eq 0 ]] ; then
|
||||
fi
|
||||
|
||||
# build all of the examples for the passed platform
|
||||
#Sourcing and defining functions
|
||||
function build_platform()
|
||||
{
|
||||
|
||||
|
|
@ -178,10 +92,6 @@ function build_platform()
|
|||
eval $MAIN_PLATFORMS
|
||||
eval $AUX_PLATFORMS
|
||||
eval $CPLAY_PLATFORMS
|
||||
eval $M4_PLATFORMS
|
||||
eval $ARCADA_PLATFORMS
|
||||
eval $IO_PLATFORMS
|
||||
eval $NRF5X_PLATFORMS
|
||||
|
||||
# reset platform json var
|
||||
PLATFORM_JSON=""
|
||||
|
|
@ -198,20 +108,8 @@ function build_platform()
|
|||
# grab all pde and ino example sketches
|
||||
declare -a examples
|
||||
|
||||
if [ "$PLATFORM_CHECK_ONLY_ON_FILE" = true ]; then
|
||||
# loop through results and add them to the array
|
||||
examples=($(
|
||||
for f in $(find . -type f -iname '*.ino' -o -iname '*.pde'); do
|
||||
# TODO: distinguish platforms
|
||||
if [ -e "$(dirname $f)/.$platform_key.test" ]; then
|
||||
echo "$f"
|
||||
fi
|
||||
done
|
||||
))
|
||||
else
|
||||
# loop through results and add them to the array
|
||||
examples=($(find $PWD -name "*.pde" -o -name "*.ino"))
|
||||
fi
|
||||
# loop through results and add them to the array
|
||||
examples=($(find $PWD -name "*.pde" -o -name "*.ino"))
|
||||
|
||||
# get the last example in the array
|
||||
local last="${examples[@]:(-1)}"
|
||||
|
|
@ -223,14 +121,6 @@ function build_platform()
|
|||
platform=${aux_platforms[$platform_key]}
|
||||
elif [[ ${cplay_platforms[$platform_key]} ]]; then
|
||||
platform=${cplay_platforms[$platform_key]}
|
||||
elif [[ ${m4_platforms[$platform_key]} ]]; then
|
||||
platform=${m4_platforms[$platform_key]}
|
||||
elif [[ ${arcada_platforms[$platform_key]} ]]; then
|
||||
platform=${arcada_platforms[$platform_key]}
|
||||
elif [[ ${io_platforms[$platform_key]} ]]; then
|
||||
platform=${io_platforms[$platform_key]}
|
||||
elif [[ ${nrf5x_platforms[$platform_key]} ]]; then
|
||||
platform=${nrf5x_platforms[$platform_key]}
|
||||
else
|
||||
echo "NON-STANDARD PLATFORM KEY: $platform_key"
|
||||
platform=$platform_key
|
||||
|
|
@ -238,7 +128,7 @@ function build_platform()
|
|||
|
||||
echo -e "\n########################################################################";
|
||||
|
||||
echo -e -n "${YELLOW}SWITCHING TO ${platform_key}: "
|
||||
echo -n "SWITCHING TO ${platform_key}: "
|
||||
|
||||
# switch to the requested board.
|
||||
# we have to avoid reading the exit code of local:
|
||||
|
|
@ -252,13 +142,12 @@ function build_platform()
|
|||
# notify if the platform switch failed
|
||||
if [ $platform_switch -ne 0 ]; then
|
||||
# heavy X
|
||||
echo -e """$RED""\xe2\x9c\x96"
|
||||
echo -e "arduino --board ${platform} --save-prefs 2>&1"
|
||||
echo -e "\xe2\x9c\x96"
|
||||
echo $platform_stdout
|
||||
exit_code=1
|
||||
else
|
||||
# heavy checkmark
|
||||
echo -e """$GREEN""\xe2\x9c\x93"
|
||||
echo -e "\xe2\x9c\x93"
|
||||
fi
|
||||
|
||||
echo "########################################################################";
|
||||
|
|
@ -283,7 +172,7 @@ function build_platform()
|
|||
# continue to next example if platform switch failed
|
||||
if [ $platform_switch -ne 0 ]; then
|
||||
# heavy X
|
||||
echo -e """$RED""\xe2\x9c\x96"
|
||||
echo -e "\xe2\x9c\x96"
|
||||
|
||||
# add json
|
||||
PLATFORM_JSON="${PLATFORM_JSON}$(json_sketch 0 $example_file $last_example)"
|
||||
|
|
@ -333,10 +222,10 @@ function build_platform()
|
|||
if [[ $example =~ \.pde$ ]]; then
|
||||
|
||||
# heavy X
|
||||
echo -e """$RED""\xe2\x9c\x96"
|
||||
echo -e "\xe2\x9c\x96"
|
||||
|
||||
echo -e "-------------------------- DEBUG OUTPUT --------------------------\n"
|
||||
echo "${LRED}PDE EXTENSION. PLEASE UPDATE TO INO"
|
||||
echo "PDE EXTENSION. PLEASE UPDATE TO INO"
|
||||
echo -e "\n------------------------------------------------------------------\n"
|
||||
|
||||
# add json
|
||||
|
|
@ -352,21 +241,17 @@ function build_platform()
|
|||
|
||||
fi
|
||||
|
||||
# get the sketch name so we can place the generated files in the respective folder
|
||||
local sketch_filename_with_ending=$(basename -- "$example")
|
||||
local sketch_filename="${sketch_filename_with_ending%.*}"
|
||||
local build_path=$ARDUINO_HEX_DIR/$platform_key/$sketch_filename
|
||||
# verify the example, and save stdout & stderr to a variable
|
||||
# we have to avoid reading the exit code of local:
|
||||
# "when declaring a local variable in a function, the local acts as a command in its own right"
|
||||
local build_stdout
|
||||
build_stdout=$(arduino --verify --pref build.path=$build_path --preserve-temp-files $example 2>&1)
|
||||
build_stdout=$(arduino --verify $example 2>&1)
|
||||
|
||||
# echo output if the build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
|
||||
# heavy X
|
||||
echo -e """$RED""\xe2\x9c\x96"
|
||||
echo -e "\xe2\x9c\x96"
|
||||
|
||||
echo -e "----------------------------- DEBUG OUTPUT -----------------------------\n"
|
||||
echo "$build_stdout"
|
||||
|
|
@ -384,7 +269,7 @@ function build_platform()
|
|||
else
|
||||
|
||||
# heavy checkmark
|
||||
echo -e """$GREEN""\xe2\x9c\x93"
|
||||
echo -e "\xe2\x9c\x93"
|
||||
|
||||
# add json
|
||||
PLATFORM_JSON="${PLATFORM_JSON}$(json_sketch 1 "$example_file" $last_example)"
|
||||
|
|
@ -400,7 +285,7 @@ function build_platform()
|
|||
|
||||
}
|
||||
|
||||
# build all examples for every platform in $MAIN_PLATFORMS
|
||||
# build all examples for every platform in $main_platforms
|
||||
function build_main_platforms()
|
||||
{
|
||||
|
||||
|
|
@ -449,54 +334,6 @@ function build_main_platforms()
|
|||
|
||||
}
|
||||
|
||||
# build all examples for every platform in $AUX_PLATFORMS
|
||||
function build_aux_platforms()
|
||||
{
|
||||
|
||||
# arrays can't be exported, so we have to eval
|
||||
eval $AUX_PLATFORMS
|
||||
|
||||
# track the build status all platforms
|
||||
local exit_code=0
|
||||
|
||||
# var to hold platforms
|
||||
local platforms_json=""
|
||||
|
||||
# get the last element in the array
|
||||
local last="${aux_platforms[@]:(-1)}"
|
||||
|
||||
# loop through platforms in main platforms assoc array
|
||||
for p_key in "${!aux_platforms[@]}"; do
|
||||
|
||||
# is this the last platform in the loop
|
||||
local last_platform=0
|
||||
if [ "$last" == "${aux_platforms[$p_key]}" ]; then
|
||||
last_platform=1
|
||||
fi
|
||||
|
||||
# build all examples for this platform
|
||||
build_platform $p_key
|
||||
|
||||
# check if build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 0 "$PLATFORM_JSON" $last_platform)"
|
||||
exit_code=1
|
||||
else
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 1 "$PLATFORM_JSON" $last_platform)"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
# exit code is opposite of json build status
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
json_main_platforms 1 "$platforms_json"
|
||||
else
|
||||
json_main_platforms 0 "$platforms_json"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
}
|
||||
function build_cplay_platforms()
|
||||
{
|
||||
|
||||
|
|
@ -593,202 +430,6 @@ function build_samd_platforms()
|
|||
|
||||
}
|
||||
|
||||
function build_m4_platforms()
|
||||
{
|
||||
|
||||
# arrays can't be exported, so we have to eval
|
||||
eval $M4_PLATFORMS
|
||||
|
||||
# track the build status all platforms
|
||||
local exit_code=0
|
||||
|
||||
# var to hold platforms
|
||||
local platforms_json=""
|
||||
|
||||
# get the last element in the array
|
||||
local last="${m4_platforms[@]:(-1)}"
|
||||
|
||||
# loop through platforms in main platforms assoc array
|
||||
for p_key in "${!m4_platforms[@]}"; do
|
||||
|
||||
# is this the last platform in the loop
|
||||
local last_platform=0
|
||||
if [ "$last" == "${m4_platforms[$p_key]}" ]; then
|
||||
last_platform=1
|
||||
fi
|
||||
|
||||
# build all examples for this platform
|
||||
build_platform $p_key
|
||||
|
||||
# check if build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 0 "$PLATFORM_JSON" $last_platform)"
|
||||
exit_code=1
|
||||
else
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 1 "$PLATFORM_JSON" $last_platform)"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
# exit code is opposite of json build status
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
json_main_platforms 1 "$platforms_json"
|
||||
else
|
||||
json_main_platforms 0 "$platforms_json"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
}
|
||||
|
||||
function build_io_platforms()
|
||||
{
|
||||
|
||||
# arrays can't be exported, so we have to eval
|
||||
eval $IO_PLATFORMS
|
||||
|
||||
# track the build status all platforms
|
||||
local exit_code=0
|
||||
|
||||
# var to hold platforms
|
||||
local platforms_json=""
|
||||
|
||||
# get the last element in the array
|
||||
local last="${io_platforms[@]:(-1)}"
|
||||
|
||||
# loop through platforms in main platforms assoc array
|
||||
for p_key in "${!io_platforms[@]}"; do
|
||||
|
||||
# is this the last platform in the loop
|
||||
local last_platform=0
|
||||
if [ "$last" == "${io_platforms[$p_key]}" ]; then
|
||||
last_platform=1
|
||||
fi
|
||||
|
||||
# build all examples for this platform
|
||||
build_platform $p_key
|
||||
|
||||
# check if build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 0 "$PLATFORM_JSON" $last_platform)"
|
||||
exit_code=1
|
||||
else
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 1 "$PLATFORM_JSON" $last_platform)"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
# exit code is opposite of json build status
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
json_main_platforms 1 "$platforms_json"
|
||||
else
|
||||
json_main_platforms 0 "$platforms_json"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function build_arcada_platforms()
|
||||
{
|
||||
|
||||
# arrays can't be exported, so we have to eval
|
||||
eval $ARCADA_PLATFORMS
|
||||
|
||||
# track the build status all platforms
|
||||
local exit_code=0
|
||||
|
||||
# var to hold platforms
|
||||
local platforms_json=""
|
||||
|
||||
# get the last element in the array
|
||||
local last="${arcada_platforms[@]:(-1)}"
|
||||
|
||||
# loop through platforms in main platforms assoc array
|
||||
for p_key in "${!arcada_platforms[@]}"; do
|
||||
|
||||
# is this the last platform in the loop
|
||||
local last_platform=0
|
||||
if [ "$last" == "${arcada_platforms[$p_key]}" ]; then
|
||||
last_platform=1
|
||||
fi
|
||||
|
||||
# build all examples for this platform
|
||||
build_platform $p_key
|
||||
|
||||
# check if build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 0 "$PLATFORM_JSON" $last_platform)"
|
||||
exit_code=1
|
||||
else
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 1 "$PLATFORM_JSON" $last_platform)"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
# exit code is opposite of json build status
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
json_main_platforms 1 "$platforms_json"
|
||||
else
|
||||
json_main_platforms 0 "$platforms_json"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
}
|
||||
|
||||
|
||||
function build_nrf5x_platforms()
|
||||
{
|
||||
|
||||
# arrays can't be exported, so we have to eval
|
||||
eval $NRF5X_PLATFORMS
|
||||
|
||||
# track the build status all platforms
|
||||
local exit_code=0
|
||||
|
||||
# var to hold platforms
|
||||
local platforms_json=""
|
||||
|
||||
# get the last element in the array
|
||||
local last="${nrf5x_platforms[@]:(-1)}"
|
||||
|
||||
# loop through platforms in main platforms assoc array
|
||||
for p_key in "${!nrf5x_platforms[@]}"; do
|
||||
|
||||
# is this the last platform in the loop
|
||||
local last_platform=0
|
||||
if [ "$last" == "${nrf5x_platforms[$p_key]}" ]; then
|
||||
last_platform=1
|
||||
fi
|
||||
|
||||
# build all examples for this platform
|
||||
build_platform $p_key
|
||||
|
||||
# check if build failed
|
||||
if [ $? -ne 0 ]; then
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 0 "$PLATFORM_JSON" $last_platform)"
|
||||
exit_code=1
|
||||
else
|
||||
platforms_json="${platforms_json}$(json_platform $p_key 1 "$PLATFORM_JSON" $last_platform)"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
# exit code is opposite of json build status
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
json_main_platforms 1 "$platforms_json"
|
||||
else
|
||||
json_main_platforms 0 "$platforms_json"
|
||||
fi
|
||||
|
||||
return $exit_code
|
||||
|
||||
}
|
||||
|
||||
|
||||
# generate json string for a sketch
|
||||
function json_sketch()
|
||||
{
|
||||
|
|
@ -861,16 +502,4 @@ function json_main_platforms()
|
|||
echo -e "||||||||||||||||||||||||||||| JSON STATUS ||||||||||||||||||||||||||||||\n"
|
||||
|
||||
}
|
||||
#If there is an argument
|
||||
if [[ ! $# -eq 0 ]] ; then
|
||||
# define output directory for .hex files
|
||||
export ARDUINO_HEX_DIR=arduino_build_$TRAVIS_BUILD_NUMBER
|
||||
|
||||
# link test library folder to the arduino libraries folder
|
||||
ln -s $TRAVIS_BUILD_DIR $HOME/arduino_ide/libraries/Adafruit_Test_Library
|
||||
|
||||
# add the arduino CLI to our PATH
|
||||
export PATH="$HOME/arduino_ide:$PATH"
|
||||
|
||||
"$@"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -1,325 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
"""A wrapper script around clang-format, suitable for linting multiple files
|
||||
and to use for continuous integration.
|
||||
|
||||
This is an alternative API for the clang-format command line.
|
||||
It runs over multiple files and directories in parallel.
|
||||
A diff output is produced and a sensible exit code is returned.
|
||||
|
||||
"""
|
||||
|
||||
from __future__ import print_function, unicode_literals
|
||||
|
||||
import argparse
|
||||
import codecs
|
||||
import difflib
|
||||
import fnmatch
|
||||
import io
|
||||
import multiprocessing
|
||||
import os
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
from functools import partial
|
||||
|
||||
DEFAULT_EXTENSIONS = 'c,h,C,H,cpp,hpp,cc,hh,c++,h++,cxx,hxx'
|
||||
|
||||
|
||||
class ExitStatus:
|
||||
SUCCESS = 0
|
||||
DIFF = 1
|
||||
TROUBLE = 2
|
||||
|
||||
|
||||
def list_files(files, recursive=False, extensions=None, exclude=None):
|
||||
if extensions is None:
|
||||
extensions = []
|
||||
if exclude is None:
|
||||
exclude = []
|
||||
|
||||
out = []
|
||||
for file in files:
|
||||
if recursive and os.path.isdir(file):
|
||||
for dirpath, dnames, fnames in os.walk(file):
|
||||
fpaths = [os.path.join(dirpath, fname) for fname in fnames]
|
||||
for pattern in exclude:
|
||||
# os.walk() supports trimming down the dnames list
|
||||
# by modifying it in-place,
|
||||
# to avoid unnecessary directory listings.
|
||||
dnames[:] = [
|
||||
x for x in dnames
|
||||
if
|
||||
not fnmatch.fnmatch(os.path.join(dirpath, x), pattern)
|
||||
]
|
||||
fpaths = [
|
||||
x for x in fpaths if not fnmatch.fnmatch(x, pattern)
|
||||
]
|
||||
for f in fpaths:
|
||||
ext = os.path.splitext(f)[1][1:]
|
||||
if ext in extensions:
|
||||
out.append(f)
|
||||
else:
|
||||
out.append(file)
|
||||
return out
|
||||
|
||||
|
||||
def make_diff(file, original, reformatted):
|
||||
return list(
|
||||
difflib.unified_diff(
|
||||
original,
|
||||
reformatted,
|
||||
fromfile='{}\t(original)'.format(file),
|
||||
tofile='{}\t(reformatted)'.format(file),
|
||||
n=3))
|
||||
|
||||
|
||||
class DiffError(Exception):
|
||||
def __init__(self, message, errs=None):
|
||||
super(DiffError, self).__init__(message)
|
||||
self.errs = errs or []
|
||||
|
||||
|
||||
class UnexpectedError(Exception):
|
||||
def __init__(self, message, exc=None):
|
||||
super(UnexpectedError, self).__init__(message)
|
||||
self.formatted_traceback = traceback.format_exc()
|
||||
self.exc = exc
|
||||
|
||||
|
||||
def run_clang_format_diff_wrapper(args, file):
|
||||
try:
|
||||
ret = run_clang_format_diff(args, file)
|
||||
return ret
|
||||
except DiffError:
|
||||
raise
|
||||
except Exception as e:
|
||||
raise UnexpectedError('{}: {}: {}'.format(file, e.__class__.__name__,
|
||||
e), e)
|
||||
|
||||
|
||||
def run_clang_format_diff(args, file):
|
||||
try:
|
||||
with io.open(file, 'r', encoding='utf-8') as f:
|
||||
original = f.readlines()
|
||||
except IOError as exc:
|
||||
raise DiffError(str(exc))
|
||||
invocation = [args.clang_format_executable, file]
|
||||
|
||||
# Use of utf-8 to decode the process output.
|
||||
#
|
||||
# Hopefully, this is the correct thing to do.
|
||||
#
|
||||
# It's done due to the following assumptions (which may be incorrect):
|
||||
# - clang-format will returns the bytes read from the files as-is,
|
||||
# without conversion, and it is already assumed that the files use utf-8.
|
||||
# - if the diagnostics were internationalized, they would use utf-8:
|
||||
# > Adding Translations to Clang
|
||||
# >
|
||||
# > Not possible yet!
|
||||
# > Diagnostic strings should be written in UTF-8,
|
||||
# > the client can translate to the relevant code page if needed.
|
||||
# > Each translation completely replaces the format string
|
||||
# > for the diagnostic.
|
||||
# > -- http://clang.llvm.org/docs/InternalsManual.html#internals-diag-translation
|
||||
#
|
||||
# It's not pretty, due to Python 2 & 3 compatibility.
|
||||
encoding_py3 = {}
|
||||
if sys.version_info[0] >= 3:
|
||||
encoding_py3['encoding'] = 'utf-8'
|
||||
|
||||
try:
|
||||
proc = subprocess.Popen(
|
||||
invocation,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
universal_newlines=True,
|
||||
**encoding_py3)
|
||||
except OSError as exc:
|
||||
raise DiffError(str(exc))
|
||||
proc_stdout = proc.stdout
|
||||
proc_stderr = proc.stderr
|
||||
if sys.version_info[0] < 3:
|
||||
# make the pipes compatible with Python 3,
|
||||
# reading lines should output unicode
|
||||
encoding = 'utf-8'
|
||||
proc_stdout = codecs.getreader(encoding)(proc_stdout)
|
||||
proc_stderr = codecs.getreader(encoding)(proc_stderr)
|
||||
# hopefully the stderr pipe won't get full and block the process
|
||||
outs = list(proc_stdout.readlines())
|
||||
errs = list(proc_stderr.readlines())
|
||||
proc.wait()
|
||||
if proc.returncode:
|
||||
raise DiffError("clang-format exited with status {}: '{}'".format(
|
||||
proc.returncode, file), errs)
|
||||
return make_diff(file, original, outs), errs
|
||||
|
||||
|
||||
def bold_red(s):
|
||||
return '\x1b[1m\x1b[31m' + s + '\x1b[0m'
|
||||
|
||||
|
||||
def colorize(diff_lines):
|
||||
def bold(s):
|
||||
return '\x1b[1m' + s + '\x1b[0m'
|
||||
|
||||
def cyan(s):
|
||||
return '\x1b[36m' + s + '\x1b[0m'
|
||||
|
||||
def green(s):
|
||||
return '\x1b[32m' + s + '\x1b[0m'
|
||||
|
||||
def red(s):
|
||||
return '\x1b[31m' + s + '\x1b[0m'
|
||||
|
||||
for line in diff_lines:
|
||||
if line[:4] in ['--- ', '+++ ']:
|
||||
yield bold(line)
|
||||
elif line.startswith('@@ '):
|
||||
yield cyan(line)
|
||||
elif line.startswith('+'):
|
||||
yield green(line)
|
||||
elif line.startswith('-'):
|
||||
yield red(line)
|
||||
else:
|
||||
yield line
|
||||
|
||||
|
||||
def print_diff(diff_lines, use_color):
|
||||
if use_color:
|
||||
diff_lines = colorize(diff_lines)
|
||||
if sys.version_info[0] < 3:
|
||||
sys.stdout.writelines((l.encode('utf-8') for l in diff_lines))
|
||||
else:
|
||||
sys.stdout.writelines(diff_lines)
|
||||
|
||||
|
||||
def print_trouble(prog, message, use_colors):
|
||||
error_text = 'error:'
|
||||
if use_colors:
|
||||
error_text = bold_red(error_text)
|
||||
print("{}: {} {}".format(prog, error_text, message), file=sys.stderr)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument(
|
||||
'--clang-format-executable',
|
||||
metavar='EXECUTABLE',
|
||||
help='path to the clang-format executable',
|
||||
default='clang-format')
|
||||
parser.add_argument(
|
||||
'--extensions',
|
||||
help='comma separated list of file extensions (default: {})'.format(
|
||||
DEFAULT_EXTENSIONS),
|
||||
default=DEFAULT_EXTENSIONS)
|
||||
parser.add_argument(
|
||||
'-r',
|
||||
'--recursive',
|
||||
action='store_true',
|
||||
help='run recursively over directories')
|
||||
parser.add_argument('files', metavar='file', nargs='+')
|
||||
parser.add_argument(
|
||||
'-q',
|
||||
'--quiet',
|
||||
action='store_true')
|
||||
parser.add_argument(
|
||||
'-j',
|
||||
metavar='N',
|
||||
type=int,
|
||||
default=0,
|
||||
help='run N clang-format jobs in parallel'
|
||||
' (default number of cpus + 1)')
|
||||
parser.add_argument(
|
||||
'--color',
|
||||
default='auto',
|
||||
choices=['auto', 'always', 'never'],
|
||||
help='show colored diff (default: auto)')
|
||||
parser.add_argument(
|
||||
'-e',
|
||||
'--exclude',
|
||||
metavar='PATTERN',
|
||||
action='append',
|
||||
default=[],
|
||||
help='exclude paths matching the given glob-like pattern(s)'
|
||||
' from recursive search')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# use default signal handling, like diff return SIGINT value on ^C
|
||||
# https://bugs.python.org/issue14229#msg156446
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
try:
|
||||
signal.SIGPIPE
|
||||
except AttributeError:
|
||||
# compatibility, SIGPIPE does not exist on Windows
|
||||
pass
|
||||
else:
|
||||
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
||||
|
||||
colored_stdout = False
|
||||
colored_stderr = False
|
||||
if args.color == 'always':
|
||||
colored_stdout = True
|
||||
colored_stderr = True
|
||||
elif args.color == 'auto':
|
||||
colored_stdout = sys.stdout.isatty()
|
||||
colored_stderr = sys.stderr.isatty()
|
||||
|
||||
retcode = ExitStatus.SUCCESS
|
||||
files = list_files(
|
||||
args.files,
|
||||
recursive=args.recursive,
|
||||
exclude=args.exclude,
|
||||
extensions=args.extensions.split(','))
|
||||
|
||||
if not files:
|
||||
return
|
||||
|
||||
njobs = args.j
|
||||
if njobs == 0:
|
||||
njobs = multiprocessing.cpu_count() + 1
|
||||
njobs = min(len(files), njobs)
|
||||
|
||||
if njobs == 1:
|
||||
# execute directly instead of in a pool,
|
||||
# less overhead, simpler stacktraces
|
||||
it = (run_clang_format_diff_wrapper(args, file) for file in files)
|
||||
pool = None
|
||||
else:
|
||||
pool = multiprocessing.Pool(njobs)
|
||||
it = pool.imap_unordered(
|
||||
partial(run_clang_format_diff_wrapper, args), files)
|
||||
while True:
|
||||
try:
|
||||
outs, errs = next(it)
|
||||
except StopIteration:
|
||||
break
|
||||
except DiffError as e:
|
||||
print_trouble(parser.prog, str(e), use_colors=colored_stderr)
|
||||
retcode = ExitStatus.TROUBLE
|
||||
sys.stderr.writelines(e.errs)
|
||||
except UnexpectedError as e:
|
||||
print_trouble(parser.prog, str(e), use_colors=colored_stderr)
|
||||
sys.stderr.write(e.formatted_traceback)
|
||||
retcode = ExitStatus.TROUBLE
|
||||
# stop at the first unexpected error,
|
||||
# something could be very wrong,
|
||||
# don't process all files unnecessarily
|
||||
if pool:
|
||||
pool.terminate()
|
||||
break
|
||||
else:
|
||||
sys.stderr.writelines(errs)
|
||||
if outs == []:
|
||||
continue
|
||||
if not args.quiet:
|
||||
print_diff(outs, use_color=colored_stdout)
|
||||
if retcode == ExitStatus.SUCCESS:
|
||||
retcode = ExitStatus.DIFF
|
||||
return retcode
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
Loading…
Reference in a new issue