Merge branch 'release/v2.8.0'

This commit is contained in:
Ivan Kravets
2016-01-29 14:43:35 +02:00
93 changed files with 776 additions and 343 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
.tox .tox
docs/_build docs/_build
dist dist
build

View File

@ -1,14 +1,39 @@
Release History Release Notes
=============== =============
PlatformIO 2.0 PlatformIO 2.0
-------------- --------------
2.8.0 (2016-01-29)
~~~~~~~~~~~~~~~~~~
* `PlatformIO IDE <http://docs.platformio.org/en/latest/ide/atom.html>`_ for
Atom
(`issue #470 <https://github.com/platformio/platformio/issues/470>`_)
* Added ``pio`` command line alias for ``platformio`` command
(`issue #447 <https://github.com/platformio/platformio/issues/447>`_)
* Added SPL-Framework support for Nucleo F401RE board
(`issue #453 <https://github.com/platformio/platformio/issues/453>`_)
* Added ``upload_resetmethod`` option to `Project Configuration File platformio.ini <http://docs.platformio.org/en/latest/projectconf.html>`__
and allowed to `change default upload reset method <http://docs.platformio.org/en/latest/platforms/espressif.html#custom-reset-method>`_
for Espressif development platform
(`issue #444 <https://github.com/platformio/platformio/issues/444>`_)
* Allowed to force output of color ANSI-codes or to disable progress bar even
if the output is a ``pipe`` (not a ``tty``) using `Environment variables <http://docs.platformio.org/en/latest/envvars.html>`__
(`issue #465 <https://github.com/platformio/platformio/issues/465>`_)
* Set 1Mb SPIFFS for Espressif boards by default
(`issue #458 <https://github.com/platformio/platformio/issues/458>`_)
* Exclude ``test*`` folder by default from build process
* Generate project for IDEs with information about installed libraries
* Fixed builder for mbed framework and ST STM32 platform
2.7.1 (2016-01-06) 2.7.1 (2016-01-06)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
* Initial support for Arduino Zero board * Initial support for Arduino Zero board
(`issue #356 <https://github.com/platformio/platformio/issues/356>`_) (`issue #356 <https://github.com/platformio/platformio/issues/356>`_)
* Added support for completions to Atom text editor using ``.clang_complete``
* Generate default targets for `supported IDE <http://docs.platformio.org/en/latest/ide.html>`__ * Generate default targets for `supported IDE <http://docs.platformio.org/en/latest/ide.html>`__
(CLion, Eclipse IDE, Emacs, Sublime Text, VIM): Build, (CLion, Eclipse IDE, Emacs, Sublime Text, VIM): Build,
Clean, Upload, Upload SPIFFS image, Upload using Programmer, Update installed Clean, Upload, Upload SPIFFS image, Upload using Programmer, Update installed

View File

@ -28,6 +28,10 @@ PlatformIO
.. image:: https://badges.gitter.im/Join%20Chat.svg .. image:: https://badges.gitter.im/Join%20Chat.svg
:alt: Join the chat at https://gitter.im/platformio/platformio :alt: Join the chat at https://gitter.im/platformio/platformio
:target: https://gitter.im/platformio/platformio :target: https://gitter.im/platformio/platformio
.. image:: https://img.shields.io/donate/PlatformIO.png?color=yellow
:alt: Donate for PlatformIO.Org
:target: https://www.liqpay.com/api/3/checkout?data=eyJ2ZXJzaW9uIjozLCJhY3Rpb24iOiJwYXlkb25hdGUiLCJwdWJsaWNfa2V5IjoiaTc0NzkxMDA2NjIxIiwiYW1vdW50IjoiMSIsImN1cnJlbmN5IjoiVVNEIiwiZGVzY3JpcHRpb24iOiJEb25hdGlvbiBmb3IgUGxhdGZvcm1JTy5PcmciLCJ0eXBlIjoiZG9uYXRlIiwibGFuZ3VhZ2UiOiJlbiJ9&signature=XYvETjqlpoFhoFtxUJlF6hQyS7Y%3D
`Home & Demo <http://platformio.org>`_ | `Home & Demo <http://platformio.org>`_ |
`Project Examples <https://github.com/platformio/platformio/tree/develop/examples>`_ | `Project Examples <https://github.com/platformio/platformio/tree/develop/examples>`_ |
@ -75,7 +79,7 @@ libOpenCM3, etc.*
* `IDE Integration <http://docs.platformio.org/en/latest/ide.html>`_ * `IDE Integration <http://docs.platformio.org/en/latest/ide.html>`_
* `Articles about us <http://docs.platformio.org/en/latest/articles.html>`_ * `Articles about us <http://docs.platformio.org/en/latest/articles.html>`_
* `FAQ <http://docs.platformio.org/en/latest/faq.html>`_ * `FAQ <http://docs.platformio.org/en/latest/faq.html>`_
* `Release History <http://docs.platformio.org/en/latest/history.html>`_ * `Release Notes <http://docs.platformio.org/en/latest/history.html>`_
Use whenever. *Run everywhere.* Use whenever. *Run everywhere.*
------------------------------- -------------------------------
@ -93,7 +97,7 @@ settings for most popular `Embedded Boards <http://platformio.org/#!/boards>`_.
* Colourful `command-line output <https://raw.githubusercontent.com/platformio/platformio/develop/examples/platformio-examples.png>`_ * Colourful `command-line output <https://raw.githubusercontent.com/platformio/platformio/develop/examples/platformio-examples.png>`_
* `IDE Integration <http://docs.platformio.org/en/latest/ide.html>`_ with * `IDE Integration <http://docs.platformio.org/en/latest/ide.html>`_ with
*Arduino, Eclipse, Emacs, Energia, Qt Creator, Sublime Text, Vim, Visual Studio* *Arduino, Atom, Eclipse, Emacs, Energia, Qt Creator, Sublime Text, Vim, Visual Studio*
* Cloud compiling and `Continuous Integration <http://docs.platformio.org/en/latest/ci/index.html>`_ * Cloud compiling and `Continuous Integration <http://docs.platformio.org/en/latest/ci/index.html>`_
with *AppVeyor, Circle CI, Drone, Shippable, Travis CI* with *AppVeyor, Circle CI, Drone, Shippable, Travis CI*
* Built-in `Serial Port Monitor <http://docs.platformio.org/en/latest/userguide/cmd_serialports.html#platformio-serialports-monitor>`_ and configurable * Built-in `Serial Port Monitor <http://docs.platformio.org/en/latest/userguide/cmd_serialports.html#platformio-serialports-monitor>`_ and configurable
@ -171,6 +175,7 @@ Frameworks:
* `Energia <http://platformio.org/#!/frameworks/energia>`_ * `Energia <http://platformio.org/#!/frameworks/energia>`_
* `SPL <http://platformio.org/#!/frameworks/spl>`_ * `SPL <http://platformio.org/#!/frameworks/spl>`_
* `mbed <http://platformio.org/#!/frameworks/mbed>`_ * `mbed <http://platformio.org/#!/frameworks/mbed>`_
* `WiringPi <http://platformio.org/#!/frameworks/wiringpi>`_
For further details, please refer to `What is PlatformIO? <http://docs.platformio.org/en/latest/faq.html#what-is-platformio>`_ For further details, please refer to `What is PlatformIO? <http://docs.platformio.org/en/latest/faq.html#what-is-platformio>`_

View File

