Steps to use libraries 2.0


#1

Libraries 2.0 needs support in the CLI and firmware, so follow these steps to get started using it.

  1. Install a pre-release version of the CLI
    npm install -g https://github.com/spark/particle-cli/releases/download/v1.19.0-libraries.23/particle-cli-1.19.0-libraries.23.tgz

  2. Update your device to 0.5.3 firmware or later (on the Photon, you can skip this step and rely on safe mode healer)

  3. Create a new folder for your project. The CLI will save the library dependencies in project.properties
    +- application.cpp +- project.properties <-- will be created by the CLI and contain library dependencies

  4. Add a library such as neopixel library as a dependency
    particle library add neopixel

  5. You should see Added library neopixel 0.0.10 to project
    And the line dependencies.neopixel=0.0.10 should appear in project.properties

  6. Compile/flash the project using the pre-release firmware
    particle flash my_photon .

Please reply to this topic with tool installation issues. If you have other comments and suggestions let’s discuss that in a separate topic.


Library search added to CLI
Libraries depending on other libraries
Libraries 2.0 Resources guide
#2

On Monday you should also be able to use Libraries 2.0 with v0.5.3-rc.3, and then v0.5.3 (default) at the end of next week.


#3
KENMBP:~ kennethlimcp$ p --version
2.0.0-libraries.2
KENMBP:cli-lib kennethlimcp$ mkdir src
KENMBP:cli-lib kennethlimcp$ cd src/
KENMBP:src kennethlimcp$ touch application.cpp
KENMBP:src kennethlimcp$ ..
KENMBP:cli-lib kennethlimcp$ particle add library neopixel

Usage: library <command>

Commands:
  init     Initializes a new library in the specified or current directory..
  install  installs a library
  migrate  Migrates a local library from v1 to v2 format.
  add      Add a library to the current project.

Global Options:
  --args             Path to JSON config file
  -v, --verbose      How much logging to display                         [count]
  --interactive      forces interactive mode                           [boolean]
  --non-interactive  Run in non-interactive mode. This means all required data
                     must be passed as command line arguments.         [boolean]
  --json             Output in JSON format instead of human friendly   [boolean]
  --help             Provides extra details and options for a given command
                                                                       [boolean]

No such command 'library library neopixel'

KENMBP:cli-lib kennethlimcp$ particle compile photon . --target 0.6.0-libraries.1

Compiling code for photon
Targeting version: 0.6.0-libraries.1

Including:
    /Users/kennethlimcp/Desktop/cli-lib/project.properties
    /Users/kennethlimcp/Desktop/cli-lib/src/application.cpp
attempting to compile firmware 
downloading binary from: /v1/binaries/57c0da14f917f2b94bd09094
saving to: photon_firmware_1472256527659.bin
Compile succeeded.
Saved firmware to: /Users/kennethlimcp/Desktop/cli-lib/photon_firmware_1472256527659.bin

The above command should be particle library add neopixel

Other than that, things are looking great :smiley:


#4

I fixed the instructions to say particle library add neopixel. Please give it a shot again Kenneth!


#5

I gave it a shot the moment it gave me errors.

It’s working great with an example app. :beers:


#6

I read the terminal output, but misread the comment :sweat_smile: Friday night… :beers: to you too!


#7

After executing this command on my Win 8.1Pro64bit (no laughing!) I get this

C:\Users\Andy>node --version
v4.2.4

C:\Users\Andy>npm --version
2.14.12

C:\Users\Andy>particle --version
module.js:340
    throw err;
    ^

Error: Cannot find module 'es6-promisify'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:289:25)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\dist\cmd\library_init.js:20:17)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)

Is there another node update required? Or what else could be wrong?


That was my output during one of my tries

C:\Users\Andy>npm install -g https://github.com/spark/particle-cli/releases/download/v2.0.0-libraries.2/particle-cli-2.0.0-libraries.2.tgz
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue

> spawn-sync@1.0.15 postinstall C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\node_modules\yeoman-environment\node_modules\inquirer\node
_modules\external-editor\node_modules\spawn-sync
> node postinstall


