Compare commits

..

151 commits

Author SHA1 Message Date
Liz
139855f5a6
Merge pull request #218 from adafruit/BlitzCityDIY-patch-1
add fruit jam
2025-08-04 15:24:43 -04:00
Liz
9d47c3e84c CI passed, remove fruit jam 2025-08-04 15:18:27 -04:00
Liz
c1222e5ebb add fruit jam to CI to test, remove after 2025-08-04 15:14:06 -04:00
Liz
d45001870f
add fruit jam 2025-08-04 15:06:29 -04:00
Ha Thach
bc9ae39b85
Merge pull request #213 from adafruit/add-metro-rp2040
add metro rp2040
2025-05-30 13:19:12 +07:00
hathach
6a5eaa381e
add metro rp2040 2025-05-30 12:49:30 +07:00
Liz
1806102474
Merge pull request #212 from adafruit/arduino_giga
add arduino giga
2025-05-16 11:51:52 -04:00
Liz
491fdd9c3b passed CI, removing from actions 2025-05-16 11:47:21 -04:00
Liz
809fa567ce test giga action, will remove if passes 2025-05-16 11:42:41 -04:00
Liz
c8a449c0a5 add arduino giga 2025-05-16 11:38:37 -04:00
Limor "Ladyada" Fried
790b8e1943
Merge pull request #211 from adafruit/add-preserve-folders-feature
Add PRESERVE_FOLDERS feature to documentation generation script
2025-05-14 13:35:21 -04:00
ladyada
9cacd6a3cd Add PRESERVE_FOLDERS feature to documentation generation script
This change allows preserving specified folders (like webserial interfaces)
during documentation generation. Folders specified in the PRESERVE_FOLDERS
environment variable will be backed up before cleanup and restored afterward.

- Added PRESERVE_FOLDERS environment variable support
- Updated README with documentation and example usage
2025-05-14 13:29:05 -04:00
Ha Thach
71a8675ae4
Merge pull request #209 from adafruit/add-esp32p4
add esp32p4 to all_platforms.py
2025-03-07 16:38:49 +07:00
hathach
5a9757be18
add esp32p4 to all_platforms.py 2025-03-07 12:43:14 +07:00
Liz
a9133a4d74
Merge pull request #208 from adafruit/ci-metro-rp2350 2025-02-19 11:03:54 -05:00
Liz
ccd396ac5e Update all_platforms.py 2025-02-19 10:56:27 -05:00
Liz
395fb0c7d8 testing non-tinyusb build 2025-02-19 10:49:54 -05:00
Liz
e95cb1bf30
Merge pull request #207 from adafruit/ci-metro-rp2350
adding cpu arch option for rp2350
2025-02-19 10:24:04 -05:00
Liz
2fe62027ed adding cpu arch option for rp2350 2025-02-19 10:20:01 -05:00
Liz
0b3773de19
Merge pull request #206 from adafruit/ci-metro-rp2350
add metro rp2350
2025-02-19 09:25:09 -05:00
Liz
8f988d200e add metro rp2350 2025-02-19 08:59:14 -05:00
Limor "Ladyada" Fried
8eaaa88908
Merge pull request #205 from adafruit/ci-feather-rp2350
Add feather rp2350 to all_platforms
2025-01-28 09:29:45 -05:00
751ddd90bd check that feather rp3250 builds during CI 2025-01-23 09:53:41 -06:00
3fe3f5a652 Add feather rp2350 to all_platforms 2025-01-23 09:26:34 -06:00
Tyeth Gundry
10f66d8ad4
Merge pull request #203 from tyeth/sparkle-motion
Add Sparkle Motion boards
2025-01-22 18:31:51 +00:00
Tyeth Gundry
cb0c5bc26f
Use correct FQBN for Sparkle Motion boards 2025-01-22 02:14:53 +00:00
Tyeth Gundry
423195b975
Add Sparkle Motion + Mini Sparkle Motion 2025-01-21 23:55:15 +00:00
Jeff Epler
8ea191ccc7
Merge pull request #199 from adafruit/floppsy
add floppsy to platforms
2024-11-27 17:01:49 -06:00
9e30f77a34 floppsy: make default split Sketch: 2MB, FS: 14MB 2024-11-27 14:18:18 -06:00
f8d9c9e699 add floppsy to platforms 2024-11-27 11:01:19 -06:00
Ha Thach
1e4c645a27
Merge pull request #197 from adafruit/change-esp32-to-stable-json
change esp32 package json to stable one
2024-10-23 23:09:35 +07:00
hathach
034c2bcf74
change esp32 package json to stable one 2024-10-23 22:55:08 +07:00
Jeff Epler
a40e18918d
Merge pull request #195 from adafruit/add-pico2
Add pico2 settings for ci
2024-09-11 11:50:17 -05:00
9968e449f7 Add pico2 settings for ci
tested by manually copying the strings into a terminal
where I was running arduino-cli
2024-09-11 11:44:05 -05:00
Tyeth Gundry
e353dd7eef
Merge pull request #194 from adafruit/set-C6-CDC-on-for-WS
Update all_platforms.py - set C6 feather to CDC on for WipperSnapper
2024-08-20 18:24:54 +01:00
tyeth
5ea0b024ca Add debug target for C6 feather 2024-08-20 18:01:25 +01:00
tyeth
8b73d6aef8 Update C6 for WipperSnapper to core log level INFO 2024-08-20 17:26:34 +01:00
Tyeth Gundry
de8517c95a
Update all_platforms.py - set C6 feather to CDC on for WipperSnapper 2024-08-16 16:30:45 +01:00
Tyeth Gundry
65134c4b83
Merge pull request #193 from adafruit/add-adafruit-feather-c6
Add C6 definitions
2024-08-13 13:43:00 +01:00
tyeth
1cf21354ea Add C6 definitions 2024-08-13 13:38:09 +01:00
Liz
f31d4d4e21
Merge pull request #191 from adafruit/BlitzCityDIY-patch-1
add feather rp2040 adalogger
2024-06-28 16:14:06 -04:00
Liz
2712342a44
add feather rp2040 adalogger 2024-06-28 16:02:02 -04:00
Liz
bc4b6d433b
Merge pull request #190 from adafruit/BlitzCityDIY-patch-1
edit trrs trinkey
2024-06-25 18:02:24 -04:00
Liz
bb8dc84cbc
edit trrs trinkey
curious if TRRStrinkey vs trrstrinkey is what is causing the variant file to not be found on learn
2024-06-25 10:49:10 -04:00
Liz
84ea6e8dda
Merge pull request #189 from adafruit/trinkeys
Add some trinkeys
2024-06-21 14:51:14 -04:00
fcf38d4a22 Add some trinkeys 2024-06-21 13:47:06 -05:00
Liz
cb39a99ed8
Merge pull request #187 from adafruit/pycamera-platform
use standard esp32 bsp3 for pycamera
2024-06-21 13:50:43 -04:00
eee47cc724 use standard esp32 bsp3 for pycamera 2024-06-21 12:42:58 -05:00
Ha Thach
dc25f472a0
Merge pull request #186 from adafruit/skip-list-file
support .skip.txt each platform per line
2024-06-11 14:16:13 +07:00
hathach
545c7b8779
clean up 2024-06-11 13:09:32 +07:00
hathach
ac8b3d9af3
support .skip.txt each platform per line 2024-06-10 17:43:20 +07:00
Ha Thach
7803502b29
Merge pull request #185 from adafruit/add-ch32v2
add ch32v2 core from openwch
2024-06-10 17:12:44 +07:00
hathach
e6ff10906e
also run ci with pull request 2024-06-10 17:07:27 +07:00
hathach
8862239d32
add ch32v2 core from openwch 2024-06-10 16:42:27 +07:00
Ha Thach
8487a305da
Merge pull request #183 from adafruit/importable-build_platform
Importable build platform
2024-06-07 13:12:14 +07:00
hathach
cca7c9f57e
minor clean up 2024-06-07 12:26:05 +07:00
hathach
95196a6f8e
Merge branch 'refs/heads/master' into importable-build_platform
# Conflicts:
#	build_platform.py
2024-05-30 10:03:47 +07:00
Tyeth Gundry
f3dfb9828e
Merge pull request #184 from tyeth/add-drazzy-over-cloudflare-https
Add HTTPS mirror of Drazzy.com served through cloudflare
2024-05-29 19:22:10 +01:00
tyeth
803e424cd6 Add HTTPS mirror of Drazzy.com served through cloudflare 2024-05-29 18:41:15 +01:00
hathach
135152b886
fix is_library_installed() using incorrect parameter 2024-05-29 11:34:59 +07:00
hathach
f03b9d8aed
comment out drazzy 2024-05-29 11:00:33 +07:00
hathach
f4fe7ce812
Merge branch 'refs/heads/master' into importable-build_platform
# Conflicts:
#	build_platform.py
2024-05-17 09:16:57 +07:00
Carter Nelson
72918f8b8d
Update build_platform.py
add drazzy url back
2024-05-09 08:38:02 -07:00
hathach
55b0acf54d
minor clean up 2024-04-26 13:47:05 +07:00
hathach
a6e7d709bf
- def main() to prevent global variable platform/platforms/fqbn
- remove obsolete test_examples_in_learningrepo()
2024-04-26 13:18:30 +07:00
hathach
3ecccafa3e
bump up action checkout and setup-python version 2024-04-26 12:04:29 +07:00
hathach
296c59e60f
move global autorun code under if __name__ == "__main__": to make build_platform.py importable 2024-04-26 12:00:04 +07:00
Brent Rubell
a505386504
Merge pull request #182 from adafruit/min_spiffs_wippersnapper_qtpy_esp32c3_featheresp32
Add WipperSnapper Min_Spiffs partition targets
2024-04-16 16:01:23 -04:00
tyeth
a2f1934d67 Add WipperSnapper Min_Spiffs partition targets 2024-04-16 19:38:35 +01:00
Brent Rubell
3abb36eb78
Merge pull request #180 from adafruit/add-itsybitsy-rp2040
Add ItsyBitsy RP2040 and FunHouse_NoOTA targets, fix repo_topics, include RevTFT S3 feather in debug builds
2024-03-12 10:31:10 -04:00
tyeth
8cb29685af Add "funhouse_noota" build target 2024-03-12 10:35:14 +00:00
tyeth
ece43c9e34 Fix: fetching of repo_topics now fails gracefully 2024-03-07 16:05:15 +00:00
Tyeth Gundry
eb3e1d3ee7 Update all_platforms.py - Add adafruit_feather_esp32s3_reverse_tft_debug 2024-03-07 16:05:15 +00:00
tyeth
484caa5871 Add ItsyBitsy RP2040 to all_platforms 2024-03-07 16:05:15 +00:00
Tyeth Gundry
f9cef95817
Merge pull request #181 from adafruit/add-itsybitsy-esp32
Add ItsyBitsy ESP32
2024-03-07 15:57:49 +00:00
tyeth
57d612ef51 Add ItsyBitsy ESP32 2024-03-07 15:46:43 +00:00
Limor "Ladyada" Fried
f28589bc05
Update build_platform.py
remove drazzy until 
https://github.com/SpenceKonde/megaTinyCore/issues/1059
is resolved
2024-02-18 09:22:45 -05:00
Tyeth Gundry
4ab46d71c1
Merge pull request #176 from computerscienceiscool/patch-1
Update README.md
2024-02-05 19:21:32 +00:00
JJ
ed7ffcdf5d
Update README.md
Fixed spelling errors and repeated words.
2024-01-14 03:06:19 -08:00
Tyeth Gundry
ffd6b2b27c
Merge pull request #175 from tyeth/master
Update build_platform.py - Don't install installed arduino libs
2024-01-09 15:19:02 +00:00
Tyeth Gundry
8655eaf78a Update build_platform.py - Don't install installed arduino libs
This allows us to override the dependencies from latest version to a manually installed version (as a precursor build step)