@ -35,10 +35,10 @@ nav {
display: block !important; display: block !important;
} }
body { body {
padding-top: 50px; padding-top: 100px;
} }
.wy-nav-side { .wy-nav-side {
top: 50px; top: 100px;
} }
.container { .container {
@ -253,3 +253,26 @@ nav {
.navbar-header .navbar-brand { .navbar-header .navbar-brand {
color: #e0e0e0; color: #e0e0e0;
} }
/* Misc */
.top-banner {
display: block;
padding: 10px 20px;
font-weight: bold;
font-size: 14px;
color: #fff;
text-align: center;
background-color: #0275d8;
}
.top-banner:hover {
color: #fff;
text-decoration: none;
background-color: #025ebb;
}
.top-banner:visited {
color: #fff;
text-decoration: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

BIN
docs/_static/ide-atom-platformio.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 KiB

View File

@ -23,6 +23,9 @@ Here are recent articles about PlatformIO:
2016 2016
^^^^ ^^^^
* Jan 24, 2016 - **Sergey Prilukin** - `How to use IntelliJ IDEA to develop and upload software for micro controllers like Arduino <http://jandevblog.blogspot.com/2016/01/how-to-use-intellij-idea-to-develop-and.html>`_
* Jan 16, 2016 - **Dani Eichhorn** - `ESP8266 Arduino IDE Alternative: PlatformIO <http://blog.squix.ch/2016/01/esp8266-arduino-ide-alternative.html>`_
* Jan 11, 2016 - **David Mills, Ph.D.** - `STM NUCLEOF401RE TIMER IO <http://webshed.org/wiki/STM_NUCLEOF401RE_TIMER_IO>`_
* Jan 05, 2016 - **Julien Rodrigues** - `Internet Of Things: The IDE scandal <https://medium.com/@jrodrigues/internet-of-things-the-ide-scandal-5ddb8fc9d918>`_ * Jan 05, 2016 - **Julien Rodrigues** - `Internet Of Things: The IDE scandal <https://medium.com/@jrodrigues/internet-of-things-the-ide-scandal-5ddb8fc9d918>`_
2015 2015

View File

@ -34,10 +34,20 @@ operations/commands.
PlatformIO handles ``CI`` variable which is setup by PlatformIO handles ``CI`` variable which is setup by
`Continuous Integration <http://en.wikipedia.org/wiki/Continuous_integration>`_ `Continuous Integration <http://en.wikipedia.org/wiki/Continuous_integration>`_
(Travis, Circle and etc.) systems. (Travis, Circle and etc.) systems.
Currently, PlatformIO uses it to disable prompts. PlatformIO uses it to disable prompts and progress bars. In other words,
``CI=true`` automatically setup :envvar:`PLATFORMIO_SETTING_ENABLE_PROMPTS` to
``false`` and :envvar:`PLATFORMIO_DISABLE_PROGRESSBAR` to ``true``.
In other words, ``CI=true`` automatically setup .. envvar:: PLATFORMIO_FORCE_COLOR
:envvar:`PLATFORMIO_SETTING_ENABLE_PROMPTS=false <PLATFORMIO_SETTING_ENABLE_PROMPTS>`.
Force to output color ANSI-codes even if the output is a ``pipe`` (not a ``tty``).
The possible values are ``true`` and ``false``. Default is ``PLATFORMIO_FORCE_COLOR=false``.
.. envvar:: PLATFORMIO_DISABLE_PROGRESSBAR
Disable progress bar for package/library downloader and uploader. This is
useful when calling PlatformIO from subprocess and output is a ``pipe`` (not a ``tty``).
The possible values are ``true`` and ``false``. Default is ``PLATFORMIO_DISABLE_PROGRESSBAR=false``.
.. envvar:: PLATFORMIO_HOME_DIR .. envvar:: PLATFORMIO_HOME_DIR

View File

@ -79,6 +79,7 @@ Bash completion for `platformio` subcommands you need to put into your `.bashrc`
.. code-block:: bash .. code-block:: bash
eval "$(_PLATFORMIO_COMPLETE=source platformio)" eval "$(_PLATFORMIO_COMPLETE=source platformio)"
eval "$(_PLATFORMIO_COMPLETE=source pio)"
ZSH completion ZSH completion
'''''''''''''' ''''''''''''''
@ -89,6 +90,7 @@ To enable ``zsh`` completion please run these commands:
autoload bashcompinit && bashcompinit autoload bashcompinit && bashcompinit
eval "$(_PLATFORMIO_COMPLETE=source platformio)" eval "$(_PLATFORMIO_COMPLETE=source platformio)"
eval "$(_PLATFORMIO_COMPLETE=source pio)"
.. note:: .. note::

View File

@ -214,14 +214,14 @@ Arduino
* - ``due`` * - ``due``
- `Arduino Due (Programming Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_ - `Arduino Due (Programming Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_
- AT91SAM3X8E - SAM3X8E
- 84 MHz - 84 MHz
- 512 Kb - 512 Kb
- 32 Kb - 32 Kb
* - ``dueUSB`` * - ``dueUSB``
- `Arduino Due (USB Native Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_ - `Arduino Due (USB Native Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_
- AT91SAM3X8E - SAM3X8E
- 84 MHz - 84 MHz
- 512 Kb - 512 Kb
- 32 Kb - 32 Kb
@ -380,6 +380,20 @@ Arduino
- 32 Kb - 32 Kb
- 2.5 Kb - 2.5 Kb
* - ``zero``
- `Arduino Zero (Programming Port) <https://www.arduino.cc/en/Main/ArduinoBoardZero>`_
- SAMD21G18A
- 48 MHz
- 256 Kb
- 32 Kb
* - ``zeroUSB``
- `Arduino Zero (USB Native Port) <https://www.arduino.cc/en/Main/ArduinoBoardZero>`_
- SAMD21G18A
- 48 MHz
- 256 Kb
- 32 Kb
BQ BQ
~~ ~~
@ -693,7 +707,7 @@ NodeMCU
- RAM - RAM
* - ``nodemcu`` * - ``nodemcu``
- `NodeMCU 0.9 & 1.0 <http://www.nodemcu.com/>`_ - `NodeMCU 0.9 / 1.0 <http://www.nodemcu.com/>`_
- ESP8266 - ESP8266
- 80 MHz - 80 MHz
- 4096 Kb - 4096 Kb
@ -1073,7 +1087,7 @@ Teensy
- 16 Kb - 16 Kb
* - ``teensy31`` * - ``teensy31``
- `Teensy 3.1 <https://www.pjrc.com/store/teensy31.html>`_ - `Teensy 3.1 / 3.2 <https://www.pjrc.com/store/teensy31.html>`_
- MK20DX256 - MK20DX256
- 72 MHz - 72 MHz
- 256 Kb - 256 Kb

View File

@ -9,6 +9,13 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
Articles
--------
* Jan 11, 2016 - **David Mills, Ph.D.** - `STM NUCLEOF401RE TIMER IO <http://webshed.org/wiki/STM_NUCLEOF401RE_TIMER_IO>`_
See more :ref:`articles`.
Examples Examples
-------- --------

View File

@ -716,7 +716,7 @@ Teensy
- RAM - RAM
* - ``teensy31`` * - ``teensy31``
- `Teensy 3.1 <https://www.pjrc.com/store/teensy31.html>`_ - `Teensy 3.1 / 3.2 <https://www.pjrc.com/store/teensy31.html>`_
- MK20DX256 - MK20DX256
- 72 MHz - 72 MHz
- 256 Kb - 256 Kb

View File

@ -106,4 +106,11 @@ ST
- 128 Kb - 128 Kb
- 16 Kb - 16 Kb
* - ``nucleo_f401re``
- `ST Nucleo F401RE <https://developer.mbed.org/platforms/ST-Nucleo-F401RE/>`_
- STM32F401RET6
- 84 MHz
- 512 Kb
- 96 Kb
.. include:: spl_extra.rst .. include:: spl_extra.rst

View File

@ -17,8 +17,8 @@ IDE Integration
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2
ide/arduino
ide/atom ide/atom
ide/arduino
ide/clion ide/clion
ide/eclipse ide/eclipse
ide/emacs ide/emacs

View File

@ -11,47 +11,143 @@
.. _ide_atom: .. _ide_atom:
Atom PlatformIO IDE for Atom
==== =======================
`Atom <https://atom.io>`_ is a text editor that's modern, approachable, PlatformIO IDE for `Atom <https://atom.io>`_ is the missing integrated
development environment which provides comprehensive facilities
for IoT development:
* Cross-platform builder without external dependencies to the system
software:
- 200+ embedded boards
- 15+ development platforms
- 10+ frameworks
* C/C++ Intelligent code completion
* C/C++ Smart code linter
* Library Manager for the hundreds popular libraries
* Built-in Terminal with :ref:`PlatformIO CLI <userguide>` (``pio``, ``platformio``)
Atom is a source code editor that's modern, approachable,
yet hackable to the core—a tool you can customize to do anything but also use yet hackable to the core—a tool you can customize to do anything but also use
productively without ever touching a config file. productively without ever touching a config file.
This software can be used with: .. warning::
* all available :ref:`platforms` PlatformIO IDE is **in beta testing**. Please report all issues to
* all available :ref:`frameworks` `PlatformIO IDE issues tracker <https://github.com/platformio/platformio-atom-ide/issues>`_.
Refer to the `Atom Documentation <https://atom.io/docs>`_
page for more detailed information.
.. contents:: .. contents::
Integration Requirements
----------- ------------
Using `Atom Packages <https://atom.io/docs/v1.0.2/using-atom-atom-packages>`_ The only one requirement is `Python Interpreter <https://www.python.org>`_.
please install `platomformio <https://atom.io/packages/platomformio>`_ package. PlatformIO is written in Python and works on Mac OS X, Linux, Windows OS and
ARM-based credit-card sized computers (Raspberry Pi, BeagleBone, CubieBoard).
Articles / Manuals Installation
------------------ ------------
* Jul 20, 2015 - **Eli Fatsi** - `Arduino Development in Atom Editor <http://viget.com/extend/arduino-development-in-atom-editor>`_ :Python:
See more :ref:`articles`. Python is installed on Mac OS X and Linux OS by default. The only **Windows Users**
should install it manually. Please `Download the latest Python 2.7.x <https://www.python.org/downloads/>`_
and install it. **DON'T FORGET** to select ``Add python.exe to Path`` feature on the
"Customize" stage, otherwise ``python`` command will not be available.
Screenshot :Atom: Download and install `Atom <https://atom.io>`_ source code editor
:PlatformIO IDE:
Install `platformio-ide <https://atom.io/packages/platformio-ide>`_ package
using:
- **Mac OS X**: ``Menu: Atom > Preferences > Install``
- **Windows**: ``Menu: File > Settings > Install``
- **Linux**: ``Menu: Edit > Preferences > Install``
User Guide
---------- ----------
Building .. image:: ../_static/ide-atom-platformio.png
^^^^^^^^ :target: http://docs.platformio.org/en/latest/_images/ide-atom-platformio.png
.. image:: ../_static/ide-platformio-atom-1.gif Menu item ``PlatformIO``
:target: https://atom.io/packages/platomformio ~~~~~~~~~~~~~~~~~~~~~~~~
Uploading `platformio-ide <https://atom.io/packages/platformio-ide>`_ package adds to Atom
^^^^^^^^^ new menu item named ``Menu: PlatformIO`` (after ``Menu: Help`` item).
.. image:: ../_static/ide-platformio-atom-2.gif .. image:: ../_static/ide-atom-platformio-menu-item.png
:target: https://atom.io/packages/platomformio
Building / Uploading / etc.
~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ``cmd-alt-b`` / ``ctrl-alt-b`` / ``f9`` builds project without auto-uploading.
* ``cmd-alt-u`` / ``ctrl-alt-u`` builds and uploads (if no errors).
* ``cmd-alt-c`` / ``ctrl-alt-c`` cleans compiled objects.
* ``cmd-alt-t`` / ``ctrl-alt-t`` / ``f7`` run other targets (Upload using Programmer, Upload SPIFFS image, Update platforms and libraries).
* ``cmd-alt-g`` / ``ctrl-alt-g`` / ``f4`` cycles through causes of build error.
* ``cmd-alt-h`` / ``ctrl-alt-h`` / ``shift-f4`` goes to the first build error.
* ``cmd-alt-v`` / ``ctrl-alt-v`` / ``f8`` toggles the build panel.
* ``escape`` terminates build / closes the build window.
More details `Atom Build package <https://atom.io/packages/build>`_.
Code completion
~~~~~~~~~~~~~~~
PlatformIO IDE uses `clang <http://clang.llvm.org>`_ for the code completion.
To check that ``clang`` is available in your system, please open
Terminal and run ``clang --version``. If ``clang`` is not installed, then install it:
- **Mac OS X**: Install the latest Xcode along with the latest Command Line Tools
(they are installed automatically when you run ``clang`` in Terminal for the
first time, or manually by running ``xcode-select --install``
- **Windows**: Download the latest `Clang for Windows <http://llvm.org/releases/download.html>`_.
Please select "Add LLVM to the system PATH" option on the installation step.
- **Linux**: Using package managers: ``apt-get install clang`` or ``yum install clang``.
- **Other Systems**: Download the latest `Clang for the other systems <http://llvm.org/releases/download.html>`_.
.. warning::
The libraries which are added, installed or used in the project
after initializing process will not be reflected in code completion. To fix
it you need to reinitialize project using ``Menu: PlatformIO > Initialize new Project (or update existing)``.
Code linter
~~~~~~~~~~~
PlatformIO IDE uses PlatformIO's pre-built GCC toolchains for code linting. You
can customize it in ``.gcc-flags.json`` which will be generated for the selected
board in the project directory using
``Menu: PlatformIO > Initialize new Project (or update existing)``.
.. warning::
The libraries which are added, installed or used in the project
after initializing process will not be reflected in code linter. To fix
it you need to reinitialize project using ``Menu: PlatformIO > Initialize new Project (or update existing)``.
Install Shell Commands
~~~~~~~~~~~~~~~~~~~~~~
To install ``platformio`` and ``pio`` shell commands please use ``Menu:
PlatformIO > Install Shell Commands``. It will allow you to call PlatformIO from
other process, terminals and etc.
Serial Monitor
~~~~~~~~~~~~~~
Serial Monitor was temporary disabled in PlatformIO IDE 0.2.1. See
`issue #17 <https://github.com/platformio/platformio-atom-ide/issues/17>`_.
Temporary solution is to ``Menu: PlatformIO > Install Shell Commands`` and use
:ref:`cmd_serialports_monitor` from system Terminal application (not built-in in
PlatformIO IDE).
Known issues
~~~~~~~~~~~~
* Built-in Terminal doesn't support ``STDIN`` interaction

View File

@ -20,6 +20,13 @@ computers (`Raspberry Pi <http://www.raspberrypi.org>`_,
`BeagleBone <http://beagleboard.org>`_, `BeagleBone <http://beagleboard.org>`_,
`CubieBoard <http://cubieboard.org>`_). `CubieBoard <http://cubieboard.org>`_).
.. note::
We are glad to announce official :ref:`ide_atom` which provides
comprehensive facilities for IoT development: built-in PlatformIO CLI tool,
Terminal and other instruments.
Try :ref:`ide_atom` for free now!
.. contents:: .. contents::
System requirements System requirements

View File

@ -138,7 +138,13 @@ Examples:
*Required* if :ref:`libjson_downloadurl` field is not defined | Type: ``Object`` *Required* if :ref:`libjson_downloadurl` field is not defined | Type: ``Object``
The repository in which the source code can be found. The repository in which the source code can be found. The field consists for the
next items:
* ``type``
* ``url``
* ``branch`` if is not specified, default branch will be used. This field will
be ignored if tag/release exists with the value of :ref:`libjson_version`.
Example: Example:
@ -158,22 +164,46 @@ Example:
*Required* if :ref:`libjson_repository` field is not defined | Type: ``String`` *Required* if :ref:`libjson_repository` field is not defined | Type: ``String``
| Max. Length: 20 | Max. Length: 20
A version of the current library source code. A version of the current library source code. Can contain a-z, digits, dots or
dash. `Semantic Versioning <http://semver.org>`_ IS RECOMMENDED.
* Can contain a-z, digits, dots or dash. :Case 1:
* `Semantic Versioning <http://semver.org>`_ IS RECOMMENDED.
If :ref:`libjson_version` field is not defined and :ref:`libjson_repository` :ref:`libjson_version` and :ref:`libjson_repository` fields are defined.
field is defined, then |PIOAPICR| will use the The :ref:`libjson_repository` is hosted on GitHub or Bitbucket.
`CVS <http://en.wikipedia.org/wiki/Concurrent_Versions_System>` revision from
the latest commit as "current version". For example, ``13`` (*SVN*) or first
10 chars of *SHA* digest ``e4564b7da4`` (*Git*).
If :ref:`libjson_version` and :ref:`libjson_repository` fields are defined, |PIOAPICR| will lookup for release tag named as value of :ref:`libjson_version`
then :ref:`libjson_version` has HIGHER PRIORITY. We recommend to use or with ``v`` prefix (you do not need to pass this ``v`` prefix to the
:ref:`libjson_version` field and specify the real release version. In other :ref:`libjson_version` field).
case, users will receive updates for library with each new commit to
:ref:`libjson_repository`. :Case 2:
:ref:`libjson_version` and :ref:`libjson_repository` fields are defined
and :ref:`libjson_repository` does not contain tag/release with value of
:ref:`libjson_version`.
|PIOAPICR| will use the latest source code from :ref:`libjson_repository`
and link it with specified :ref:`libjson_version`. If :ref:`libjson_repository`
``branch`` is not specified, then default branch will be used.
Also, if you push new commits to :ref:`libjson_repository`
and do not update :ref:`libjson_version` field, the library will not be
updated until you change the :ref:`libjson_version`.
:Case 3:
:ref:`libjson_version` field is not defined and :ref:`libjson_repository`
field is defined.
|PIOAPICR| will use the
`CVS <http://en.wikipedia.org/wiki/Concurrent_Versions_System>`_ revision from
the latest commit as "current version". For example, ``13`` (*SVN*) or first
10 chars of *SHA* digest ``e4564b7da4`` (*Git*). If :ref:`libjson_repository`
``branch`` is not specified, then default branch will be used.
We recommend to use :ref:`libjson_version` field and specify the real release
version and make appropriate target in the :ref:`libjson_repository`. In other
case, users will receive updates for library with each new commit to
:ref:`libjson_repository`.
.. note:: .. note::
|PIOAPICR| updates library only if: |PIOAPICR| updates library only if:
@ -201,6 +231,11 @@ Example:
It is the *HTTP URL* to the archived source code of library. It should end It is the *HTTP URL* to the archived source code of library. It should end
with the type of archive (``.zip`` or ``.tar.gz``). with the type of archive (``.zip`` or ``.tar.gz``).
.. note::
:ref:`libjson_downloadurl` has higher priority than
:ref:`libjson_repository`.
Example with fixed release/tag on GitHub: Example with fixed release/tag on GitHub:
.. code-block:: javascript .. code-block:: javascript
@ -372,6 +407,9 @@ A list of example patterns. This field is predefined with default value:
.. code-block:: javascript .. code-block:: javascript
"examples": [ "examples": [
"[Ee]xamples/*/*.c",
"[Ee]xamples/*/*.cpp",
"[Ee]xamples/*/*.h",
"[Ee]xamples/*/*.ino", "[Ee]xamples/*/*.ino",
"[Ee]xamples/*/*.pde" "[Ee]xamples/*/*.pde"
] ]

View File

@ -34,6 +34,9 @@ Packages
* - ``ldscripts`` * - ``ldscripts``
- `Linker Scripts <https://sourceware.org/binutils/docs/ld/Scripts.html>`_ - `Linker Scripts <https://sourceware.org/binutils/docs/ld/Scripts.html>`_
* - ``tool-openocd``
- `OpenOCD <http://openocd.org>`_
* - ``toolchain-gccarmnoneeabi`` * - ``toolchain-gccarmnoneeabi``
- `gcc-arm-embedded <https://launchpad.net/gcc-arm-embedded>`_, `GDB <http://www.gnu.org/software/gdb/>`_ - `gcc-arm-embedded <https://launchpad.net/gcc-arm-embedded>`_, `GDB <http://www.gnu.org/software/gdb/>`_
@ -84,18 +87,32 @@ Arduino
* - ``due`` * - ``due``
- `Arduino Due (Programming Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_ - `Arduino Due (Programming Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_
- AT91SAM3X8E - SAM3X8E
- 84 MHz - 84 MHz
- 512 Kb - 512 Kb
- 32 Kb - 32 Kb
* - ``dueUSB`` * - ``dueUSB``
- `Arduino Due (USB Native Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_ - `Arduino Due (USB Native Port) <http://arduino.cc/en/Main/arduinoBoardDue>`_
- AT91SAM3X8E - SAM3X8E
- 84 MHz - 84 MHz
- 512 Kb - 512 Kb
- 32 Kb - 32 Kb
* - ``zero``
- `Arduino Zero (Programming Port) <https://www.arduino.cc/en/Main/ArduinoBoardZero>`_
- SAMD21G18A
- 48 MHz
- 256 Kb
- 32 Kb
* - ``zeroUSB``
- `Arduino Zero (USB Native Port) <https://www.arduino.cc/en/Main/ArduinoBoardZero>`_
- SAMD21G18A
- 48 MHz
- 256 Kb
- 32 Kb
Atmel Atmel
~~~~~ ~~~~~

View File

@ -119,6 +119,9 @@ Packages
* - ``tool-mspdebug`` * - ``tool-mspdebug``
- `MSPDebug <http://mspdebug.sourceforge.net/>`_ - `MSPDebug <http://mspdebug.sourceforge.net/>`_
* - ``tool-openocd``
- `OpenOCD <http://openocd.org>`_
* - ``tool-rfdloader`` * - ``tool-rfdloader``
- `rfdloader <https://github.com/RFduino/RFduino>`_ - `rfdloader <https://github.com/RFduino/RFduino>`_

View File

@ -163,7 +163,7 @@ NodeMCU
- RAM - RAM
* - ``nodemcu`` * - ``nodemcu``
- `NodeMCU 0.9 & 1.0 <http://www.nodemcu.com/>`_ - `NodeMCU 0.9 / 1.0 <http://www.nodemcu.com/>`_
- ESP8266 - ESP8266
- 80 MHz - 80 MHz
- 4096 Kb - 4096 Kb

View File

@ -23,6 +23,19 @@ from :ref:`projectconf`
upload_speed = 9600 upload_speed = 9600
Custom Reset Method
-------------------
See :ref:`projectconf_upload_resetmethod` option from :ref:`projectconf`
.. code-block:: ini
[env:esp12e]
platform = espressif
framework = arduino
board = esp12e
upload_resetmethod = ck
.. _platform_espressif_customflash: .. _platform_espressif_customflash:
Custom Flash Size Custom Flash Size
@ -96,7 +109,6 @@ There are 2 options:
.. code-block:: ini .. code-block:: ini
[env:myenv] [env:myenv]
...
upload_port = IP_ADDRESS_HERE or mDNS_NAME.local upload_port = IP_ADDRESS_HERE or mDNS_NAME.local
For example, For example,
@ -164,6 +176,7 @@ Demo
Articles Articles
-------- --------
* Jan 16, 2016 - **Dani Eichhorn** - `ESP8266 Arduino IDE Alternative: PlatformIO <http://blog.squix.ch/2016/01/esp8266-arduino-ide-alternative.html>`_
* Dec 22, 2015 - **Jan Penninkhof** - `Over-the-Air ESP8266 programming using PlatformIO <http://www.penninkhof.com/2015/12/1610-over-the-air-esp8266-programming-using-platformio/>`_ * Dec 22, 2015 - **Jan Penninkhof** - `Over-the-Air ESP8266 programming using PlatformIO <http://www.penninkhof.com/2015/12/1610-over-the-air-esp8266-programming-using-platformio/>`_
* Dec 01, 2015 - **Tateno Yuichi** - `ESP8266 を CUI で開発する (Develop a ESP8266 in CUI, Japanese) <http://jaywiggins.com/platformio/arduino/avr/es8266/2015/09/30/platformio-investigation/>`_ * Dec 01, 2015 - **Tateno Yuichi** - `ESP8266 を CUI で開発する (Develop a ESP8266 in CUI, Japanese) <http://jaywiggins.com/platformio/arduino/avr/es8266/2015/09/30/platformio-investigation/>`_

View File

@ -113,7 +113,7 @@ Teensy
- 16 Kb - 16 Kb
* - ``teensy31`` * - ``teensy31``
- `Teensy 3.1 <https://www.pjrc.com/store/teensy31.html>`_ - `Teensy 3.1 / 3.2 <https://www.pjrc.com/store/teensy31.html>`_
- MK20DX256 - MK20DX256
- 72 MHz - 72 MHz
- 256 Kb - 256 Kb

View File

@ -25,8 +25,8 @@ The sections and their allowable values are described below.
.. contents:: .. contents::
[platformio] Section ``[platformio]``
------------ ------------------------
A ``platformio`` section is used for overriding default configuration options A ``platformio`` section is used for overriding default configuration options
@ -130,9 +130,11 @@ project.
This option can be overridden by global environment variable This option can be overridden by global environment variable
:envvar:`PLATFORMIO_DATA_DIR`. :envvar:`PLATFORMIO_DATA_DIR`.
[env:NAME]
---------- ----------
Section ``[env:NAME]``
----------------------
A section with ``env:`` prefix is used to define virtual environment with A section with ``env:`` prefix is used to define virtual environment with
specific options that will be processed with :ref:`cmd_run` command. You can specific options that will be processed with :ref:`cmd_run` command. You can
define unlimited numbers of environments. define unlimited numbers of environments.
@ -145,8 +147,8 @@ Each environment must have unique ``NAME``. The valid chars for ``NAME`` are
For example, ``[env:hello_world]``. For example, ``[env:hello_world]``.
Options General options
~~~~~~~ ~~~~~~~~~~~~~~~
.. _projectconf_env_platform: .. _projectconf_env_platform:
@ -165,7 +167,6 @@ Options
The multiple frameworks are allowed, split them with comma ``,`` separator. The multiple frameworks are allowed, split them with comma ``,`` separator.
.. _projectconf_env_board: .. _projectconf_env_board:
``board`` ``board``
@ -180,6 +181,9 @@ You can find the ``board`` type in *Boards* section of each :ref:`platforms` or
using `PlatformIO Embedded Boards Explorer <http://platformio.org/#!/boards>`_. using `PlatformIO Embedded Boards Explorer <http://platformio.org/#!/boards>`_.
Board options
~~~~~~~~~~~~~
``board_mcu`` ``board_mcu``
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
@ -201,43 +205,12 @@ format of this option is ``C-like long integer`` value with ``L`` suffix. The
1 Hertz is equal to ``1L``, then 16 Mhz (Mega Hertz) is equal to ``16000000L``. 1 Hertz is equal to ``1L``, then 16 Mhz (Mega Hertz) is equal to ``16000000L``.
The full list of ``board_f_cpu`` for the popular embedded platforms you can The full list of ``board_f_cpu`` for the popular embedded platforms you can
find in *Boards* section of :ref:`platforms`. See "Frequency" column. find in *Boards* section of :ref:`platforms`. See "Frequency" column. You can
overclock a board by specifying a ``board_f_cpu`` value other than the default.
``upload_port`` Building options
^^^^^^^^^^^^^^^ ~~~~~~~~~~~~~~~~
This option is used by "uploader" tool when sending firmware to board via
``upload_port``. For example,
* ``/dev/ttyUSB0`` - Unix-based OS
* ``COM3`` - Windows OS
* ``192.168.0.13`` - IP address when using OTA
If ``upload_port`` isn't specified, then *PlatformIO* will try to detect it
automatically.
To print all available serial ports use :ref:`cmd_serialports` command.
``upload_protocol``
^^^^^^^^^^^^^^^^^^^
A protocol that "uploader" tool uses to talk to the board.
.. _projectconf_upload_speed:
``upload_speed``
^^^^^^^^^^^^^^^^
A connection speed (`baud rate <http://en.wikipedia.org/wiki/Baud>`_)
which "uploader" tool uses when sending firmware to board.
``upload_flags``
^^^^^^^^^^^^^^^^
Extra flags for uploader. Will be added to the end of uploader command. If you
need to override uploader command or base flags please use :ref:`projectconf_extra_script`.
.. _projectconf_build_flags: .. _projectconf_build_flags:
@ -362,12 +335,129 @@ be applied in theirs order.
`GLOB Patterns <http://en.wikipedia.org/wiki/Glob_(programming)>`_ are allowed. `GLOB Patterns <http://en.wikipedia.org/wiki/Glob_(programming)>`_ are allowed.
By default, ``src_filter`` is predefined to By default, ``src_filter`` is predefined to
``+<*> -<.git/> -<svn/> -<examples/>``, which means "includes ALL files, then ``+<*> -<.git/> -<svn/> -<example*/>``, which means "includes ALL files, then
exclude ``.git`` and ``svn`` repository folders and exclude ``examples`` folder. exclude ``.git`` and ``svn`` repository folders and exclude ``examples`` folder.
This option can be set by global environment variable This option can be set by global environment variable
:envvar:`PLATFORMIO_SRC_FILTER`. :envvar:`PLATFORMIO_SRC_FILTER`.
.. _projectconf_extra_script:
``extra_script``
^^^^^^^^^^^^^^^^
Allows to launch extra script using `SCons <http://www.scons.org>`_ software
construction tool. For more details please follow to "Construction Environments"
section of
`SCons documentation <http://www.scons.org/doc/production/HTML/scons-user.html#chap-environments>`_.
This option can be set by global environment variable
:envvar:`PLATFORMIO_EXTRA_SCRIPT`.
Example, specify own upload command for :ref:`platform_atmelavr`:
``platformio.ini``:
.. code-block:: ini
[env:env_with_specific_extra_script]
platform = atmelavr
extra_script = /path/to/extra_script.py
custom_option = hello
``extra_script.py``:
.. code-block:: python
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
env.Replace(UPLOADHEXCMD='"$UPLOADER" ${ARGUMENTS.get("custom_option")} --uploader --flags')
# uncomment line below to see environment variables
# print env.Dump()
# print ARGUMENTS
* see built-in examples of `PlatformIO build scripts <https://github.com/platformio/platformio/tree/develop/platformio/builder/scripts>`_.
* take a look at the multiple snippets/answers for the user questions:
- `#462 Split C/C++ build flags <https://github.com/platformio/platformio/issues/462#issuecomment-172667342>`_
- `#365 Extra configuration for ESP8266 uploader <https://github.com/platformio/platformio/issues/365#issuecomment-163695011>`_
- `#351 Specific reset method for ESP8266 <https://github.com/platformio/platformio/issues/351#issuecomment-161789165>`_
- `#247 Specific options for avrdude <https://github.com/platformio/platformio/issues/247#issuecomment-118169728>`_.
``targets``
^^^^^^^^^^^
A list with targets which will be processed by :ref:`cmd_run` command by
default. You can enter more than one target separated with "space".
The list with available targets is located in :option:`platformio run --target`.
**Tip!** You can use these targets like an option to
:option:`platformio run --target` command. For example:
.. code-block:: bash
# clean project
platformio run -t clean
# dump curent build environment
platformio run --target envdump
When no targets are defined, *PlatformIO* will build only sources by default.
Uploading options
~~~~~~~~~~~~~~~~~
``upload_port``
^^^^^^^^^^^^^^^
This option is used by "uploader" tool when sending firmware to board via
``upload_port``. For example,
* ``/dev/ttyUSB0`` - Unix-based OS
* ``COM3`` - Windows OS
* ``192.168.0.13`` - IP address when using OTA
If ``upload_port`` isn't specified, then *PlatformIO* will try to detect it
automatically.
To print all available serial ports use :ref:`cmd_serialports` command.
``upload_protocol``
^^^^^^^^^^^^^^^^^^^
A protocol that "uploader" tool uses to talk to the board.
.. _projectconf_upload_speed:
``upload_speed``
^^^^^^^^^^^^^^^^
A connection speed (`baud rate <http://en.wikipedia.org/wiki/Baud>`_)
which "uploader" tool uses when sending firmware to board.
``upload_flags``
^^^^^^^^^^^^^^^^
Extra flags for uploader. Will be added to the end of uploader command. If you
need to override uploader command or base flags please use :ref:`projectconf_extra_script`.
.. _projectconf_upload_resetmethod:
``upload_resetmethod``
^^^^^^^^^^^^^^^^^^^^^^
Specify reset method for "uploader" tool. This option isn't available for all
development platforms. The only :ref:`platform_espressif` supports it.
Library options
~~~~~~~~~~~~~~~
``lib_install`` ``lib_install``
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
@ -428,72 +518,7 @@ Example:
[env:libs_with_enabled_ldf_cyclic] [env:libs_with_enabled_ldf_cyclic]
lib_dfcyclic = True lib_dfcyclic = True
.. _projectconf_extra_script: -----------
``extra_script``
^^^^^^^^^^^^^^^^
Allows to launch extra script using `SCons <http://www.scons.org>`_ software
construction tool. For more details please follow to "Construction Environments"
section of
`SCons documentation <http://www.scons.org/doc/production/HTML/scons-user.html#chap-environments>`_.
This option can be set by global environment variable
:envvar:`PLATFORMIO_EXTRA_SCRIPT`.
Example, specify own upload command for :ref:`platform_atmelavr`:
``platformio.ini``:
.. code-block:: ini
[env:env_with_specific_extra_script]
platform = atmelavr
extra_script = /path/to/extra_script.py
custom_option = hello
``extra_script.py``:
.. code-block:: python
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
env.Replace(UPLOADHEXCMD='"$UPLOADER" ${ARGUMENTS.get("custom_option")} --uploader --flags')
# uncomment line below to see environment variables
# print env.Dump()
# print ARGUMENTS
* see built-in examples of `PlatformIO build scripts <https://github.com/platformio/platformio/tree/develop/platformio/builder/scripts>`_.
* take a look at the multiple snippets/answers for the user questions:
`#365 <https://github.com/platformio/platformio/issues/365#issuecomment-163695011>`_,
`#351 <https://github.com/platformio/platformio/issues/351#issuecomment-161789165>`_,
`#236 <https://github.com/platformio/platformio/issues/236#issuecomment-112038284>`_,
`#247 <https://github.com/platformio/platformio/issues/247#issuecomment-118169728>`_
``targets``
^^^^^^^^^^^
A list with targets which will be processed by :ref:`cmd_run` command by
default. You can enter more than one target separated with "space".
The list with available targets is located in :option:`platformio run --target`.
**Tip!** You can use these targets like an option to
:option:`platformio run --target` command. For example:
.. code-block:: bash
# clean project
platformio run -t clean
# dump curent build environment
platformio run --target envdump
When no targets are defined, *PlatformIO* will build only sources by default.
.. _projectconf_examples: .. _projectconf_examples:
@ -551,8 +576,8 @@ Examples
upload_protocol = usbasp upload_protocol = usbasp
upload_flags = -Pusb -B5 upload_flags = -Pusb -B5
Then upload firmware using :option:`platformio run --target program`. To use Then upload firmware using target ``program`` for :option:`platformio run --target`.
other programmers see :ref:`atmelavr_upload_via_programmer`. command. To use other programmers see :ref:`atmelavr_upload_via_programmer`.
4. :ref:`platform_ststm32`: Upload firmware using GDB script ``upload.gdb``, 4. :ref:`platform_ststm32`: Upload firmware using GDB script ``upload.gdb``,

View File

@ -148,7 +148,7 @@ Examples
check_libraries_interval 7 Check for the library updates interval (days) check_libraries_interval 7 Check for the library updates interval (days)
check_platformio_interval 3 Check for the new PlatformIO interval (days) check_platformio_interval 3 Check for the new PlatformIO interval (days)
check_platforms_interval 7 Check for the platform updates interval (days) check_platforms_interval 7 Check for the platform updates interval (days)
enable_prompts Yes Can PlatformIO communicate with you via prompts: propose to install platforms which aren't installed yet, paginate over library search results and etc.)? ATTENTION!!! If you call PlatformIO like subprocess, please disable prompts to avoid blocking (Yes/No) enable_prompts Yes Can PlatformIO communicate with you via prompts ...
enable_telemetry Yes Telemetry service (Yes/No) enable_telemetry Yes Telemetry service (Yes/No)

View File

@ -36,7 +36,7 @@ Examples
.. code-block:: bash .. code-block:: bash
$ platformio upgrade $ platformio upgrade
You're up-to-date! You are up-to-date!
PlatformIO x.x.x is currently the newest version available. PlatformIO x.x.x is currently the newest version available.
# If you have problem with permissions try: # If you have problem with permissions try:

View File

@ -22,6 +22,9 @@ Usage
.. code-block:: bash .. code-block:: bash
platformio [OPTIONS] COMMAND platformio [OPTIONS] COMMAND
pio [OPTIONS] COMMAND
# "pio" is the alias of "platformio" command
Options Options
------- -------

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -21,3 +21,4 @@
platform = atmelavr platform = atmelavr
framework = arduino framework = arduino
board = engduinov3 board = engduinov3
lib_install = 574

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -1 +1,3 @@
.pioenvs .pioenvs
.clang_complete
.gcc-flags.json

View File

@ -5,7 +5,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -14,7 +14,7 @@
import sys import sys
VERSION = (2, 7, 1) VERSION = (2, 8, 0)
__version__ = ".".join([str(s) for s in VERSION]) __version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio" __title__ = "platformio"

View File

@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from os import listdir from os import getenv, listdir
from os.path import join from os.path import join
from platform import system from platform import system
from sys import exit as sys_exit from sys import exit as sys_exit
@ -71,6 +71,8 @@ class PlatformioCLI(click.MultiCommand): # pylint: disable=R0904
@click.option("--caller", "-c", help="Caller ID (service).") @click.option("--caller", "-c", help="Caller ID (service).")
@click.pass_context @click.pass_context
def cli(ctx, force, caller): def cli(ctx, force, caller):
if not caller and getenv("PLATFORMIO_CALLER"):
caller = getenv("PLATFORMIO_CALLER")
maintenance.on_platformio_start(ctx, force, caller) maintenance.on_platformio_start(ctx, force, caller)
@ -94,6 +96,14 @@ def main():
"Invalid installation of Python `requests` package`. See " "Invalid installation of Python `requests` package`. See "
"< https://github.com/platformio/platformio/issues/252 >") "< https://github.com/platformio/platformio/issues/252 >")
# handle PLATFORMIO_FORCE_COLOR
if str(getenv("PLATFORMIO_FORCE_COLOR", "")).lower() == "true":
try:
# pylint: disable=protected-access
click._compat.isatty = lambda stream: True
except: # pylint: disable=bare-except
pass
cli(None, None, None) cli(None, None, None)
except Exception as e: # pylint: disable=W0703 except Exception as e: # pylint: disable=W0703
if not isinstance(e, exception.ReturnErrorCode): if not isinstance(e, exception.ReturnErrorCode):

View File

@ -183,3 +183,7 @@ def get_session_var(name, default=None):
def set_session_var(name, value): def set_session_var(name, value):
assert name in SESSION_VARS assert name in SESSION_VARS
SESSION_VARS[name] = value SESSION_VARS[name] = value
def is_disabled_progressbar():
return is_ci() or getenv("PLATFORMIO_DISABLE_PROGRESSBAR") == "true"

View File

@ -50,7 +50,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "nodemcu" "variant": "nodemcu"
}, },
@ -73,7 +73,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "nodemcu" "variant": "nodemcu"
}, },
@ -96,7 +96,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "adafruit" "variant": "adafruit"
}, },
@ -165,7 +165,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP210", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP210",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "generic" "variant": "generic"
}, },
@ -188,7 +188,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "d1" "variant": "d1"
}, },
@ -211,7 +211,7 @@
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12", "extra_flags": "-DESP8266 -DARDUINO_ARCH_ESP8266 -DARDUINO_ESP8266_ESP12",
"f_cpu": "80000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.4m.ld", "ldscript": "esp8266.flash.4m1m.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "d1_mini" "variant": "d1_mini"
}, },