> spawn-sync@1.0.15 postinstall C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\node_modules\particle-cli-library-manager\node_modules\yeo
man-generator\node_modules\yeoman-test\node_modules\inquirer\node_modules\external-editor\node_modules\spawn-sync
> node postinstall

-
> serialport@3.1.2 install C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\node_modules\serialport
> node-pre-gyp install --fallback-to-build

[serialport] Success: "C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\node_modules\serialport\build\Release\serialport.node" is installed
 via remote
C:\Users\Andy\AppData\Roaming\npm\particle -> C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli\bin\particle.js
particle-cli@2.0.0-libraries.2 C:\Users\Andy\AppData\Roaming\npm\node_modules\particle-cli
β”œβ”€β”€ cli-spinner@0.2.5
β”œβ”€β”€ xtend@4.0.1
β”œβ”€β”€ semver@5.3.0
β”œβ”€β”€ chalk@1.1.3 (escape-string-regexp@1.0.5, supports-color@2.0.0, ansi-styles@2.2.1, has-ansi@2.0.0, strip-ansi@3.0.1)
β”œβ”€β”€ temp@0.8.3 (os-tmpdir@1.0.1, rimraf@2.2.8)
β”œβ”€β”€ cli-table@0.3.1 (colors@1.0.3)
β”œβ”€β”€ glob@4.5.3 (inherits@2.0.1, once@1.3.3, inflight@1.0.5, minimatch@2.0.10)
β”œβ”€β”€ node-wifiscanner2@1.2.0 (os-locale@1.4.0)
β”œβ”€β”€ inquirer@0.11.4 (strip-ansi@3.0.1, ansi-regex@2.0.0, ansi-escapes@1.4.0, through@2.3.8, rx-lite@3.1.2, cli-width@1.1.1, figures@1.7.0, string-widt
h@1.0.2, readline2@1.0.1, cli-cursor@1.0.2, run-async@0.1.0)
β”œβ”€β”€ when@3.7.7
β”œβ”€β”€ form-data@1.0.0-rc4 (async@1.5.2, combined-stream@1.0.5, mime-types@2.1.11)
β”œβ”€β”€ binary-version-reader@0.4.0 (buffer-crc32@0.2.5, h5.buffers@0.1.1)
β”œβ”€β”€ latest-version@2.0.0 (package-json@2.4.0)
β”œβ”€β”€ hogan.js@2.0.0
β”œβ”€β”€ request@2.74.0 (aws-sign2@0.6.0, tunnel-agent@0.4.3, forever-agent@0.6.1, oauth-sign@0.8.2, is-typedarray@1.0.0, caseless@0.11.0, stringstream@0.0
.5, aws4@1.4.1, isstream@0.1.2, json-stringify-safe@5.0.1, extend@3.0.0, tough-cookie@2.3.1, qs@6.2.1, node-uuid@1.4.7, combined-stream@1.0.5, mime-ty
pes@2.1.11, bl@1.1.2, hawk@3.1.3, http-signature@1.1.1, har-validator@2.0.6)
β”œβ”€β”€ yargs@4.8.1 (get-caller-file@1.0.2, decamelize@1.2.0, lodash.assign@4.2.0, y18n@3.2.1, which-module@1.0.0, set-blocking@2.0.0, require-main-filena
me@1.0.1, require-directory@2.1.1, window-size@0.2.0, yargs-parser@2.4.1, os-locale@1.4.0, cliui@3.2.0, string-width@1.0.2, read-pkg-up@1.0.1)
β”œβ”€β”€ es6-promisify-all@0.1.0 (es6-promisify@2.0.0)
β”œβ”€β”€ handlebars@4.0.5 (async@1.5.2, source-map@0.4.4, optimist@0.6.1, uglify-js@2.7.3)
β”œβ”€β”€ moment@2.14.1
β”œβ”€β”€ particle-api-js@6.0.3 (superagent-prefix@0.0.2, stream-http@2.2.1, superagent@2.2.0)
β”œβ”€β”€ lodash@3.10.1
β”œβ”€β”€ softap-setup@1.1.4 (nconf@0.7.2, node-rsa@0.2.30)
β”œβ”€β”€ yeoman-environment@1.6.3 (escape-string-regexp@1.0.5, log-symbols@1.0.2, text-table@0.2.0, untildify@2.1.0, debug@2.2.0, diff@2.2.3, globby@4.1.0,
 mem-fs@1.1.3, grouped-queue@0.3.2, inquirer@1.1.2, lodash@4.15.0)