Needed to allow specifying version 6.x of ArduinoJson rather than latest 7 (breaking changes)
2024-01-09 15:00:00 +00:00
Tyeth Gundry
d447332f40
Merge pull request #174 from brentru/brentru-fork-upstream
Add debug/verbose builds for some WipperSnapper boards
2024-01-08 18:33:16 +00:00
brentru
eddee3a837 add debug builds 2024-01-08 12:51:13 -05:00
Ha Thach
2e96fd7ace
Merge pull request #173 from adafruit/add-pico-tinyusb-host
add pico_rp2040_tinyusb_host (native controller as host)
2023-12-25 13:44:36 +07:00
hathach
106ed322d0 - correct rp2040 freq = 120mh when using with tinyusb (device)
- add pico_rp2040_tinyusb_host to all_platforms.py
2023-12-22 16:37:06 +07:00
Liz
3375dc241e
Update all_platforms.py 2023-12-20 14:10:55 -05:00
Liz
b2c2c1ce9e
Update all_platforms.py 2023-12-20 13:04:24 -05:00
Liz
a4d6a2f2b7
fix pycamera name 2023-12-20 12:26:57 -05:00
Limor "Ladyada" Fried
17f52ec0ad
Merge pull request #172 from adafruit/BlitzCityDIY-patch-1
adding pycamera to all_platforms.py
2023-12-20 12:17:35 -05:00
Liz
2c6755f50f
adding pycamera to all_platforms.py 2023-12-20 11:35:03 -05:00
ladyada
ff7d61a290 try another way 2023-12-12 00:10:52 -05:00
ladyada
c56cc8c005 try to fix drazzy failure 2023-12-12 00:06:27 -05:00
ladyada
665c3125b7 Merge branch 'master' of github.com:adafruit/ci-arduino 2023-12-11 19:32:53 -05:00
ladyada
be54f3b4b5 print cli cmd 2023-12-11 19:32:49 -05:00
Limor "Ladyada" Fried
ee18d43392
Merge pull request #170 from adafruit/add-metro-esp32s3
add metro esp32s3
2023-12-11 19:25:07 -05:00
Limor "Ladyada" Fried
a7abac5000
Merge pull request #171 from ayushsharma82/patch-1
Fix for running ci-arduino in private repos
2023-12-11 19:24:21 -05:00
Ayush Sharma
4236d2d9ee
Update actions_install.sh
- Fix running CI in private repo
2023-12-03 19:23:37 +05:30
Ha Thach
52b07b1d0d
add metro esp32s3 2023-11-21 18:05:21 +07:00
ladyada
f1a3f8e5e5 de-debug 2023-10-29 15:43:48 -04:00
ladyada
4419b4811c Merge branch 'master' of github.com:adafruit/ci-arduino 2023-10-29 13:41:38 -04:00
ladyada
f633b6542a remove unused debugs 2023-10-29 13:41:34 -04:00
ladyada
445b62e651 debugging 2023-10-29 13:35:46 -04:00
ladyada
66206d5ce6 be less stringent 2023-10-29 13:34:04 -04:00
ladyada
600ada1c3d int 2023-10-29 13:26:41 -04:00
ladyada
f6df91cab8 more debug 2023-10-29 13:21:03 -04:00
ladyada
747c29851c debug 2023-10-29 13:12:38 -04:00
Limor "Ladyada" Fried
f3abb4e243
Merge pull request #146 from adafruit/dont-warn-learn-library
Dont warn that learn isn't marked as an arduino library
2023-10-29 13:06:30 -04:00
ladyada
a810ddd06f fixed bug, remove hack
https://github.com/arduino/arduino-cli/issues/2345
2023-10-29 13:04:19 -04:00
Limor "Ladyada" Fried
4d5face681
Merge pull request #164 from makermelissa/master
Add Qualia S3 RGB666
2023-10-04 13:53:55 -04:00
Melissa LeBlanc-Williams
7de8285ae5 Add Qualia S3 RGB666 2023-10-03 15:10:04 -07:00
Limor "Ladyada" Fried
cd3b0228f9
Merge pull request #149 from adafruit/separate-platform-definiton
move all_platforms to its own file
2023-10-02 08:11:11 -04:00
hathach
317c7ccd07 Merge branch 'master' into separate-platform-definiton 2023-10-02 11:56:08 +07:00
Limor "Ladyada" Fried
b066942ffb
Merge pull request #163 from caternuson/hack_fix_megatinycore
Hack fix for arduino-cli issue with megatinycore BSP URL
2023-09-28 14:38:00 -04:00
caternuson
d4e3f15c05 hack fix for megatinycore 2023-09-28 11:32:26 -07:00
Limor "Ladyada" Fried
e3426929da
Merge pull request #162 from caternuson/revert_pr158
Put back megatinycore BSP URL
2023-09-27 13:38:07 -04:00
caternuson
1590a2d1a6 put back megatinycore bsp url 2023-09-27 10:27:46 -07:00
Tyeth Gundry
8947491675
Merge pull request #161 from tyeth/update-pico-flash-params
Update pico flash params
2023-09-20 20:17:20 +01:00
tyeth
bc085b3e5a Define storage size for picow_rp2040_tinyusb 2023-09-20 17:58:39 +01:00
Tyeth Gundry
0e6d88b7e7
Merge pull request #160 from brentru/sync-brentru-branch
Adds a configurable timeout for builds
2023-09-13 17:58:21 +01:00
brentru
fe15057af2 formatting 2023-09-13 12:10:38 -04:00
brentru
011ae3e226 cast 2023-09-13 11:30:04 -04:00
Brent Rubell
18ce377263
Merge pull request #2 from tyeth/tweak-timeout
Tweak-timeout
2023-09-13 11:13:46 -04:00
Tyeth Gundry
f28f8bc2bf
Remove timeout value from sys.argv as well 2023-09-13 16:07:38 +01:00
brentru
381d0a9e01 fix indentation level 2023-09-13 09:25:00 -04:00
brentru
160a7cc7b7 sync brentru timeout with --timeout arg 2023-09-13 09:15:41 -04:00
Brent Rubell
9b8ed98fe4
Merge pull request #159 from brentru/sync-brentru-branch
Add Feather Reverse TFTs, QTPY S3 2MB PSRAM
2023-09-12 16:00:51 -04:00
brentru
22259bdd5e sync with brentru/ fork 2023-09-12 15:28:21 -04:00
Limor "Ladyada" Fried
6fa056aa1c
Merge pull request #158 from adafruit/remove_drazzy
until BSP link is fixed
2023-09-12 12:47:00 -04:00
ladyada
c8fcca6811 until BSP link is fixed 2023-09-12 12:37:34 -04:00
Melissa LeBlanc-Williams
e528357b54
Merge pull request #157 from makermelissa/master
Add MatrixPortal S3 to Build Platforms
2023-07-19 07:52:17 -07:00
Melissa LeBlanc-Williams
531c463995 Add MatrixPortal S3 to Build Platforms 2023-07-18 19:56:02 -07:00
Limor "Ladyada" Fried
1c05c214c5
Merge pull request #152 from PaulMartinsen/2023-05-UpdateReadme
Updated readme
2023-06-25 20:40:46 -04:00
Brent Rubell
62f77dfff8
Merge pull request #156 from caternuson/revert_155
Revert megatinycore BSP URL
2023-06-13 14:54:19 -04:00
caternuson
aa581de37d revert megatinycore bsp url 2023-06-13 11:28:40 -07:00
Brent Rubell
447ad22e29
Merge pull request #155 from adafruit/fix-drazzy
Fix FAILED to update core indices
2023-06-07 18:52:07 -04:00
brentru
19d2562c10 add gist temp. fix 2023-06-07 17:47:59 -04:00
Brent Rubell
3c4e19b020
Merge pull request #154 from kattni/qtpy_rp2040
Add QT Py RP2040
2023-06-07 16:43:08 -04:00
Kattni Rembor
8c4a9d2880 Formatting. 2023-06-07 14:49:14 -04:00
Kattni Rembor
4612aea26a Add QT Py RP2040 2023-06-07 14:47:48 -04:00
Paul
75d6299fac More specific about where the platform for test control files comes from, with an example. 2023-05-17 22:01:48 +12:00
Paul
a5e740c303 Updated readme with:
* additional details for beginners,
* links to useful references,
* clarified how *.test.* files work now.
2023-05-16 20:51:55 +12:00
dherrada
6d1885fad6 Update CI action versions 2023-05-12 11:24:33 -04:00
Limor "Ladyada" Fried
6151ec158a
Merge pull request #151 from adafruit/add-feather-rp2040-usbhost
add feather_rp2040_usbhost_tinyusb
2023-04-17 22:10:13 -04:00
hathach
07f91766e8 add feather_rp2040_usbhost_tinyusb, also correct variant for feather_rp2040_dvi and feather_rp2040_rfm 2023-04-13 15:53:28 +07:00
Kattni
307e51f68b
Merge pull request #150 from kattni/add-rp2040-feathers
Add RP2040 new boards.
2023-04-05 14:13:45 -04:00
Kattni Rembor
88e5ade7ed Add RP2040 new boards. 2023-04-05 14:11:26 -04:00
hathach
c784122483
move all_platforms to its own file 2023-03-16 00:19:42 +07:00
Brent Rubell
e21b05a204
Update build_platform.py to remove s3 on adafruit/master 2022-12-30 14:50:30 -05:00
Jeff Epler
f01b9c3ca4
Merge pull request #144 from adafruit/add-pico
Add PicoW and PicoW_TinyUSB
2022-11-05 08:25:21 -05:00
brentru
21352cf9a2 picow tinyusb fix 2022-09-15 16:35:52 -04:00
brentru
8cbe547c84 build picow_2040 2022-09-15 16:32:43 -04:00
8 changed files with 430 additions and 259 deletions