View File

@ -89,7 +89,7 @@
"name": "SeeedStudio Seeeduino-Arch-Pro", "name": "SeeedStudio Seeeduino-Arch-Pro",
"platform": "nxplpc", "platform": "nxplpc",
"upload": { "upload": {
"maximum_ram_size": 32768, "maximum_ram_size": 65536,
"maximum_size": 524288 "maximum_size": 524288
}, },
"url": "https://developer.mbed.org/platforms/Seeeduino-Arch-Pro/", "url": "https://developer.mbed.org/platforms/Seeeduino-Arch-Pro/",

View File

@ -273,14 +273,14 @@
"nucleo_f401re": { "nucleo_f401re": {
"build": { "build": {
"core": "stm32", "core": "stm32",
"extra_flags": "-DSTM32F4 -DSTM32F401xE", "extra_flags": "-DSTM32F4 -DSTM32F401xE -DSTM32F40_41xxx",
"f_cpu": "84000000L", "f_cpu": "84000000L",
"ldscript": "stm32f401xe.ld", "ldscript": "stm32f401xe.ld",
"cpu": "cortex-m4", "cpu": "cortex-m4",
"mcu": "stm32f401ret6", "mcu": "stm32f401ret6",
"variant": "stm32f401xe" "variant": "stm32f401xe"
}, },
"frameworks": ["cmsis", "mbed"], "frameworks": ["mbed", "cmsis", "spl"],
"name": "ST Nucleo F401RE", "name": "ST Nucleo F401RE",
"platform": "ststm32", "platform": "ststm32",
"upload": { "upload": {

View File

@ -56,7 +56,8 @@ commonvars.AddVariables(
("UPLOAD_PORT",), ("UPLOAD_PORT",),
("UPLOAD_PROTOCOL",), ("UPLOAD_PROTOCOL",),
("UPLOAD_SPEED",), ("UPLOAD_SPEED",),
("UPLOAD_FLAGS",) ("UPLOAD_FLAGS",),
("UPLOAD_RESETMETHOD",)
) )
DefaultEnvironment( DefaultEnvironment(
@ -103,16 +104,16 @@ if "BOARD" in env:
except UnknownBoard as e: except UnknownBoard as e:
env.Exit("Error: %s" % str(e)) env.Exit("Error: %s" % str(e))
if "BOARD_MCU" not in env: for k in commonvars.keys():
env.Replace(BOARD_MCU="${BOARD_OPTIONS['build']['mcu']}") if (k in env or
if "BOARD_F_CPU" not in env: not any([k.startswith("BOARD_"), k.startswith("UPLOAD_")])):
env.Replace(BOARD_F_CPU="${BOARD_OPTIONS['build']['f_cpu']}") continue
if "UPLOAD_PROTOCOL" not in env: _opt, _val = k.lower().split("_", 1)
env.Replace( if _opt == "board":
UPLOAD_PROTOCOL="${BOARD_OPTIONS['upload'].get('protocol', None)}") _opt = "build"
if "UPLOAD_SPEED" not in env: if _val in env['BOARD_OPTIONS'][_opt]:
env.Replace( env.Replace(**{k: "${BOARD_OPTIONS['%s']['%s']}" % (_opt, _val)})
UPLOAD_SPEED="${BOARD_OPTIONS['upload'].get('speed', None)}")
if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}): if "ldscript" in env.get("BOARD_OPTIONS", {}).get("build", {}):
env.Replace( env.Replace(
LDSCRIPT_PATH="${BOARD_OPTIONS['build']['ldscript']}" LDSCRIPT_PATH="${BOARD_OPTIONS['build']['ldscript']}"

View File

@ -42,10 +42,17 @@ def _get_flash_size(env):
else "%dM" % (board_max_size / 1048576)) else "%dM" % (board_max_size / 1048576))
def _get_board_f_cpu(env):
f_cpu = env.subst("$BOARD_F_CPU")
f_cpu = str(f_cpu).replace("L", "")
return int(int(f_cpu) / 1000000)
env = DefaultEnvironment() env = DefaultEnvironment()
env.Replace( env.Replace(
__get_flash_size=_get_flash_size, __get_flash_size=_get_flash_size,
__get_board_f_cpu=_get_board_f_cpu,
AR="xtensa-lx106-elf-ar", AR="xtensa-lx106-elf-ar",
AS="xtensa-lx106-elf-as", AS="xtensa-lx106-elf-as",
@ -108,7 +115,7 @@ env.Replace(
UPLOADERFLAGS=[ UPLOADERFLAGS=[
"-vv", "-vv",
"-cd", "${BOARD_OPTIONS['upload']['resetmethod']}", "-cd", "$UPLOAD_RESETMETHOD",
"-cb", "$UPLOAD_SPEED", "-cb", "$UPLOAD_SPEED",
"-cp", "$UPLOAD_PORT" "-cp", "$UPLOAD_PORT"
], ],
@ -143,7 +150,7 @@ env.Append(
"eboot", "eboot.elf"), "eboot", "eboot.elf"),
"-bo", "$TARGET", "-bo", "$TARGET",
"-bm", "dio", "-bm", "dio",
"-bf", "${BOARD_OPTIONS['build']['f_cpu'][:2]}", "-bf", "${__get_board_f_cpu(__env__)}",
"-bz", "${__get_flash_size(__env__)}", "-bz", "${__get_flash_size(__env__)}",
"-bs", ".text", "-bs", ".text",
"-bp", "4096", "-bp", "4096",

View File

@ -56,7 +56,6 @@ def find_ldscript(src_dir):
elif isfile(join(src_dir, BOARD_BUILDOPTS['ldscript'])): elif isfile(join(src_dir, BOARD_BUILDOPTS['ldscript'])):
ldscript = join(src_dir, BOARD_BUILDOPTS['ldscript']) ldscript = join(src_dir, BOARD_BUILDOPTS['ldscript'])
assert isfile(ldscript)
return ldscript return ldscript
@ -169,7 +168,8 @@ if BOARD_BUILDOPTS.get("core") == "stm32":
root_dir = join(root_dir, BOARD_BUILDOPTS.get("variant")[5:7]) root_dir = join(root_dir, BOARD_BUILDOPTS.get("variant")[5:7])
ldscript_path = find_ldscript(root_dir) ldscript_path = find_ldscript(root_dir)
merge_ld_scripts(ldscript_path) if ldscript_path:
merge_ld_scripts(ldscript_path)
generate_nvic_files() generate_nvic_files()
# override ldscript by libopencm3 # override ldscript by libopencm3

View File

@ -195,20 +195,6 @@ def get_build_flags(data):
return flags return flags
def _mbed_whole_archive_hook(flags):
if (not isinstance(flags, list) or
env.get("BOARD_OPTIONS", {}).get("platform") != "ststm32"):
return flags
for pos, flag in enumerate(flags[:]):
if isinstance(flag, basestring):
continue
flags.insert(pos, "-Wl,-whole-archive")
flags.insert(pos + 2, "-Wl,-no-whole-archive")
return flags
board_type = env.subst("$BOARD") board_type = env.subst("$BOARD")
variant = MBED_VARIANTS[ variant = MBED_VARIANTS[
board_type] if board_type in MBED_VARIANTS else board_type.upper() board_type] if board_type in MBED_VARIANTS else board_type.upper()
@ -219,8 +205,6 @@ build_flags = get_build_flags(eixdata)
variant_dir = join("$PLATFORMFW_DIR", "variant", variant) variant_dir = join("$PLATFORMFW_DIR", "variant", variant)
env.Replace( env.Replace(
_mbed_whole_archive_hook=_mbed_whole_archive_hook,
_LIBFLAGS="${_mbed_whole_archive_hook(%s)}" % env.get("_LIBFLAGS")[2:-1],
CPPFLAGS=build_flags.get("CPPFLAGS", []), CPPFLAGS=build_flags.get("CPPFLAGS", []),
CFLAGS=build_flags.get("CFLAGS", []), CFLAGS=build_flags.get("CFLAGS", []),
CXXFLAGS=build_flags.get("CXXFLAGS", []), CXXFLAGS=build_flags.get("CXXFLAGS", []),
@ -267,7 +251,7 @@ libs.append(env.Library(
for f in eixdata.get("OBJFILES", [])] for f in eixdata.get("OBJFILES", [])]
)) ))
env.Append(LIBS=libs) env.Prepend(LIBS=libs)
for _libname, _libdata in get_used_mbedlibs().iteritems(): for _libname, _libdata in get_used_mbedlibs().iteritems():
for _libar in _libdata['ar']: for _libar in _libdata['ar']:

View File

@ -23,7 +23,7 @@ directly with the registers.
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743?sc=stm32embeddedsoftware http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743?sc=stm32embeddedsoftware
""" """
from os.path import join from os.path import isfile, join
from SCons.Script import DefaultEnvironment from SCons.Script import DefaultEnvironment
@ -70,6 +70,23 @@ envsafe.Append(
# Target: Build SPL Library # Target: Build SPL Library
# #
# use mbed ldscript with bootloader section
ldscript = env.get("BOARD_OPTIONS", {}).get("build", {}).get("ldscript")
if not isfile(join(env.subst("$PIOPACKAGES_DIR"), "ldscripts", ldscript)):
if "mbed" in env.get("BOARD_OPTIONS", {}).get("frameworks", {}):
env.Append(
LINKFLAGS=[
'-Wl,-T"%s"' %
join(
"$PIOPACKAGES_DIR", "framework-mbed", "variant",
env.subst("$BOARD").upper(), "mbed",
"TARGET_%s" % env.subst(
"$BOARD").upper(), "TOOLCHAIN_GCC_ARM",
"%s.ld" % ldscript.upper()[:-3]
)
]
)
extra_flags = env.get("BOARD_OPTIONS", {}).get("build", {}).get("extra_flags") extra_flags = env.get("BOARD_OPTIONS", {}).get("build", {}).get("extra_flags")
src_filter_patterns = ["+<*>"] src_filter_patterns = ["+<*>"]
if "STM32F40_41xxx" in extra_flags: if "STM32F40_41xxx" in extra_flags:

View File

@ -17,8 +17,8 @@ from __future__ import absolute_import
import atexit import atexit
import re import re
from glob import glob from glob import glob
from os import environ, remove from os import environ, listdir, remove
from os.path import basename, isfile, join from os.path import basename, isdir, isfile, join
from platformio.util import exec_command, where_is_program from platformio.util import exec_command, where_is_program
@ -114,7 +114,10 @@ class InoToCPPConverter(object):
def ConvertInoToCpp(env): def ConvertInoToCpp(env):
def delete_tmpcpp_file(file_): def delete_tmpcpp_file(file_):
remove(file_) try:
remove(file_)
except WindowsError: # pylint: disable=undefined-variable
pass
ino_nodes = (env.Glob(join("$PROJECTSRC_DIR", "*.ino")) + ino_nodes = (env.Glob(join("$PROJECTSRC_DIR", "*.ino")) +
env.Glob(join("$PROJECTSRC_DIR", "*.pde"))) env.Glob(join("$PROJECTSRC_DIR", "*.pde")))
@ -133,46 +136,88 @@ def ConvertInoToCpp(env):
def DumpIDEData(env): def DumpIDEData(env):
data = {
"defines": [], BOARD_CORE = env.get("BOARD_OPTIONS", {}).get("build", {}).get("core")
"includes": [],
def get_includes():
includes = []
# includes from used framework and libs
for item in env.get("VARIANT_DIRS", []):
if "$BUILDSRC_DIR" in item[0]:
continue
includes.append(env.subst(item[1]))
# custom includes
for item in env.get("CPPPATH", []):
if item.startswith("$BUILD_DIR"):
continue
includes.append(env.subst(item))
# installed libs
for d in env.get("LIBSOURCE_DIRS", []):
lsd_dir = env.subst(d)
_append_lib_includes(lsd_dir, includes)
# includes from toolchain
toolchain_dir = env.subst(
join("$PIOPACKAGES_DIR", "$PIOPACKAGE_TOOLCHAIN"))
toolchain_incglobs = [
join(toolchain_dir, "*", "include*"),
join(toolchain_dir, "lib", "gcc", "*", "*", "include*")
]
for g in toolchain_incglobs:
includes.extend(glob(g))
return includes
def _append_lib_includes(libs_dir, includes):
if not isdir(libs_dir):
return
for name in env.get("LIB_USE", []) + sorted(listdir(libs_dir)):
if not isdir(join(libs_dir, name)):
continue
# ignore user's specified libs
if name in env.get("LIB_IGNORE", []):
continue
if name == "__cores__":
if isdir(join(libs_dir, name, BOARD_CORE)):
_append_lib_includes(
join(libs_dir, name, BOARD_CORE), includes)
return
include = (
join(libs_dir, name, "src")
if isdir(join(libs_dir, name, "src"))
else join(libs_dir, name)
)
if include not in includes:
includes.append(include)
def get_defines():
defines = []
# global symbols
for item in env.get("CPPDEFINES", []):
if isinstance(item, list):
item = "=".join(item)
defines.append(env.subst(item).replace('\\"', '"'))
# special symbol for Atmel AVR MCU
board = env.get("BOARD_OPTIONS", {})
if board and board['platform'] == "atmelavr":
defines.append(
"__AVR_%s__" % board['build']['mcu'].upper()
.replace("ATMEGA", "ATmega")
.replace("ATTINY", "ATtiny")
)
return defines
return {
"defines": get_defines(),
"includes": get_includes(),
"cxx_path": where_is_program( "cxx_path": where_is_program(
env.subst("$CXX"), env.subst("${ENV['PATH']}")) env.subst("$CXX"), env.subst("${ENV['PATH']}"))
} }
# includes from framework and libs
for item in env.get("VARIANT_DIRS", []):
if "$BUILDSRC_DIR" in item[0]:
continue
data['includes'].append(env.subst(item[1]))
# includes from toolchain
toolchain_dir = env.subst(
join("$PIOPACKAGES_DIR", "$PIOPACKAGE_TOOLCHAIN"))
toolchain_incglobs = [
join(toolchain_dir, "*", "include*"),
join(toolchain_dir, "lib", "gcc", "*", "*", "include*")
]
for g in toolchain_incglobs:
data['includes'].extend(glob(g))
# global symbols
for item in env.get("CPPDEFINES", []):
if isinstance(item, list):
item = "=".join(item)
data['defines'].append(env.subst(item).replace('\\"', '"'))
# special symbol for Atmel AVR MCU
board = env.get("BOARD_OPTIONS", {})
if board and board['platform'] == "atmelavr":
data['defines'].append(
"__AVR_%s__" % board['build']['mcu'].upper()
.replace("ATMEGA", "ATmega")
.replace("ATTINY", "ATtiny")
)
return data
def GetCompilerType(env): def GetCompilerType(env):
try: try:

View File

@ -19,14 +19,16 @@ from glob import glob
from os import getenv, listdir, sep, walk from os import getenv, listdir, sep, walk
from os.path import basename, dirname, isdir, isfile, join, normpath, realpath from os.path import basename, dirname, isdir, isfile, join, normpath, realpath
from platformio.util import pioversion_to_intstr
from SCons.Script import COMMAND_LINE_TARGETS, DefaultEnvironment, SConscript from SCons.Script import COMMAND_LINE_TARGETS, DefaultEnvironment, SConscript
from SCons.Util import case_sensitive_suffixes from SCons.Util import case_sensitive_suffixes
from platformio.util import pioversion_to_intstr
SRC_BUILD_EXT = ["c", "cpp", "S", "spp", "SPP", "sx", "s", "asm", "ASM"] SRC_BUILD_EXT = ["c", "cpp", "S", "spp", "SPP", "sx", "s", "asm", "ASM"]
SRC_HEADER_EXT = ["h", "hpp"] SRC_HEADER_EXT = ["h", "hpp"]
SRC_DEFAULT_FILTER = " ".join([ SRC_DEFAULT_FILTER = " ".join([
"+<*>", "-<.git%s>" % sep, "-<svn%s>" % sep, "-<examples%s>" % sep "+<*>", "-<.git%s>" % sep, "-<svn%s>" % sep, "-<example*%s>" % sep,
"-<test*%s>" % sep
]) ])
@ -81,12 +83,18 @@ def BuildProgram(env):
LIBPATH=["$BUILD_DIR"] LIBPATH=["$BUILD_DIR"]
) )
sources = env.LookupSources(
"$BUILDSRC_DIR", "$PROJECTSRC_DIR", duplicate=False,
src_filter=getenv("PLATFORMIO_SRC_FILTER", env.get("SRC_FILTER")))
if not sources:
env.Exit(
"Error: Nothing to build. Please put your source code files "
"to '%s' folder" % env.subst("$PROJECTSRC_DIR"))
return env.Program( return env.Program(
join("$BUILD_DIR", env.subst("$PROGNAME")), join("$BUILD_DIR", env.subst("$PROGNAME")),
env.LookupSources( sources
"$BUILDSRC_DIR", "$PROJECTSRC_DIR", duplicate=False,
src_filter=getenv("PLATFORMIO_SRC_FILTER",
env.get("SRC_FILTER")))
) )

View File

@ -61,16 +61,16 @@ def cli(query, json_output): # pylint: disable=R0912
flash_size = "" flash_size = ""
if "maximum_size" in data.get("upload", None): if "maximum_size" in data.get("upload", None):
flash_size = int(data['upload']['maximum_size']) flash_size = int(data['upload']['maximum_size'])
flash_size = "%dKb" % (flash_size / 1024) flash_size = "%dkB" % (flash_size / 1024)
ram_size = "" ram_size = ""
if "maximum_ram_size" in data.get("upload", None): if "maximum_ram_size" in data.get("upload", None):
ram_size = int(data['upload']['maximum_ram_size']) ram_size = int(data['upload']['maximum_ram_size'])
if ram_size >= 1024: if ram_size >= 1024:
if ram_size % 1024: if ram_size % 1024:
ram_size = "%.1fKb" % (ram_size / 1024.0) ram_size = "%.1fkB" % (ram_size / 1024.0)
else: else:
ram_size = "%dKb" % (ram_size / 1024) ram_size = "%dkB" % (ram_size / 1024)
else: else:
ram_size = "%dB" % ram_size ram_size = "%dB" % ram_size

View File

@ -191,7 +191,7 @@ PlatformIO will compile them to static libraries and link to executable file.
The source code of each library should be placed in separate directory, like The source code of each library should be placed in separate directory, like
"lib/private_lib/[here are source files]". "lib/private_lib/[here are source files]".
For example, see how can be organised `Foo` and `Bar` libraries: For example, see how can be organized `Foo` and `Bar` libraries:
|--lib |--lib
| |--Bar | |--Bar

View File

@ -56,8 +56,13 @@ def cli(ctx, environment, target, upload_port, # pylint: disable=R0913,R0914
if not disable_auto_clean: if not disable_auto_clean:
try: try:
_clean_pioenvs_dir(util.get_pioenvs_dir()) _clean_pioenvs_dir(util.get_pioenvs_dir())
except Exception: except: # pylint: disable=bare-except
raise exception.CleanPioenvsDirError(util.get_pioenvs_dir()) click.secho(
"Can not remove temporary directory `%s`. Please remove "
"`.pioenvs` directory from the project manually to avoid "
"build issues" % util.get_pioenvs_dir(),
fg="yellow"
)
results = [] results = []
for section in config.sections(): for section in config.sections():

View File

@ -34,9 +34,17 @@ def cli():
click.secho("Please wait while upgrading PlatformIO ...", click.secho("Please wait while upgrading PlatformIO ...",
fg="yellow") fg="yellow")
to_develop = False
try:
from pkg_resources import parse_version
to_develop = parse_version(last) < parse_version(__version__)
except ImportError:
pass
cmds = ( cmds = (
[os.path.normpath(sys.executable), ["pip", "install", "--upgrade",
"-m", "pip", "install", "--upgrade", "platformio"], "https://github.com/platformio/platformio/archive/develop.zip"
if to_develop else "platformio"],
["platformio", "--version"] ["platformio", "--version"]
) )
@ -44,19 +52,21 @@ def cli():
r = None r = None
try: try:
for cmd in cmds: for cmd in cmds:
cmd = [os.path.normpath(sys.executable), "-m"] + cmd
r = None r = None
r = util.exec_command(cmd) r = util.exec_command(cmd)
# try pip with disabled cache # try pip with disabled cache
if r['returncode'] != 0 and cmd[0] != "platformio": if r['returncode'] != 0 and cmd[2] == "pip":
cmd.insert(3, "--no-cache-dir") cmd.insert(3, "--no-cache-dir")
r = util.exec_command(cmd) r = util.exec_command(cmd)
assert r['returncode'] == 0 assert r['returncode'] == 0
assert last in r['out'].strip() assert "version" in r['out']
actual_version = r['out'].strip().split("version", 1)[1].strip()
click.secho( click.secho(
"PlatformIO has been successfully upgraded to %s" % last, "PlatformIO has been successfully upgraded to %s" %
fg="green") actual_version, fg="green")
click.echo("Release notes: ", nl=False) click.echo("Release notes: ", nl=False)
click.secho("http://docs.platformio.org/en/latest/history.html", click.secho("http://docs.platformio.org/en/latest/history.html",
fg="cyan") fg="cyan")

View File

@ -20,7 +20,7 @@ from time import mktime
import click import click
import requests import requests
from platformio import util from platformio import app, util
from platformio.exception import (FDSHASumMismatch, FDSizeMismatch, from platformio.exception import (FDSHASumMismatch, FDSizeMismatch,
FDUnrecognizedStatusCode) FDUnrecognizedStatusCode)
@ -63,7 +63,7 @@ class FileDownloader(object):
f = open(self._destination, "wb") f = open(self._destination, "wb")
chunks = int(ceil(self.get_size() / float(self.CHUNK_SIZE))) chunks = int(ceil(self.get_size() / float(self.CHUNK_SIZE)))
if util.is_ci(): if app.is_disabled_progressbar():
click.echo("Downloading...") click.echo("Downloading...")
for _ in range(0, chunks): for _ in range(0, chunks):
f.write(next(itercontent)) f.write(next(itercontent))

View File

@ -129,12 +129,6 @@ class UnknownEnvNames(PlatformioException):
MESSAGE = "Unknown environment names '{0}'. Valid names are '{1}'" MESSAGE = "Unknown environment names '{0}'. Valid names are '{1}'"
class CleanPioenvsDirError(PlatformioException):
MESSAGE = "Can not remove temporary directory `{0}`. "\
"Please remove it manually"
class GetSerialPortsError(PlatformioException): class GetSerialPortsError(PlatformioException):
MESSAGE = "No implementation for your platform ('{0}') available" MESSAGE = "No implementation for your platform ('{0}') available"

View File

@ -15,12 +15,14 @@
import json import json
import os import os
import re import re
from os.path import abspath, basename, expanduser, isdir, join, relpath import sys
from os.path import (abspath, basename, expanduser, isdir, join, normpath,
relpath)
import bottle import bottle
import click import click # pylint: disable=wrong-import-order
from platformio import exception, util from platformio import app, exception, util
class ProjectGenerator(object): class ProjectGenerator(object):
@ -64,10 +66,12 @@ class ProjectGenerator(object):
envdata = self.get_project_env() envdata = self.get_project_env()
if "env_name" not in envdata: if "env_name" not in envdata:
return data return data
result = util.exec_command( cmd = [normpath(sys.executable), "-m", "platformio", "-f"]
["platformio", "-f", "run", "-t", "idedata", if app.get_session_var("caller_id"):
"-e", envdata['env_name'], "-d", self.project_dir] cmd.extend(["-c", app.get_session_var("caller_id")])
) cmd.extend(["run", "-t", "idedata", "-e", envdata['env_name']])
cmd.extend(["-d", self.project_dir])
result = util.exec_command(cmd)
if result['returncode'] != 0 or '"includes":' not in result['out']: if result['returncode'] != 0 or '"includes":' not in result['out']:
raise exception.PlatformioException( raise exception.PlatformioException(

View File

@ -0,0 +1,8 @@
{
"execPath": "{{ cxx_path.replace("\\", "/") }}",
"gccDefaultCFlags": "-Wall -Wno-cpp -fsyntax-only -D{{ ' -D'.join(defines) }}",
"gccDefaultCppFlags": "-Wall -Wno-cpp -fsyntax-only -D{{ ' -D'.join(defines) }}",
"gccErrorLimit": 15,
"gccIncludePaths": "{{ ','.join(includes).replace("\\", "/") }}",
"gccSuppressWarnings": false
}

View File

@ -1,2 +1,3 @@
.pioenvs .pioenvs
.clang_complete .clang_complete
.gcc-flags.json

View File

@ -14,7 +14,7 @@
import re import re
import struct import struct
from os import remove from os import getenv, remove
from os.path import isdir, isfile, join from os.path import isdir, isfile, join
from shutil import rmtree from shutil import rmtree
from time import time from time import time
@ -142,10 +142,17 @@ def after_upgrade(ctx):
(click.style("follow", fg="cyan"), (click.style("follow", fg="cyan"),
click.style("https://twitter.com/PlatformIO_Org", fg="cyan")) click.style("https://twitter.com/PlatformIO_Org", fg="cyan"))
) )
click.echo("- %s it on GitHub! > %s" % ( click.echo("- %s it on GitHub > %s" % (
click.style("star", fg="cyan"), click.style("star", fg="cyan"),
click.style("https://github.com/platformio/platformio", fg="cyan") click.style("https://github.com/platformio/platformio", fg="cyan")
)) ))
if not getenv("PLATFORMIO_IDE"):
click.echo("- %s PlatformIO IDE for IoT development > %s" % (
click.style("try", fg="cyan"),
click.style("http://platformio.org/", fg="cyan")
))
click.echo("*" * terminal_width) click.echo("*" * terminal_width)
click.echo("") click.echo("")

View File

@ -129,6 +129,9 @@ PLATFORM_PACKAGES = {
"tool-bossac": [ "tool-bossac": [
("BOSSA CLI", "https://sourceforge.net/projects/b-o-s-s-a/") ("BOSSA CLI", "https://sourceforge.net/projects/b-o-s-s-a/")
], ],
"tool-openocd": [
("OpenOCD", "http://openocd.org")
],
"tool-stlink": [ "tool-stlink": [
("ST-Link", "https://github.com/texane/stlink") ("ST-Link", "https://github.com/texane/stlink")
], ],

View File

@ -98,6 +98,8 @@ class MeasurementProtocol(TelemetryBase):
dpdata.append("Click/%s" % click.__version__) dpdata.append("Click/%s" % click.__version__)
if app.get_session_var("caller_id"): if app.get_session_var("caller_id"):
dpdata.append("Caller/%s" % app.get_session_var("caller_id")) dpdata.append("Caller/%s" % app.get_session_var("caller_id"))
if getenv("PLATFORMIO_IDE"):
dpdata.append("IDE/%s" % getenv("PLATFORMIO_IDE"))
self['an'] = " ".join(dpdata) self['an'] = " ".join(dpdata)
def _prefill_custom_data(self): def _prefill_custom_data(self):
@ -302,12 +304,15 @@ def on_exception(e):
def _finalize(): def _finalize():
timeout = 1000 # msec timeout = 1000 # msec
elapsed = 0 elapsed = 0
while elapsed < timeout: try:
if not MPDataPusher().in_wait(): while elapsed < timeout:
break if not MPDataPusher().in_wait():
sleep(0.2) break
elapsed += 200 sleep(0.2)
backup_reports(MPDataPusher().get_items()) elapsed += 200
backup_reports(MPDataPusher().get_items())
except KeyboardInterrupt:
pass
def backup_reports(items): def backup_reports(items):

View File

@ -20,7 +20,7 @@ from zipfile import ZipFile
import click import click
from platformio import util from platformio import app, util
from platformio.exception import UnsupportedArchiveType from platformio.exception import UnsupportedArchiveType
@ -92,7 +92,7 @@ class FileUnpacker(object):
raise UnsupportedArchiveType(archpath) raise UnsupportedArchiveType(archpath)
def start(self): def start(self):
if util.is_ci(): if app.is_disabled_progressbar():
click.echo("Unpacking...") click.echo("Unpacking...")
for item in self._unpacker.get_items(): for item in self._unpacker.get_items():
self._unpacker.extract_item(item, self._dest_dir) self._unpacker.extract_item(item, self._dest_dir)

View File

@ -18,9 +18,9 @@ import json
import os import os
import re import re
import subprocess import subprocess
import sys
from glob import glob from glob import glob
from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, from os.path import abspath, basename, dirname, expanduser, isdir, isfile, join
join, realpath)
from platform import system, uname from platform import system, uname
from threading import Thread from threading import Thread
@ -175,7 +175,13 @@ def get_lib_dir():
def get_source_dir(): def get_source_dir():
return dirname(realpath(__file__)) curpath = abspath(__file__)
if not isfile(curpath):
for p in sys.path:
if isfile(join(p, __file__)):
curpath = join(p, __file__)
break
return dirname(curpath)
def get_project_dir(): def get_project_dir():
@ -266,8 +272,18 @@ def get_serialports():
from serial.tools.list_ports import comports from serial.tools.list_ports import comports
except ImportError: except ImportError:
raise exception.GetSerialPortsError(os.name) raise exception.GetSerialPortsError(os.name)
result = [{"port": p, "description": d, "hwid": h}
for p, d, h in comports() if p] result = []
for p, d, h in comports():
if not p:
continue
if "windows" in get_systype():
try:
d = unicode(d, errors="ignore")
except TypeError:
pass
result.append({"port": p, "description": d, "hwid": h})
# fix for PySerial # fix for PySerial
if not result and system() == "Darwin": if not result and system() == "Darwin":
for p in glob("/dev/tty.*"): for p in glob("/dev/tty.*"):
@ -326,7 +342,8 @@ def get_api_result(path, params=None, data=None):
raise exception.APIRequestError(e) raise exception.APIRequestError(e)
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
raise exception.APIRequestError( raise exception.APIRequestError(
"Could not connect to PlatformIO Registry Service") "Could not connect to PlatformIO Registry Service. "
"Please try later.")
except ValueError: except ValueError:
raise exception.APIRequestError( raise exception.APIRequestError(
"Invalid response: %s" % r.text.encode("utf-8")) "Invalid response: %s" % r.text.encode("utf-8"))

View File

@ -54,6 +54,7 @@ setup(
}, },
entry_points={ entry_points={
"console_scripts": [ "console_scripts": [
"pio = platformio.__main__:main",
"platformio = platformio.__main__:main" "platformio = platformio.__main__:main"
] ]
}, },
@ -70,7 +71,7 @@ setup(
"Topic :: Software Development :: Compilers" "Topic :: Software Development :: Compilers"
], ],
keywords=[ keywords=[
"iot", "build tool", "compiler", "builder", "library manager", "iot", "ide", "build", "compile", "library manager",
"embedded", "ci", "continuous integration", "arduino", "mbed", "embedded", "ci", "continuous integration", "arduino", "mbed",
"esp8266", "framework", "ide", "ide integration", "library.json", "esp8266", "framework", "ide", "ide integration", "library.json",
"make", "cmake", "makefile", "mk" "make", "cmake", "makefile", "mk"