β”œβ”€β”€ particle-cli-library-manager@0.0.4-develop.2 (superagent-prefix@0.0.2, babel-plugin-transform-runtime@6.12.0, app-root-path@1.3.0, properties-pars
er@0.3.1, verror@1.8.1, es6-promisify@4.1.0, mkdirp@0.5.1, tar-stream@1.5.2, superagent@1.8.4, gunzip-maybe@1.3.1, fs-extra@0.30.0, particle-api-js@5.
3.0-develop.1, tar.gz@1.0.5, yeoman-generator@0.24.1, async@2.0.1)
β”œβ”€β”€ babel-runtime@6.11.6 (regenerator-runtime@0.9.5, core-js@2.4.1)
└── serialport@3.1.2 (bindings@1.2.1, commander@2.9.0, debug@2.2.0, es6-promise@3.2.1, nan@2.4.0, object.assign@4.0.4)

#8

I’ve seen this particular error while working on the libs 2.0 feature. It’s like npm forgets to install one dependency of a dependency (2nd order dependency). I’ll add es6-promisify to the main CLI package.json to avoid this.

In the mean time can you try npm install es6-promisify from where the CLI module is installed? I’m not sure if this will work given how many folder structures npm has for installed modules…


#9

Yup, that solved the problem.
I installed that package in %appdata%\npm-cache


#10

I just tried to flash a sketch to my Photon via Build with the target set as 0.6.0-libraries.1 (prerelease) but only ever get β€œError: 500. Please try again later. If the issue persists, please report to hello@particle.io.”

I didn’t intend to use the Libraries 2.0 features, but flashing β€œconventional” firmware should still work, or not?


#11

Ok. Thanks for the heads up. I’ll look at that during the week.


#12

@ScruffR I created a new prerelease that works on Windows.


#13

@jvanier, I just installed on Windows 10 with command line:
npm install -g https://github.com/spark/particle-cli/releases/download/v2.0.0-libraries.3/particle-cli-2.0.0-libraries.3.tgz

I got the same problem with es6-promisify not being found. I tried to fix by installing es6-promisify but error remained:

C:\SPARK\TESTING>npm install es6-promisify
es6-promisify@4.1.0 node_modules\es6-promisify
└── es6-promise@3.2.1

C:\SPARK\TESTING>particle --version
module.js:340
    throw err;
    ^

Error: Cannot find module 'es6-promisify'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:289:25)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli\dist\
cmd\project_properties.js:12:21)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)

C:\SPARK\TESTING>

How Is the install command line still correct or did you not publish the new prerelease?


#14

Brett just reported the same thing on Node 4. Stay tuned for another update shortly. There’s so much variability when dealing with Node…


#15

@jvanier, should I updated to a newer node version? If so, which?


#16

It’s best if you just keep using the same version of Node. It’s more representative of what other users will see.

The CLI is supposed to work on Node 4 or later.

When you have a chance you can try the 2.0.0-libraries.4 version that has the es6-promisify fix.


#17

@jvanier, FYI here is what the latest install puts out. Running particle --version correctl reports 2.0.0-libraries.4

C:\SPARK\TESTING>npm install -g https://github.com/spark/particle-cli/releases/download/v2.0
.0-libraries.4/particle-cli-2.0.0-libraries.4.tgz
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a
RegExp DoS issue
npm WARN excluding symbolic link test\server\static\ie8-polyfill.js -> ../../../ie8-polyfill
.js
\
> spawn-sync@1.0.15 postinstall C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli\
node_modules\yeoman-environment\node_modules\inquirer\node_modules\external-editor\node_modu
les\spawn-sync
> node postinstall