View file

@ -1,20 +1,19 @@
name: Github Arduino Library CI
on: [push]
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
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 feather_m4_express
python3 build_platform.py uno leonardo mega2560 zero esp8266 esp32 pico_rp2040 feather_m4_express feather_rp2350

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.DS_Store
.idea

View file

@ -1,56 +1,93 @@
# Arduino CI Scripts
This repos contains various scripts and tools related to running
continuous integration (CI) checks on Arduino Library Repos.
This repo contains various scripts and tools related to running continuous integration (CI) checks on Arduino Library Repos. The operations include:
* checking formatting using [clang-format](https://clang.llvm.org/docs/ClangFormat.html),
* generating documentation from source comments using [Doxygen](https://www.doxygen.nl/), and
* building each example in the library for selected targets.
There is an associated guide available here:
https://learn.adafruit.com/the-well-automated-arduino-library/
## Adding GitHub Actions to Repo
To run these continuous integration checks on each push, pull-request or [repository dispatch](https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-dispatch-event) using [GitHub actions](https://github.com/features/actions):
* Create a folder named `.github/worflows` in the root of the repo.
* Copy `example_actions.yml` into the above directory and rename it `githubci.yml`.
* Edit `githubci.yml` and change `PRETTYNAME` to the library repo name.
* Edit `githubci.yml` and change `PRETTYNAME` to the library repo name. Optionally, delete or comment out steps (using the `#` character), you don't want to include.
* Here's an example: [Adafruit_BME280_Library](https://github.com/adafruit/Adafruit_BME280_Library/blob/master/.github/workflows/githubci.yml)
* These actions will now run automatically on any pull, push, or dispatch.
## Controlling Test Behavior
The `build_platform.py` script is used to test each `.ino` example in the repo for the
selected build platforms. The `ALL_PLATFORMS` dictionary contains a listing of all
available platforms. By default, `main_platforms` is used. Additionally, UF2 files
of the compiled sketches can be generated for supported platforms. The behavior
can be controlled using special hidden filenames. These are just empty files
placed in the root folder:
The `build_platform.py` script is used to test each `.ino` example in the repo for selected build platforms. The [`ALL_PLATFORMS`](ci-arduino/blob/master/build_platform.py#L54) dictionary contains a listing of all available platforms and selected platform groups. By default, `main_platforms` is used. To select a specific platform or group, replace `main_platforms` in [`githubci.yml`](`example_actions.yml`) with the group or platform name.
* `.YOUR_PLATFORM_HERE.test.skip` - Skip the specified platform. All others are tested.
* `.YOUR_PLATFORM_HERE.test.only` - Test only the specfied platform. All others are skipped.
* `.YOUR_PLATFORM_HERE.generate` - Generate UF2 of sketch for specified platform (if supported).
Additionally, [UF2 files](https://github.com/microsoft/uf2) of the compiled sketches can be generated for supported platforms.
Replace `YOUR_PLATFORM_HERE` in the name with exact text from `ALL_PLATFORMS`.
### Fine tuning test selection
### Examples
The script behavior can be controlled using special filenames:
* `.PLATFORM_ID.test.skip` - Skip the specified platform. All others are tested.
* `.PLATFORM_ID.test.only` - Test the specified platform. All others are skipped.
* `.PLATFORM_ID.generate` - Generate UF2 of sketch for specified platform (if supported).
These are just empty files placed in an example folder. Replace `PLATFORM_ID` in the name with the key from [`ALL_PLATFORMS`](ci-arduino/blob/master/build_platform.py#L54). `metro_m0` from the following line in `build_platform.py`, for example:
```python
"metro_m0" : ["adafruit:samd:adafruit_metro_m0", "0x68ed2b88", None],
```
You can use several `.PLATFORM_ID.test.skip` or `.PLATFORM_ID.test.only` to exclude or include multiple platforms. For example:
* To **skip** testing on ESP8266, add a file named `.esp8266.test.skip`
* To test **only** the Arduino UNO, add a file named `.uno.test.only`
* To skip all and test **nothing**, add a file named `.none.test.only`
* To generate UF2s for PyPortal, add a file named `.pyportal.generate`
### Dependencies
Any library dependencies included in the [`library.properties`](https://arduino.github.io/arduino-cli/0.19/library-specification/#libraryproperties-file-format) are automatically installed before the tests are started. To install additional dependencies (e.g., those required for some examples but not the library itself) using [`arduino-cli`](https://arduino.github.io/arduino-cli/0.19/commands/arduino-cli_lib_install/), you could add additional steps to the `githubci.yml` file. For example:
```yaml
- name: Set configuration
run: arduino-cli config set library.enable_unsafe_install true
- name: Install test dependencies
run: arduino-cli lib install --git-url https://github.com/arduino-libraries/Servo --git-url https://github.com/arduino-libraries/Ethernet
```
Note: you'll only need to enable the [`enable_unsafe_install`](https://arduino.github.io/arduino-cli/0.32/configuration/#configuration-keys) option if you want to identify libraries using urls. This isn't necessary when using the library name.
## Formatting Check with Clang
The `run-clang-format.py` script is used to run ClangFormat and check file formatting.
The `run-clang-format.py` script is used to run [clang-format](https://clang.llvm.org/docs/ClangFormat.html) and check file formatting.
See [the guide](https://learn.adafruit.com/the-well-automated-arduino-library/formatting-with-clang-format) for details on installing `clang-format` to run formatting locally.
Even a single extra white space can cause the CI to fail on formatting.
You can typically just let clang do its thing and edit files in place using:
```
clang-format -i File_To_Format.cpp
```
## Documentation with Doxygen
The `doxy_gen_and_deploy.sh` script uses Doxygen to generate and deploy documentation
The `doxy_gen_and_deploy.sh` script uses [Doxygen](https://www.doxygen.nl/) to generate and deploy documentation
for the library. Any issues, like missing documentation, will cause the CI to fail.
See the [the guide](https://learn.adafruit.com/the-well-automated-arduino-library/doxygen)
for details on installing and running doxygen locally. The guide also has some
[tips](https://learn.adafruit.com/the-well-automated-arduino-library/doxygen-tips)
on basic usage of doxygen markup within your code.
See the [guide](https://learn.adafruit.com/the-well-automated-arduino-library/doxygen) for details on installing and running Doxygen locally. The guide also has some
[tips](https://learn.adafruit.com/the-well-automated-arduino-library/doxygen-tips) on basic usage of Doxygen markup within your code.
### Preserving Folders in Documentation Branch
By default, the documentation deployment script cleans the gh-pages branch before adding new documentation. If you need to preserve certain folders (like custom web interfaces), you can set the `PRESERVE_FOLDERS` environment variable in your workflow:
```yaml
- name: doxygen
env:
GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }}
PRETTYNAME : "My Arduino Library"
PRESERVE_FOLDERS: "webserial,assets"
run: bash ci/doxy_gen_and_deploy.sh
```
This will preserve the listed folders (comma-separated) during the documentation generation process.

View file

@ -37,7 +37,8 @@ arduino-cli core update-index > /dev/null
case "$GITHUB_REPOSITORY" in
(*/ci-arduino|*/Adafruit_Learning_System_Guides) ;;
(*)
repo_topics=$(curl --request GET --url "https://api.github.com/repos/$GITHUB_REPOSITORY" | jq -r '.topics[]')
repo_topics=$(curl -f --request GET --url "https://api.github.com/repos/$GITHUB_REPOSITORY" || echo '{"topics":[]}')
repo_topics=$(echo $repo_topics | jq -r '.topics[]' )
if [[ ! $repo_topics =~ "arduino-library" ]]; then
echo "::warning::arduino-library is not found in this repo topics. Please add this tag in repo About"
fi

179
all_platforms.py Normal file
View file

@ -0,0 +1,179 @@
# board: [ platform, uf2_family, manual core URL]
ALL_PLATFORMS={
# classic Arduino AVR
"uno" : ["arduino:avr:uno", None, None],
"leonardo" : ["arduino:avr:leonardo", None, None],
"mega2560" : ["arduino:avr:mega:cpu=atmega2560", None, None],
# Arduino SAMD
"zero" : ["arduino:samd:arduino_zero_native", "0x68ed2b88", None, None],
"cpx" : ["arduino:samd:adafruit_circuitplayground_m0", "0x68ed2b88", None],
# Arduino MBED GIGA
"giga" : ["arduino:mbed_giga:giga", None, None],
# Espressif
"esp8266" : ["esp8266:esp8266:huzzah:eesz=4M3M,xtal=80", None, None],
"esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None, None],
"itsybitsy_esp32" : ["esp32:esp32:adafruit_itsybitsy_esp32:FlashFreq=80", None, None],
"feather_esp8266" : ["esp8266:esp8266:huzzah:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200", None, None],
"feather_esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None, None],
"wippersnapper_feather_esp32" : ["esp32:esp32:featheresp32:FlashFreq=80,PartitionScheme=min_spiffs", None, None],
"feather_esp32_v2" : ["esp32:esp32:adafruit_feather_esp32_v2", None, None],
"qtpy_esp32" : ["esp32:esp32:adafruit_qtpy_esp32_pico", None, None],
"sparklemotion_esp32" : ["esp32:esp32:sparklemotion", None, None],
"sparklemotionmini_esp32" : ["esp32:esp32:sparklemotionmini", None, None],
## ESP32-C3/C6
"feather_esp32c6" : ["esp32:esp32:adafruit_feather_esp32c6:FlashMode=qio", None, None],
"wippersnapper_feather_esp32c6" : ["esp32:esp32:adafruit_feather_esp32c6:CDCOnBoot=cdc,CPUFreq=160,FlashFreq=80,FlashMode=qio,PartitionScheme=min_spiffs", None, None],
"wippersnapper_feather_esp32c6_debug" : ["esp32:esp32:adafruit_feather_esp32c6:CDCOnBoot=cdc,DebugLevel=verbose,CPUFreq=160,FlashFreq=80,FlashMode=qio,PartitionScheme=min_spiffs", None, None],
"qtpy_esp32c3" : ["esp32:esp32:adafruit_qtpy_esp32c3:FlashMode=qio", None, None],
"wippersnapper_qtpy_esp32c3" : ["esp32:esp32:adafruit_qtpy_esp32c3:FlashMode=qio,PartitionScheme=min_spiffs", None, None],
## ESP32-S2
"magtag" : ["esp32:esp32:adafruit_magtag29_esp32s2", "0xbfdd4eee", None],
"funhouse" : ["esp32:esp32:adafruit_funhouse_esp32s2", "0xbfdd4eee", None],
"funhouse_noota" : ["esp32:esp32:adafruit_funhouse_esp32s2:PartitionScheme=tinyuf2_noota", "0xbfdd4eee", None],
"metroesp32s2" : ["esp32:esp32:adafruit_metro_esp32s2", "0xbfdd4eee", None],
"qtpy_esp32s2" : ["esp32:esp32:adafruit_qtpy_esp32s2", "0xbfdd4eee", None],
"feather_esp32s2" : ["esp32:esp32:adafruit_feather_esp32s2", "0xbfdd4eee", None],
"feather_esp32s2_debug" : ["esp32:esp32:adafruit_feather_esp32s2:DebugLevel=verbose", "0xbfdd4eee", None],
"feather_esp32s2_tft" : ["esp32:esp32:adafruit_feather_esp32s2_tft", "0xbfdd4eee", None],
"feather_esp32s2_tft_debug" : ["esp32:esp32:adafruit_feather_esp32s2_tft:DebugLevel=verbose", "0xbfdd4eee", None],
"feather_esp32s2_reverse_tft" : ["esp32:esp32:adafruit_feather_esp32s2_reversetft", "0xbfdd4eee", None],
## ESP32-S3
"feather_esp32s3" : ["esp32:esp32:adafruit_feather_esp32s3_nopsram", "0xc47e5767", None],
"feather_esp32s3_debug" : ["esp32:esp32:adafruit_feather_esp32s3_nopsram:DebugLevel=verbose", "0xc47e5767", None],
"feather_esp32s3_4mbflash_2mbpsram" : ["esp32:esp32:adafruit_feather_esp32s3", "0xc47e5767", None],
"feather_esp32s3_4mbflash_2mbpsram_debug" : ["esp32:esp32:adafruit_feather_esp32s3:DebugLevel=verbose", "0xc47e5767", None],
"feather_esp32s3_tft" : ["esp32:esp32:adafruit_feather_esp32s3_tft", "0xc47e5767", None],
"feather_esp32s3_tft_debug" : ["esp32:esp32:adafruit_feather_esp32s3_tft:DebugLevel=verbose", "0xc47e5767", None],
"feather_esp32s3_reverse_tft" : ["esp32:esp32:adafruit_feather_esp32s3_reversetft", "0xc47e5767", None],
"feather_esp32s3_reverse_tft_debug" : ["esp32:esp32:adafruit_feather_esp32s3_reversetft:DebugLevel=verbose", "0xc47e5767", None],
"matrixportal_s3" : ["esp32:esp32:adafruit_matrixportal_esp32s3", "0xc47e5767", None],
"metro_esp32s3" : ["esp32:esp32:adafruit_metro_esp32s3", "0xc47e5767", None],
"pycamera_s3" : ["esp32:esp32:adafruit_camera_esp32s3", "0xc47e5767", None],
"qualia_s3_rgb666" : ["esp32:esp32:adafruit_qualia_s3_rgb666", "0xc47e5767", None],
"qtpy_esp32s3" : ["esp32:esp32:adafruit_qtpy_esp32s3_nopsram", "0xc47e5767", None],
"qtpy_esp32s3_n4r2" : ["esp32:esp32:adafruit_qtpy_esp32s3_n4r2", "0xc47e5767", None],
# ESP32-P4
"esp32p4" : ["esp32:esp32:esp32p4:JTAGAdapter=default,PSRAM=disabled,USBMode=default,CDCOnBoot=cdc,MSCOnBoot=default,DFUOnBoot=default,UploadMode=default,PartitionScheme=default,CPUFreq=360,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=921600,DebugLevel=none,EraseFlash=none", "0x3d308e94", None],
# Adafruit AVR
"trinket_3v" : ["adafruit:avr:trinket3", None, None],
"trinket_5v" : ["adafruit:avr:trinket5", None, None],
"protrinket_3v" : ["adafruit:avr:protrinket3", None, None],
"protrinket_5v" : ["adafruit:avr:protrinket5", None, None],
"gemma" : ["adafruit:avr:gemma", None, None],
"flora" : ["adafruit:avr:flora8", None, None],
"feather32u4" : ["adafruit:avr:feather32u4", None, None],
"cpc" : ["arduino:avr:circuitplay32u4cat", None, None],
# Adafruit SAMD
"gemma_m0" : ["adafruit:samd:adafruit_gemma_m0", "0x68ed2b88", None],
"trinket_m0" : ["adafruit:samd:adafruit_trinket_m0", "0x68ed2b88", None],
"feather_m0_express" : ["adafruit:samd:adafruit_feather_m0_express", "0x68ed2b88", None],
"feather_m0_express_tinyusb" : ["adafruit:samd:adafruit_feather_m0_express:usbstack=tinyusb", "0x68ed2b88", None],
"feather_m4_express" : ["adafruit:samd:adafruit_feather_m4:speed=120", "0x55114460", None],
"feather_m4_express_tinyusb" : ["adafruit:samd:adafruit_feather_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"feather_m4_can" : ["adafruit:samd:adafruit_feather_m4_can:speed=120", "0x55114460", None],
"feather_m4_can_tinyusb" : ["adafruit:samd:adafruit_feather_m4_can:speed=120,usbstack=tinyusb", "0x55114460", None],
"metro_m0" : ["adafruit:samd:adafruit_metro_m0", "0x68ed2b88", None],
"metro_m0_tinyusb" : ["adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", "0x68ed2b88", None],
"metro_m4" : ["adafruit:samd:adafruit_metro_m4:speed=120", "0x55114460", None],
"metro_m4_tinyusb" : ["adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"metro_m4_airliftlite" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120", "0x55114460", None],
"metro_m4_airliftlite_tinyusb" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120,usbstack=tinyusb", "0x55114460", None],
"pybadge" : ["adafruit:samd:adafruit_pybadge_m4:speed=120", "0x55114460", None],
"pybadge_tinyusb" : ["adafruit:samd:adafruit_pybadge_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"pygamer" : ["adafruit:samd:adafruit_pygamer_m4:speed=120", "0x55114460", None],
"pygamer_tinyusb" : ["adafruit:samd:adafruit_pygamer_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"hallowing_m0" : ["adafruit:samd:adafruit_hallowing", "0x68ed2b88", None],
"hallowing_m4" : ["adafruit:samd:adafruit_hallowing_m4:speed=120", "0x55114460", None],
"hallowing_m4_tinyusb" : ["adafruit:samd:adafruit_hallowing_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"neotrellis_m4" : ["adafruit:samd:adafruit_trellis_m4:speed=120", "0x55114460", None],
"monster_m4sk" : ["adafruit:samd:adafruit_monster_m4sk:speed=120", "0x55114460", None],
"monster_m4sk_tinyusb" : ["adafruit:samd:adafruit_monster_m4sk:speed=120,usbstack=tinyusb", "0x55114460", None],
"pyportal" : ["adafruit:samd:adafruit_pyportal_m4:speed=120", "0x55114460", None],
"pyportal_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"pyportal_titano" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120", "0x55114460", None],
"pyportal_titano_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120,usbstack=tinyusb", "0x55114460", None],
"cpx_ada" : ["adafruit:samd:adafruit_circuitplayground_m0", "0x68ed2b88", None],
"grand_central" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120", "0x55114460", None],
"grand_central_tinyusb" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"matrixportal" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120", "0x55114460", None],
"matrixportal_tinyusb" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"neotrinkey_m0" : ["adafruit:samd:adafruit_neotrinkey_m0", "0x68ed2b88", None],
"rotarytrinkey_m0" : ["adafruit:samd:adafruit_rotarytrinkey_m0", "0x68ed2b88", None],
"neokeytrinkey_m0" : ["adafruit:samd:adafruit_neokeytrinkey_m0", "0x68ed2b88", None],
"slidetrinkey_m0" : ["adafruit:samd:adafruit_slidetrinkey_m0", "0x68ed2b88", None],
"proxlighttrinkey_m0" : ["adafruit:samd:adafruit_proxlighttrinkey_m0", "0x68ed2b88", None],
"trrstrinkey_m0" : ["adafruit:samd:adafruit_trrstrinkey_m0", "0x68ed2b88", None],
"thumbsticktrinkey_m0" : ["adafruit:samd:adafruit_thumbsticktrinkey_m0", "0x68ed2b88", None],
"sht4xtrinkey_m0" : ["adafruit:samd:adafruit_sht4xtrinkey_m0", "0x68ed2b88", None],
"pixeltrinkey_m0" : ["adafruit:samd:adafruit_pixeltrinkey_m0", "0x68ed2b88", None],
"X_m0" : ["adafruit:samd:adafruit_X_m0", "0x68ed2b88", None],
"qtpy_m0" : ["adafruit:samd:adafruit_qtpy_m0", "0x68ed2b88", None],
"qtpy_m0_tinyusb" : ["adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", "0x68ed2b88", None],
# Arduino SAMD
"mkrwifi1010" : ["arduino:samd:mkrwifi1010", "0x8054", None],
"nano_33_iot" : ["arduino:samd:nano_33_iot", "0x8057", None],
# Arduino nRF
"microbit" : ["sandeepmistry:nRF5:BBCmicrobit:softdevice=s110", None, None],
# Adafruit nRF
"nrf52832" : ["adafruit:nrf52:feather52832:softdevice=s132v6,debug=l0", None, None],
"nrf52840" : ["adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"cpb" : ["adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"clue" : ["adafruit:nrf52:cluenrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"ledglasses_nrf52840" : ["adafruit:nrf52:ledglasses_nrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
# RP2040 & RP2350 (Philhower)
"pico_rp2040" : ["rp2040:rp2040:rpipico:freq=125,flash=2097152_0", "0xe48bff56", None],
"pico_rp2040_tinyusb" : ["rp2040:rp2040:rpipico:flash=2097152_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"pico_rp2040_tinyusb_host" : ["rp2040:rp2040:rpipico:flash=2097152_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb_host", "0xe48bff56", None],
"pico_rp2350" : ["rp2040:rp2040:rpipico2:freq=125,flash=4194304_0", "0xe48bff56", None],
"pico_rp2350_tinyusb" : ["rp2040:rp2040:rpipico2:flash=4194304_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"pico_rp2350_tinyusb_host" : ["rp2040:rp2040:rpipico2:flash=4194304_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb_host", "0xe48bff56", None],
"picow_rp2040" : ["rp2040:rp2040:rpipicow:flash=2097152_0,freq=125", "0xe48bff56", None],
"picow_rp2040_tinyusb" : ["rp2040:rp2040:rpipicow:flash=2097152_131072,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040" : ["rp2040:rp2040:adafruit_feather:freq=125,flash=8388608_0", "0xe48bff56", None],
"feather_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_feather:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040_adalogger" : ["rp2040:rp2040:adafruit_feather_adalogger:freq=125,flash=8388608_0", "0xe48bff56", None],
"feather_rp2040_adalogger_tinyusb" : ["rp2040:rp2040:adafruit_feather_adalogger:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040_rfm" : ["rp2040:rp2040:adafruit_feather_rfm:freq=125,flash=8388608_0", "0xe48bff56", None],
"feather_rp2040_rfm_tinyusb" : ["rp2040:rp2040:adafruit_feather_rfm:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040_dvi" : ["rp2040:rp2040:adafruit_feather_dvi:freq=125,flash=8388608_0", "0xe48bff56", None],
"feather_rp2040_dvi_tinyusb" : ["rp2040:rp2040:adafruit_feather_dvi:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040_usbhost_tinyusb" : ["rp2040:rp2040:adafruit_feather_usb_host:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2350" : ["rp2040:rp2040:adafruit_feather_rp2350_hstx:arch=arm,flash=8388608_0,freq=150,dbgport=Disabled,dbglvl=None,usbstack=picosdk", "0xe48bff56", None],
"feather_rp2350_tinyusb" : ["rp2040:rp2040:adafruit_feather_rp2350_hstx:arch=arm,flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"metro_rp2040" : ["rp2040:rp2040:adafruit_metro:flash=16777216_0,freq=200,dbgport=Disabled,dbglvl=None,usbstack=picosdk", "0xe48bff56", None],
"metro_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_metro:flash=16777216_0,freq=200,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"metro_rp2350" : ["rp2040:rp2040:adafruit_metro_rp2350:arch=arm,flash=16777216_0,freq=150,dbgport=Disabled,dbglvl=None,usbstack=picosdk", "0xe48bff56", None],
"metro_rp2350_tinyusb" : ["rp2040:rp2040:adafruit_metro_rp2350:arch=arm,flash=16777216_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"qt2040_trinkey" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:flash=8388608_0,freq=125","0xe48bff56", None],
"qt2040_trinkey_tinyusb" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"qt_py_rp2040": ["rp2040:rp2040:adafruit_qtpy:freq=125,flash=8388608_0", "0xe48bff56", None],
"qt_py_rp2040_tinyusb": ["rp2040:rp2040:adafruit_qtpy:flash=8388608_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"itsybitsy_rp2040" : ["rp2040:rp2040:adafruit_itsybitsy:freq=125,flash=8388608_524288", "0xe48bff56", None],
"itsybitsy_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_itsybitsy:flash=8388608_524288,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"floppsy_rp2040" : ["rp2040:rp2040:adafruit_floppsy:freq=125,flash=16777216_14680064", "0xe48bff56", None],
"floppsy_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_floppsy:flash=16777216_14680064,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"fruit_jam" : ["rp2040:rp2040:adafruit_fruitjam:arch=arm,flash=16777216_0,freq=150,dbgport=Disabled,dbglvl=None,usbstack=picosdk", "0xe48bff56", None],
"fruit_jam_tinyusb" : ["rp2040:rp2040:adafruit_fruitjam:arch=arm,flash=16777216_0,freq=120,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
# Attiny8xy, 16xy, 32xy (SpenceKonde)
"attiny3217" : ["megaTinyCore:megaavr:atxy7:chip=3217", None, None],
"attiny3216" : ["megaTinyCore:megaavr:atxy6:chip=3216", None, None],
"attiny1617" : ["megaTinyCore:megaavr:atxy7:chip=1617", None, None],
"attiny1616" : ["megaTinyCore:megaavr:atxy6:chip=1616", None, None],
"attiny1607" : ["megaTinyCore:megaavr:atxy7:chip=1607", None, None],
"attiny1606" : ["megaTinyCore:megaavr:atxy6:chip=1606", None, None],
"attiny817" : ["megaTinyCore:megaavr:atxy7:chip=817", None, None],
"attiny816" : ["megaTinyCore:megaavr:atxy6:chip=816", None, None],
"attiny807" : ["megaTinyCore:megaavr:atxy7:chip=807", None, None],
"attiny806" : ["megaTinyCore:megaavr:atxy6:chip=806", None, None],
# CH32v2 (openwch)
"CH32V20x_EVT": ["WCH:ch32v:CH32V20x_EVT", None, 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", "feather_rp2350")
}

View file

@ -2,10 +2,12 @@ import sys
import glob
import time
import os
import re
import shutil
import subprocess
import collections
from contextlib import contextmanager
from all_platforms import ALL_PLATFORMS
# optional wall option cause build failed if has warnings
BUILD_WALL = False
@ -18,6 +20,15 @@ if "--no_warn" in sys.argv:
BUILD_WARN = False
sys.argv.remove("--no_warn")
# optional timeout argument to extend build time
# for larger sketches or firmware builds
BUILD_TIMEOUT = False
if "--build_timeout" in sys.argv:
BUILD_TIMEOUT = True
popen_timeout = int(sys.argv[sys.argv.index("--build_timeout") + 1])
sys.argv.pop(sys.argv.index("--build_timeout") + 1)
sys.argv.remove("--build_timeout")
# add user bin to path!
BUILD_DIR = ''
# add user bin to path!
@ -51,121 +62,20 @@ elif "METROX-Examples-and-Project-Sketches" in BUILD_DIR:
CROSS = u'\N{cross mark}'
CHECK = u'\N{check mark}'
ALL_PLATFORMS={
# classic Arduino AVR
"uno" : ["arduino:avr:uno", None, None],
"leonardo" : ["arduino:avr:leonardo", None, None],
"mega2560" : ["arduino:avr:mega:cpu=atmega2560", None, None],
# Arduino SAMD
"zero" : ["arduino:samd:arduino_zero_native", "0x68ed2b88", None, None],
"cpx" : ["arduino:samd:adafruit_circuitplayground_m0", "0x68ed2b88", None],
# Espressif
"esp8266" : ["esp8266:esp8266:huzzah:eesz=4M3M,xtal=80", None, None],
"esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None, None],
"feather_esp8266" : ["esp8266:esp8266:huzzah:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,eesz=4M2M,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200", None, None],
"feather_esp32" : ["esp32:esp32:featheresp32:FlashFreq=80", None, None],
"feather_esp32_v2" : ["esp32:esp32:adafruit_feather_esp32_v2", None, None],
"magtag" : ["esp32:esp32:adafruit_magtag29_esp32s2", "0xbfdd4eee", None],
"funhouse" : ["esp32:esp32:adafruit_funhouse_esp32s2", "0xbfdd4eee", None],
"metroesp32s2" : ["esp32:esp32:adafruit_metro_esp32s2", "0xbfdd4eee", None],
"qtpy_esp32s2" : ["esp32:esp32:adafruit_qtpy_esp32s2", "0xbfdd4eee", None],
"feather_esp32s2" : ["esp32:esp32:adafruit_feather_esp32s2", "0xbfdd4eee", None],
"feather_esp32s2_tft" : ["esp32:esp32:adafruit_feather_esp32s2_tft", "0xbfdd4eee", None],
"feather_esp32s3" : ["esp32:esp32:adafruit_feather_esp32s3_nopsram", "0xc47e5767", None],
"feather_esp32s3_4mbflash_2mbpsram" : ["esp32:esp32:adafruit_feather_esp32s3", "0xc47e5767", "adafruit/master"],
"feather_esp32s3_tft" : ["esp32:esp32:adafruit_feather_esp32s3_tft", "0xc47e5767", None],
"qtpy_esp32s3" : ["esp32:esp32:adafruit_qtpy_esp32s3_nopsram", "0xc47e5767", None],
"qtpy_esp32" : ["esp32:esp32:adafruit_qtpy_esp32_pico", None, None],
"qtpy_esp32c3" : ["esp32:esp32:adafruit_qtpy_esp32c3:FlashMode=qio", None, None],
# Adafruit AVR
"trinket_3v" : ["adafruit:avr:trinket3", None, None],
"trinket_5v" : ["adafruit:avr:trinket5", None, None],
"protrinket_3v" : ["adafruit:avr:protrinket3", None, None],
"protrinket_5v" : ["adafruit:avr:protrinket5", None, None],
"gemma" : ["adafruit:avr:gemma", None, None],
"flora" : ["adafruit:avr:flora8", None, None],
"feather32u4" : ["adafruit:avr:feather32u4", None, None],
"cpc" : ["arduino:avr:circuitplay32u4cat", None, None],
# Adafruit SAMD
"gemma_m0" : ["adafruit:samd:adafruit_gemma_m0", "0x68ed2b88", None],
"trinket_m0" : ["adafruit:samd:adafruit_trinket_m0", "0x68ed2b88", None],
"feather_m0_express" : ["adafruit:samd:adafruit_feather_m0_express", "0x68ed2b88", None],
"feather_m0_express_tinyusb" : ["adafruit:samd:adafruit_feather_m0_express:usbstack=tinyusb", "0x68ed2b88", None],
"feather_m4_express" : ["adafruit:samd:adafruit_feather_m4:speed=120", "0x55114460", None],
"feather_m4_express_tinyusb" : ["adafruit:samd:adafruit_feather_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"feather_m4_can" : ["adafruit:samd:adafruit_feather_m4_can:speed=120", "0x55114460", None],
"feather_m4_can_tinyusb" : ["adafruit:samd:adafruit_feather_m4_can:speed=120,usbstack=tinyusb", "0x55114460", None],
"metro_m0" : ["adafruit:samd:adafruit_metro_m0", "0x68ed2b88", None],
"metro_m0_tinyusb" : ["adafruit:samd:adafruit_metro_m0:usbstack=tinyusb", "0x68ed2b88", None],
"metro_m4" : ["adafruit:samd:adafruit_metro_m4:speed=120", "0x55114460", None],
"metro_m4_tinyusb" : ["adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"metro_m4_airliftlite" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120", "0x55114460", None],
"metro_m4_airliftlite_tinyusb" : ["adafruit:samd:adafruit_metro_m4_airliftlite:speed=120,usbstack=tinyusb", "0x55114460", None],
"pybadge" : ["adafruit:samd:adafruit_pybadge_m4:speed=120", "0x55114460", None],
"pybadge_tinyusb" : ["adafruit:samd:adafruit_pybadge_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"pygamer" : ["adafruit:samd:adafruit_pygamer_m4:speed=120", "0x55114460", None],
"pygamer_tinyusb" : ["adafruit:samd:adafruit_pygamer_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"hallowing_m0" : ["adafruit:samd:adafruit_hallowing", "0x68ed2b88", None],
"hallowing_m4" : ["adafruit:samd:adafruit_hallowing_m4:speed=120", "0x55114460", None],
"hallowing_m4_tinyusb" : ["adafruit:samd:adafruit_hallowing_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"neotrellis_m4" : ["adafruit:samd:adafruit_trellis_m4:speed=120", "0x55114460", None],
"monster_m4sk" : ["adafruit:samd:adafruit_monster_m4sk:speed=120", "0x55114460", None],
"monster_m4sk_tinyusb" : ["adafruit:samd:adafruit_monster_m4sk:speed=120,usbstack=tinyusb", "0x55114460", None],
"pyportal" : ["adafruit:samd:adafruit_pyportal_m4:speed=120", "0x55114460", None],
"pyportal_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"pyportal_titano" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120", "0x55114460", None],
"pyportal_titano_tinyusb" : ["adafruit:samd:adafruit_pyportal_m4_titano:speed=120,usbstack=tinyusb", "0x55114460", None],
"cpx_ada" : ["adafruit:samd:adafruit_circuitplayground_m0", "0x68ed2b88", None],
"grand_central" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120", "0x55114460", None],
"grand_central_tinyusb" : ["adafruit:samd:adafruit_grandcentral_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"matrixportal" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120", "0x55114460", None],
"matrixportal_tinyusb" : ["adafruit:samd:adafruit_matrixportal_m4:speed=120,usbstack=tinyusb", "0x55114460", None],
"neotrinkey_m0" : ["adafruit:samd:adafruit_neotrinkey_m0", "0x68ed2b88", None],
"rotarytrinkey_m0" : ["adafruit:samd:adafruit_rotarytrinkey_m0", "0x68ed2b88", None],
"neokeytrinkey_m0" : ["adafruit:samd:adafruit_neokeytrinkey_m0", "0x68ed2b88", None],
"slidetrinkey_m0" : ["adafruit:samd:adafruit_slidetrinkey_m0", "0x68ed2b88", None],
"proxlighttrinkey_m0" : ["adafruit:samd:adafruit_proxlighttrinkey_m0", "0x68ed2b88", None],
"qtpy_m0" : ["adafruit:samd:adafruit_qtpy_m0", "0x68ed2b88", None],
"qtpy_m0_tinyusb" : ["adafruit:samd:adafruit_qtpy_m0:usbstack=tinyusb", "0x68ed2b88", None],
# Arduino SAMD
"mkrwifi1010" : ["arduino:samd:mkrwifi1010", "0x8054", None],
"nano_33_iot" : ["arduino:samd:nano_33_iot", "0x8057", None],
# Arduino nRF
"microbit" : ["sandeepmistry:nRF5:BBCmicrobit:softdevice=s110", None, None],
# Adafruit nRF
"nrf52832" : ["adafruit:nrf52:feather52832:softdevice=s132v6,debug=l0", None, None],
"nrf52840" : ["adafruit:nrf52:feather52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"cpb" : ["adafruit:nrf52:cplaynrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"clue" : ["adafruit:nrf52:cluenrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
"ledglasses_nrf52840" : ["adafruit:nrf52:ledglasses_nrf52840:softdevice=s140v6,debug=l0", "0xada52840", None],
# RP2040 (Philhower)
"pico_rp2040" : ["rp2040:rp2040:rpipico:freq=125,flash=2097152_0", "0xe48bff56", None],
"pico_rp2040_tinyusb" : ["rp2040:rp2040:rpipico:flash=2097152_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"feather_rp2040" : ["rp2040:rp2040:adafruit_feather:freq=125,flash=8388608_0", "0xe48bff56", None],
"feather_rp2040_tinyusb" : ["rp2040:rp2040:adafruit_feather:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
"qt2040_trinkey" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:freq=125,flash=8388608_0", "0xe48bff56", None],
"qt2040_trinkey_tinyusb" : ["rp2040:rp2040:adafruit_trinkeyrp2040qt:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb", "0xe48bff56", None],
# Attiny8xy, 16xy, 32xy (SpenceKonde)
"attiny3217" : ["megaTinyCore:megaavr:atxy7:chip=3217", None, None],
"attiny3216" : ["megaTinyCore:megaavr:atxy6:chip=3216", None, None],
"attiny1617" : ["megaTinyCore:megaavr:atxy7:chip=1617", None, None],
"attiny1616" : ["megaTinyCore:megaavr:atxy6:chip=1616", None, None],
"attiny1607" : ["megaTinyCore:megaavr:atxy7:chip=1607", None, None],
"attiny1606" : ["megaTinyCore:megaavr:atxy6:chip=1606", None, None],
"attiny817" : ["megaTinyCore:megaavr:atxy7:chip=817", None, None],
"attiny816" : ["megaTinyCore:megaavr:atxy6:chip=816", None, None],
"attiny807" : ["megaTinyCore:megaavr:atxy7:chip=807", None, None],
"attiny806" : ["megaTinyCore:megaavr:atxy6:chip=806", None, 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," # esp32 beta release
"https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_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,"
"https://drazzy.good-enough.cloud/package_drazzy.com_index.json,"
"https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json"
)
# global exit code
success = 0
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:
@ -189,6 +99,7 @@ class ColorPrint:
def print_bold(message, end = '\n'):
sys.stdout.write('\x1b[1;37m' + message.strip() + '\x1b[0m' + end)
def manually_install_esp32_bsp(repo_info):
print("Manually installing latest ESP32 BSP...")
# Assemble git url
@ -223,13 +134,18 @@ def manually_install_esp32_bsp(repo_info):
print(out)
print("Installed ESP32 BSP from source!")
def install_platform(fqbn, full_platform_name=None):
if os.path.exists("/home/runner/.arduino15/package_drazzy.json"):
print("Moving drazzy.json")
shutil.move("/home/runner/.arduino15/package_drazzy.json", "/home/runner/.arduino15/package_drazzy.com_index.json")
print("Installing", fqbn, end=" ")
if fqbn == "adafruit:avr": # we have a platform dep
install_platform("arduino:avr", full_platform_name)
if full_platform_name[2] is not None:
manually_install_esp32_bsp(full_platform_name[2]) # build esp32 bsp from desired source and branch
for retry in range(0, 3):
print("arduino-cli core install "+fqbn+" --additional-urls "+BSP_URLS)
if os.system("arduino-cli core install "+fqbn+" --additional-urls "+BSP_URLS+" > /dev/null") == 0:
break
print("...retrying...", end=" ")
@ -242,6 +158,7 @@ def install_platform(fqbn, full_platform_name=None):
# print installed core version
print(os.popen('arduino-cli core list | grep {}'.format(fqbn)).read(), end='')
def run_or_die(cmd, error):
print(cmd)
attempt = 0
@ -254,65 +171,81 @@ def run_or_die(cmd, error):
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:
def is_library_installed(lib_name):
try:
os.symlink(BUILD_DIR, os.environ['HOME']+'/Arduino/libraries/' + os.path.basename(BUILD_DIR))
except FileExistsError:
pass
installed_libs = subprocess.check_output(["arduino-cli", "lib", "list"]).decode("utf-8")
return not all(not item for item in [re.match('^'+lib_name+'\\s*\\d+\\.', line) for line in installed_libs.split('\n')])
except subprocess.CalledProcessError as e:
print("Error checking installed libraries:", e)
return False
def install_library_deps():
print()
ColorPrint.print_info('#'*40)
print("INSTALLING ARDUINO LIBRARIES")
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()
if not is_library_installed(dep):
print("Installing "+dep)
run_or_die('arduino-cli lib install "'+dep+'" > /dev/null',
"FAILED to install dependency "+dep)
else:
print("Skipping already installed lib: "+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 glob01(pattern):
result = glob.glob(pattern)
if len(result) > 1:
raise RuntimeError(f"Required pattern {pattern} to match at most 1 file, got {result}")
return result[0] if result else None
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
"""
@ -328,10 +261,12 @@ def download_uf2_utils():
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.
def generate_uf2(platform, fqbn, example_path):
"""Generates a .uf2 file from a .bin or .hex file.
:param str platform: The platform name.
:param str fqbn: The fully qualified board name.
:param str example_path: A path to the compiled .bin or .hex file.
"""
if not download_uf2_utils():
return None
@ -361,34 +296,23 @@ def generate_uf2(example_path):
cmd = ['python3', 'uf2conv.py', input_file, '-c', '-f', family_id, '-b', "0x0000", '-o', output_file]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
r = proc.wait(timeout=60)
if BUILD_TIMEOUT:
r = proc.wait(timeout=popen_timeout)
else:
r = proc.wait(timeout=60)
out = proc.stdout.read()
err = proc.stderr.read()
if r == 0 and not err:
if r == 0: # and not err: # we might get warnings that do not affect the result
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"))
ColorPrint.print_fail("\n\rERRCODE:", str(r))
ColorPrint.print_fail("\n\rOUTPUT: ", out.decode("utf-8"))
ColorPrint.print_fail("\n\rERROR: ", 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)
@contextmanager
def group_output(title):
@ -404,25 +328,42 @@ def group_output(title):
sys.stdout.flush()
def test_examples_in_folder(folderpath):
def test_examples_in_folder(platform, folderpath):
global success
fqbn = ALL_PLATFORMS[platform][0]
for example in sorted(os.listdir(folderpath)):
examplepath = folderpath+"/"+example
if os.path.isdir(examplepath):
test_examples_in_folder(examplepath)
test_examples_in_folder(platform, 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"
# .skip txt include all skipped platforms, one per line
skip_txt = folderpath+"/.skip.txt"
is_skip = False
if os.path.exists(skipfilename):
is_skip = True
if os.path.exists(skip_txt):
with open(skip_txt) as f:
lines = f.readlines()
for line in lines:
if line.strip() == platform:
is_skip = True
break
if is_skip:
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:
@ -447,7 +388,10 @@ def test_examples_in_folder(folderpath):
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
try:
out, err = proc.communicate(timeout=120)
if BUILD_TIMEOUT:
out, err = proc.communicate(timeout=popen_timeout)
else:
out, err = proc.communicate(timeout=120)
r = proc.returncode
except:
proc.kill()
@ -461,11 +405,11 @@ def test_examples_in_folder(folderpath):
with group_output(f"{example} {fqbn} build output"):
ColorPrint.print_fail(err.decode("utf-8"))
if os.path.exists(gen_file_name):
if ALL_PLATFORMS[platform][1] == None:
if ALL_PLATFORMS[platform][1] is None:
ColorPrint.print_info("Platform does not support UF2 files, skipping...")
else:
ColorPrint.print_info("Generating UF2...")
filename = generate_uf2(folderpath)
filename = generate_uf2(platform, fqbn, folderpath)
if filename is None:
success = 1 # failure
if IS_LEARNING_SYS:
@ -481,53 +425,38 @@ def test_examples_in_folder(folderpath):
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"))
def main():
# Test platforms
platforms = []
# 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:
ColorPrint.print_fail(CROSS)
ColorPrint.print_fail(out.decode("utf-8"))
ColorPrint.print_fail(err.decode("utf-8"))
success = 1
print("Unknown platform: ", arg)
exit(-1)
# Install libraries deps
install_library_deps()
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]), ALL_PLATFORMS[platform]) # take only first two elements
print('#'*80)
if not IS_LEARNING_SYS:
test_examples_in_folder(platform, BUILD_DIR+"/examples")
else:
test_examples_in_folder(platform, BUILD_DIR)
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]), ALL_PLATFORMS[platform]) # 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)
if __name__ == "__main__":
main()
exit(success)

View file

@ -18,6 +18,7 @@ __AUTHOR__="Jeroen de Bruijn, modified by ladyada"
# Optional global variables:
# - DOXYFILE : The Doxygen configuration file.
# - PRETTYNAME : A string name of the project (for the doxy headers)
# - PRESERVE_FOLDERS : Comma-separated list of folders to preserve during cleanup
#
# For information on how to encrypt variables for Travis CI please go to
# https://docs.travis-ci.com/user/environment-variables/#Encrypted-Variables
@ -84,6 +85,19 @@ git config --global push.default simple
git config user.name "Doxygen CI"
git config user.email "ci-arduino@invalid"
# Check if PRESERVE_FOLDERS is set and back them up
if [ -n "$PRESERVE_FOLDERS" ]; then
echo "Preserving folders: $PRESERVE_FOLDERS"
mkdir -p /tmp/preserved
# Move preserved folders to temp dir
for folder in ${PRESERVE_FOLDERS//,/ }; do
if [ -d "$folder" ]; then
echo "Backing up folder: $folder"
cp -r "$folder" /tmp/preserved/
fi
done
fi
# Remove everything currently in the gh-pages branch.
# GitHub is smart enough to know which files have changed and which files have
# stayed the same and will only update the changed files. So the gh-pages branch
@ -99,6 +113,16 @@ else
rm -r -- !(index.html) || true
fi
# Restore preserved folders if they were backed up
if [ -n "$PRESERVE_FOLDERS" ]; then
for folder in ${PRESERVE_FOLDERS//,/ }; do
if [ -d "/tmp/preserved/$folder" ]; then
echo "Restoring folder: $folder"
cp -r "/tmp/preserved/$folder" ./
fi
done
fi
# Need to create a .nojekyll file to allow filenames starting with an underscore
# to be seen on the gh-pages site. Therefore creating an empty .nojekyll file.
# Presumably this is only needed when the SHORT_NAMES option in Doxygen is set

View file

@ -7,11 +7,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-python@v1
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- uses: actions/checkout@v2
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- uses: actions/checkout@v3
with:
repository: adafruit/ci-arduino
path: ci