npm WARN excluding symbolic link test\server\static\ie8-polyfill.js -> ../../../ie8-polyfill
.js

> spawn-sync@1.0.15 postinstall C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli\
node_modules\particle-cli-library-manager\node_modules\yeoman-generator\node_modules\yeoman-
test\node_modules\inquirer\node_modules\external-editor\node_modules\spawn-sync
> node postinstall

|
> serialport@3.1.2 install C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli\node_
modules\serialport
> node-pre-gyp install --fallback-to-build

[serialport] Success: "C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli\node_modu
les\serialport\build\Release\serialport.node" is installed via remote
C:\Users\Paul\AppData\Roaming\npm\particle -> C:\Users\Paul\AppData\Roaming\npm\node_modules
\particle-cli\bin\particle.js
particle-cli@2.0.0-libraries.4 C:\Users\Paul\AppData\Roaming\npm\node_modules\particle-cli
β”œβ”€β”€ cli-spinner@0.2.5
β”œβ”€β”€ xtend@4.0.1
β”œβ”€β”€ semver@5.3.0
β”œβ”€β”€ es6-promisify@4.1.0 (es6-promise@3.2.1)
β”œβ”€β”€ temp@0.8.3 (os-tmpdir@1.0.1, rimraf@2.2.8)
β”œβ”€β”€ chalk@1.1.3 (escape-string-regexp@1.0.5, ansi-styles@2.2.1, supports-color@2.0.0, has-an
si@2.0.0, strip-ansi@3.0.1)
β”œβ”€β”€ cli-table@0.3.1 (colors@1.0.3)
β”œβ”€β”€ glob@4.5.3 (inherits@2.0.1, once@1.3.3, inflight@1.0.5, minimatch@2.0.10)
β”œβ”€β”€ node-wifiscanner2@1.2.0 (os-locale@1.4.0)
β”œβ”€β”€ when@3.7.7
β”œβ”€β”€ inquirer@0.11.4 (ansi-regex@2.0.0, strip-ansi@3.0.1, ansi-escapes@1.4.0, rx-lite@3.1.2,
through@2.3.8, cli-width@1.1.1, figures@1.7.0, string-width@1.0.2, readline2@1.0.1, cli-curs
or@1.0.2, run-async@0.1.0)
β”œβ”€β”€ form-data@1.0.0-rc4 (async@1.5.2, combined-stream@1.0.5, mime-types@2.1.11)
β”œβ”€β”€ binary-version-reader@0.4.0 (buffer-crc32@0.2.5, h5.buffers@0.1.1)
β”œβ”€β”€ latest-version@2.0.0 (package-json@2.4.0)
β”œβ”€β”€ hogan.js@2.0.0
β”œβ”€β”€ request@2.74.0 (tunnel-agent@0.4.3, aws-sign2@0.6.0, oauth-sign@0.8.2, forever-agent@0.6
.1, is-typedarray@1.0.0, caseless@0.11.0, stringstream@0.0.5, aws4@1.4.1, isstream@0.1.2, js
on-stringify-safe@5.0.1, extend@3.0.0, tough-cookie@2.3.1, qs@6.2.1, node-uuid@1.4.7, combin
ed-stream@1.0.5, mime-types@2.1.11, bl@1.1.2, hawk@3.1.3, http-signature@1.1.1, har-validato
r@2.0.6)
β”œβ”€β”€ yargs@4.8.1 (get-caller-file@1.0.2, decamelize@1.2.0, lodash.assign@4.2.0, y18n@3.2.1, w
hich-module@1.0.0, set-blocking@2.0.0, require-main-filename@1.0.1, require-directory@2.1.1,
 window-size@0.2.0, yargs-parser@2.4.1, os-locale@1.4.0, string-width@1.0.2, cliui@3.2.0, re
ad-pkg-up@1.0.1)
β”œβ”€β”€ particle-api-js@6.0.4 (superagent-prefix@0.0.2, stream-http@2.2.1, superagent@2.2.0)
β”œβ”€β”€ handlebars@4.0.5 (async@1.5.2, source-map@0.4.4, optimist@0.6.1, uglify-js@2.7.3)
β”œβ”€β”€ moment@2.14.1
β”œβ”€β”€ lodash@3.10.1
β”œβ”€β”€ softap-setup@1.1.4 (nconf@0.7.2, node-rsa@0.2.30)
β”œβ”€β”€ yeoman-environment@1.6.3 (escape-string-regexp@1.0.5, log-symbols@1.0.2, text-table@0.2.
0, untildify@2.1.0, debug@2.2.0, diff@2.2.3, globby@4.1.0, mem-fs@1.1.3, grouped-queue@0.3.2
, inquirer@1.1.2, lodash@4.15.0)
β”œβ”€β”€ particle-cli-library-manager@0.0.4-develop.3 (superagent-prefix@0.0.2, babel-plugin-tran
sform-runtime@6.12.0, app-root-path@1.3.0, properties-parser@0.3.1, verror@1.8.1, mkdirp@0.5
.1, tar-stream@1.5.2, superagent@1.8.4, gunzip-maybe@1.3.1, fs-extra@0.30.0, tar.gz@1.0.5, y
eoman-generator@0.24.1, async@2.0.1)
β”œβ”€β”€ babel-runtime@6.11.6 (regenerator-runtime@0.9.5, core-js@2.4.1)
└── serialport@3.1.2 (bindings@1.2.1, es6-promise@3.2.1, commander@2.9.0, nan@2.4.0, object.
assign@4.0.4, debug@2.2.0)

C:\SPARK\TESTING>

#18

@jvanier, I created an app directory under which I added an src directory. I imported the neopixel library (since I couldn’t import any other!) and used one of the examples files and placed it in the src directory (rainbow.cpp). When I compile (not flash) from the app directory I get:

C:\SPARK\TESTING\libtest>particle compile photon . --target 0.6.0-libraries.1

Compiling code for photon
Targeting version: 0.6.0-libraries.1

Including:
    C:/SPARK/TESTING/libtest/project.properties
    C:/SPARK/TESTING/libtest/src/rainbow.cpp
attempting to compile firmware
Compile failed. Exiting.
Now using node v0.10.44
Processing  /workspace/project.properties
Skipping .properties file
Processing  /workspace/rainbow.cpp
Skipping .cpp file
Now using node v6.2.1
particle-cli v1.16.0-develop.1

! A newer version (1.16.0) of particle-cli is available.
! Upgrade now by running: npm install -g particle-cli

particle-cli v1.16.0-develop.1

! A newer version (1.16.0) of particle-cli is available.
! Upgrade now by running: npm install -g particle-cli

Cannot install library: directory '/workspace' is a 'simple' format project, please change t
o a 'extended' format.
fatal: repository '/firmware' does not exist
make -C ../modules/photon/user-part all
make[1]: Entering directory '/firmware/modules/photon/user-part'
make -C ../../../user
make[2]: Entering directory '/firmware/user'
Building cpp file: /workspace/rainbow.cpp
Invoking: ARM GCC CPP Compiler
mkdir -p ../build/target/user/platform-6-m/workspace/
arm-none-eabi-gcc -DSTM32_DEVICE -DSTM32F2XX -DPLATFORM_THREADING=1 -DPLATFORM_ID=6 -DPLATFO
RM_NAME=photon -DUSBD_VID_SPARK=0x2B04 -DUSBD_PID_DFU=0xD006 -DUSBD_PID_CDC=0xC006 -DSPARK_P
LATFORM -g3 -gdwarf-2 -Os -mcpu=cortex-m3 -mthumb -DINCLUDE_PLATFORM=1 -DPRODUCT_ID=6 -DPROD
UCT_FIRMWARE_VERSION=65535 -DUSE_STDPERIPH_DRIVER -DDFU_BUILD_ENABLE -DSYSTEM_VERSION_STRING
=0.6.0-rc.1 -DRELEASE_BUILD -I./inc -I../wiring/inc -I../system/inc -I../services/inc -I../c
ommunication/src -I../hal/inc -I../hal/shared -I../hal/src/photon -I../hal/src/stm32f2xx -I.
./hal/src/stm32 -I../hal/src/photon/api -I../platform/shared/inc -I../platform/MCU/STM32F2xx
/STM32_USB_Host_Driver/inc -I../platform/MCU/STM32F2xx/STM32_USB_OTG_Driver/inc -I../platfor
m/MCU/STM32F2xx/STM32_StdPeriph_Driver/inc -I../platform/MCU/STM32F2xx/STM32_USB_Device_Driv
er/inc -I../platform/MCU/STM32F2xx/SPARK_Firmware_Driver/inc -I../platform/MCU/shared/STM32/
inc -I../platform/MCU/STM32F2xx/CMSIS/Include -I../platform/MCU/STM32F2xx/CMSIS/Device/ST/In
clude -I../dynalib/inc -I/workspace/ -I./libraries -I. -MD -MP -MF ../build/target/user/plat
form-6-m/workspace/rainbow.o.d -ffunction-sections -fdata-sections -Wall -Wno-switch -Wno-er
ror=deprecated-declarations -fmessage-length=0 -fno-strict-aliasing -DSPARK=1 -DPARTICLE=1 -
DSTART_DFU_FLASHER_SERIAL_SPEED=14400 -DSTART_YMODEM_FLASHER_SERIAL_SPEED=28800 -DSPARK_PLAT
FORM_NET=BCM9WCDUSI09 -fno-builtin-malloc -fno-builtin-free -fno-builtin-realloc  -DLOG_INCL
UDE_SOURCE_INFO -DUSER_FIRMWARE_IMAGE_SIZE=0x20000 -DUSER_FIRMWARE_IMAGE_LOCATION=0x80A0000
-DMODULAR_FIRMWARE=1 -DMODULE_VERSION=4 -DMODULE_FUNCTION=5 -DMODULE_INDEX=1 -DMODULE_DEPEND
ENCY=4,2,100 -D_GNU_SOURCE -D_WINSOCK_H -DLOG_MODULE_CATEGORY="\"app\""  -fno-exceptions -fn
o-rtti -fcheck-new -std=gnu++11 -c -o ../build/target/user/platform-6-m/workspace/rainbow.o
/workspace/rainbow.cpp
/workspace/rainbow.cpp:9:52: fatal error: neopixel/neopixel.h: No such file or directory
 #include "neopixel/neopixel.h" // use for Build IDE
                                                    ^
compilation terminated.
../build/module.mk:261: recipe for target '../build/target/user/platform-6-m/workspace/rainb
ow.o' failed
make[2]: *** [../build/target/user/platform-6-m/workspace/rainbow.o] Error 1
make[2]: Leaving directory '/firmware/user'
../../../build/recurse.mk:11: recipe for target 'user' failed
make[1]: *** [user] Error 2
make[1]: Leaving directory '/firmware/modules/photon/user-part'
../build/recurse.mk:11: recipe for target 'modules/photon/user-part' failed
make: *** [modules/photon/user-part] Error 2

C:\SPARK\TESTING\libtest>

#19

@jvanier, the reason I could not add other libraries is that the upper/lower case letters in the library name need to match exactly with the library’s name. Since the libraries are listed in all-caps, you need to get the correct spelling by viewing the β€œi” information for that library. This makes the process painful.


#20

We are still missing the compatibility layer in the compile server to make the old style #include "neopixel/neopixel.h" work. For now you can have to use #include "neopixel.h" directly, Γ  la Arduino.

You can now use any public library, not just neopixel anymore.

What’s worrying me is that the project structure is being flattened. The log show Building cpp file: /workspace/rainbow.cpp instead of Building cpp file: /workspace/src/rainbow.cpp

Due to the project being flattened, it’s not possible to compile projects with libraries on Windows.

We’ll make the library name case insensitive.


Adapter header files for libraries