Merge branch 'release/v2.4.0'

This commit is contained in:
Ivan Kravets
2015-12-01 17:51:04 +02:00
46 changed files with 927 additions and 486 deletions

270
.pylintrc
View File

@ -1,29 +1,9 @@
[MASTER]
# Specify a configuration file.
#rcfile=
# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=
# Profiled execution.
profile=no
# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=CVS
# Pickle collected data for later comparisons.
persistent=yes
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=
[MESSAGES CONTROL] [MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
confidence=
# Enable the message, report, category or checker with the given id(s). You can # Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option # either give multiple identifier separated by comma (,) or put this option
# multiple time. See also the "--disable" option for examples. # multiple time. See also the "--disable" option for examples.
@ -38,244 +18,6 @@ load-plugins=
# --enable=similarities". If you want to run only the classes checker, but have # --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes # no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W" # --disable=W"
disable=C0103,C0111,E0611,F0401,I0011,R0801,R0903,R0922 # disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,filter-builtin-not-iterating,using-cmp-argument,useless-suppression,range-builtin-not-iterating,suppressed-message,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,hex-method,nonzero-method,map-builtin-not-iterating
disable=locally-disabled,missing-docstring,invalid-name,too-few-public-methods,redefined-variable-type,import-error,similarities,unsupported-membership-test,unsubscriptable-object,ungrouped-imports
[REPORTS]
# Set the output format. Available formats are text, parseable, colorized, msvs
# (visual studio) and html. You can also give a reporter class, eg
# mypackage.mymodule.MyReporterClass.
output-format=text
# Put messages in a separate file for each module / package specified on the
# command line instead of printing them on stdout. Reports (if any) will be
# written in a file name "pylint_global.[txt|html]".
files-output=no
# Tells whether to display a full report or only the messages
reports=yes
# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Add a comment according to your evaluation note. This is used by the global
# evaluation report (RP0004).
comment=no
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details
#msg-template=
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
[BASIC]
# Required attributes for module, separated by a comma
required-attributes=
# List of builtins function names that should not be used, separated by a comma
bad-functions=map,filter,apply,input
# Regular expression which should only match correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Regular expression which should only match correct module level names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Regular expression which should only match correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$
# Regular expression which should only match correct function names
function-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct method names
method-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct instance attribute names
attr-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct variable names
variable-rgx=[a-z_][a-z0-9_]{2,30}$
# Regular expression which should only match correct attribute names in class
# bodies
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Regular expression which should only match correct list comprehension /
# generator expression variable names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_
# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata
# Regular expression which should only match function or class names that do
# not require a docstring.
no-docstring-rgx=__.*__
# Minimum line length for functions/classes that require docstrings, shorter
# ones are exempt.
docstring-min-length=-1
[FORMAT]
# Maximum number of characters on a single line.
max-line-length=80
# Regexp for a line that is allowed to be longer than the limit.
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
# Allow the body of an if to be on the same line as the test if there is no
# else.
single-line-if-stmt=no
# List of optional constructs for which whitespace checking is disabled
no-space-check=trailing-comma,dict-separator
# Maximum number of lines in a module
max-module-lines=1000
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string=' '
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO
[SIMILARITIES]
# Minimum lines number of a similarity.
min-similarity-lines=4
# Ignore comments when computing similarities.
ignore-comments=yes
# Ignore docstrings when computing similarities.
ignore-docstrings=yes
# Ignore imports when computing similarities.
ignore-imports=no
[TYPECHECK]
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes
# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set).
ignored-classes=SQLObject
# When zope mode is activated, add a predefined set of Zope acquired attributes
# to generated-members.
zope=no
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed. Python regular
# expressions are accepted.
generated-members=REQUEST,acl_users,aq_parent
[VARIABLES]
# Tells whether we should check for unused import in __init__ files.
init-import=no
# A regular expression matching the beginning of the name of dummy variables
# (i.e. not used).
dummy-variables-rgx=_$|dummy
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=
[CLASSES]
# List of interface methods to ignore, separated by a comma. This is used for
# instance to not check methods defines in Zope's Interface base class.
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=mcs
[DESIGN]
# Maximum number of arguments for function / method
max-args=5
# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=_.*
# Maximum number of locals for function / method body
max-locals=15
# Maximum number of return / yield for function / method body
max-returns=6
# Maximum number of branch for function / method body
max-branches=12
# Maximum number of statements in function / method body
max-statements=50
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of attributes for a class (see R0902).
max-attributes=7
# Minimum number of public methods for a class (see R0903).
min-public-methods=2
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
[IMPORTS]
# Deprecated modules which should not be used, separated by a comma
deprecated-modules=regsub,TERMIOS,Bastion,rexec
# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=
# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=
# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=Exception

View File

@ -4,6 +4,25 @@ Release History
PlatformIO 2.0 PlatformIO 2.0
-------------- --------------
2.4.0 (2015-12-01)
~~~~~~~~~~~~~~~~~~
* Added support for the new boards: Atmel ATSAMR21-XPRO, Atmel SAML21-XPRO-B,
Atmel SAMD21-XPRO, ST 32F469IDISCOVERY, ST 32L476GDISCOVERY, ST Nucleo F031K6,
ST Nucleo F042K6, ST Nucleo F303K8 and ST Nucleo L476RG
* Updated Arduino core for Espressif platform to 2.0.0
(`issue #345 <https://github.com/platformio/platformio/issues/345>`_)
* Added to FAQ explanation of `Can not compile a library that compiles without issue
with Arduino IDE <http://docs.platformio.org/en/latest/faq.html#building>`_
(`issue #331 <https://github.com/platformio/platformio/issues/331>`_)
* Fixed ESP-12E flash size
(`pull #333 <https://github.com/platformio/platformio/pull/333>`_)
* Fixed configuration for LowPowerLab MoteinoMEGA board
(`issue #335 <https://github.com/platformio/platformio/issues/335>`_)
* Fixed "LockFailed: failed to create appstate.json.lock" error for Windows
* Fixed relative include path for preprocessor using ``build_flags``
(`issue #271 <https://github.com/platformio/platformio/issues/271>`_)
2.3.5 (2015-11-18) 2.3.5 (2015-11-18)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~

View File

@ -32,7 +32,7 @@ PlatformIO
`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>`_ |
`Source Code <https://github.com/platformio>`_ | `Source Code <https://github.com/platformio>`_ |
`Documentation <http://docs.platformio.org>`_ || `Documentation <http://docs.platformio.org>`_ |
`Blog <http://www.ikravets.com/category/computer-life/platformio>`_ | `Blog <http://www.ikravets.com/category/computer-life/platformio>`_ |
`Twitter <https://twitter.com/PlatformIO_Org>`_ | `Twitter <https://twitter.com/PlatformIO_Org>`_ |
`Hackaday <https://hackaday.io/project/7980-platformio>`_ | `Hackaday <https://hackaday.io/project/7980-platformio>`_ |
@ -42,9 +42,20 @@ PlatformIO
.. image:: https://raw.githubusercontent.com/platformio/platformio/develop/docs/_static/platformio-logo.png .. image:: https://raw.githubusercontent.com/platformio/platformio/develop/docs/_static/platformio-logo.png
:target: http://platformio.org :target: http://platformio.org
`PlatformIO <http://platformio.org>`_ is an open-source cross-platform code `PlatformIO <http://platformio.org>`_ is an open source ecosystem for IoT
builder and the missing library manager (Ready for embedded development, IDE development. Cross-platform code builder and library manager. Continuous and
and Continuous integration, Arduino and MBED compatible). IDE integration. Arduino and MBED compatible. Ready for Cloud compiling.
* **Development Platforms** - Embedded and Desktop development platforms with
pre-built toolchains, debuggers, uploaders and frameworks which work under
popular host OS: Mac, Windows, Linux (+ARM)
* **Embedded Boards** - Rapid Embedded Programming, IDE and Continuous
Integration in a few steps with PlatformIO thanks to built-in project
generator for the most popular embedded boards and IDE
* **Library Manager** - Hundreds Popular Libraries are organized into single
Web 2.0 platform: list by categories, keywords, authors, compatible
platforms and frameworks; learn via examples; be up-to-date with the latest
version
*Atmel AVR & SAM, Espressif, Freescale Kinetis, Nordic nRF51, NXP LPC, *Atmel AVR & SAM, Espressif, Freescale Kinetis, Nordic nRF51, NXP LPC,
Silicon Labs EFM32, ST STM32, TI MSP430 & Tiva, Teensy, Arduino, mbed, Silicon Labs EFM32, ST STM32, TI MSP430 & Tiva, Teensy, Arduino, mbed,
@ -66,15 +77,10 @@ libOpenCM3, etc.*
* `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 History <http://docs.platformio.org/en/latest/history.html>`_
You have **no need** to install any *IDE* or compile any tool chains. *PlatformIO*
has pre-built different development platforms and pre-configured settings for
the most popular embedded boards. For further details, please
refer to `What is PlatformIO? <http://docs.platformio.org/en/latest/faq.html#what-is-platformio>`_
Use whenever. *Run everywhere.* Use whenever. *Run everywhere.*
------------------------------- -------------------------------
*PlatformIO* is written in pure *Python* and **doesn't depend** on any *PlatformIO* is written in pure *Python* and **doesn't depend** on any
additional libraries/tools from an operation system. It allows you to use additional libraries/tools from an operating system. It allows you to use
*PlatformIO* beginning from *PC (Mac, Linux, Win)* and ending with credit-card *PlatformIO* beginning from *PC (Mac, Linux, Win)* and ending with credit-card
sized computers (`Raspberry Pi <http://www.raspberrypi.org>`_, sized computers (`Raspberry Pi <http://www.raspberrypi.org>`_,
`BeagleBone <http://beagleboard.org>`_, `BeagleBone <http://beagleboard.org>`_,
@ -88,7 +94,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, Energia, Qt Creator, Sublime Text, Vim, Visual Studio* *Arduino, Eclipse, Energia, Qt Creator, Sublime Text, Vim, Visual Studio*
* `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
`build -flags/-options <http://docs.platformio.org/en/latest/projectconf.html#build-flags>`_ `build -flags/-options <http://docs.platformio.org/en/latest/projectconf.html#build-flags>`_
@ -134,8 +140,8 @@ cross-platform substitute for the classic *Make* utility.
Single source code. *Multiple platforms.* Single source code. *Multiple platforms.*
----------------------------------------- -----------------------------------------
*PlatformIO* allows developer to compile the same code with different *PlatformIO* allows the developer to compile the same code with different
development platforms using the *Only One Command* development platforms using only *One Command*
`platformio run <http://docs.platformio.org/en/latest/userguide/cmd_run.html>`_. `platformio run <http://docs.platformio.org/en/latest/userguide/cmd_run.html>`_.
This happens due to This happens due to
`Project Configuration File (platformio.ini) <http://docs.platformio.org/en/latest/projectconf.html>`_ `Project Configuration File (platformio.ini) <http://docs.platformio.org/en/latest/projectconf.html>`_
@ -166,6 +172,7 @@ Frameworks:
* `SPL <http://platformio.org/#!/frameworks/spl>`_ * `SPL <http://platformio.org/#!/frameworks/spl>`_
* `mbed <http://platformio.org/#!/frameworks/mbed>`_ * `mbed <http://platformio.org/#!/frameworks/mbed>`_
For further details, please refer to `What is PlatformIO? <http://docs.platformio.org/en/latest/faq.html#what-is-platformio>`_
Licence Licence
------- -------

View File

@ -1,11 +1,6 @@
machine: machine:
python: python:
version: 2.7 version: 2.7
environment:
TOX_ENV: docs
TOX_ENV: lint
TOX_ENV: py26
TOX_ENV: py27
checkout: checkout:
post: post:
@ -18,4 +13,4 @@ dependencies:
test: test:
override: override:
- tox -e $TOX_ENV - tox -e py27

254
docs/_static/extra.css vendored Normal file
View File

@ -0,0 +1,254 @@
/**
* Copyright 2014-2015 Ivan Kravets <me@ikravets.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
header,
nav {
display: block;
}
#pionav {
display: none;
}
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 768px) {
#pionav {
display: block !important;
}
body {
padding-top: 50px;
}
.wy-nav-side {
top: 50px;
}
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
.container-fluid {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
.container:before,
.container:after,
.container-fluid:before,
.container-fluid:after,
.nav:before,
.nav:after,
.navbar:before,
.navbar:after,
.navbar-header:before,
.navbar-header:after {
display: table;
content: " ";
}
.container:after,
.container-fluid:after,
.nav:after,
.navbar:after,
.navbar-header:after {
clear: both;
}
.nav {
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav > li {
position: relative;
display: block;
}
.nav > li > a {
position: relative;
display: block;
padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: #eee;
}
.nav > li > a > img {
max-width: none;
}
.navbar {
position: relative;
min-height: 50px;
margin-bottom: 20px;
border: 1px solid transparent;
}
@media (min-width: 768px) {
.navbar {
border-radius: 4px;
}
}
@media (min-width: 768px) {
.navbar-header {
float: left;
}
}
@media (min-width: 768px) {
.navbar-fixed-top {
padding-right: 0;
padding-left: 0;
}
}
.navbar-fixed-top {
max-height: 340px;
}
.container > .navbar-header,
.container-fluid > .navbar-header {
margin-right: -15px;
margin-left: -15px;
}
@media (min-width: 768px) {
.container > .navbar-header,
.container-fluid > .navbar-header {
margin-right: 0;
margin-left: 0;
}
}
.navbar-fixed-top {
position: fixed;
right: 0;
left: 0;
z-index: 1030;
}
@media (min-width: 768px) {
.navbar-fixed-top {
border-radius: 0;
}
}
.navbar-fixed-top {
top: 0;
border-width: 0 0 1px;
}
.navbar-fixed-bottom {
bottom: 0;
margin-bottom: 0;
border-width: 1px 0 0;
}
.navbar-brand {
float: left;
height: 50px;
padding: 15px 15px;
font-size: 18px;
line-height: 20px;
}
.navbar-brand:hover,
.navbar-brand:focus {
text-decoration: none;
}
.navbar-brand > img {
display: block;
}
@media (min-width: 768px) {
.navbar > .container .navbar-brand,
.navbar > .container-fluid .navbar-brand {
margin-left: -15px;
}
}
.navbar-nav {
margin: 7.5px -15px;
}
.navbar-nav > li > a {
padding-top: 10px;
padding-bottom: 10px;
line-height: 20px;
}
@media (min-width: 768px) {
.navbar-nav {
float: left;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding-top: 15px;
padding-bottom: 15px;
}
}
@media (min-width: 768px) {
.navbar-left {
float: left !important;
}
.navbar-right {
float: right !important;
margin-right: -15px;
}
.navbar-right ~ .navbar-right {
margin-right: 0;
}
}
.navbar-inverse {
background-color: #222;
border-color: #080808;
}
.navbar-inverse .navbar-brand {
color: #9d9d9d;
}
.navbar-inverse .navbar-brand:hover,
.navbar-inverse .navbar-brand:focus {
color: #fff;
background-color: transparent;
}
.navbar-inverse .navbar-text {
color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a {
color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
color: #fff;
background-color: transparent;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
color: #fff;
background-color: #080808;
}
.navbar-header .navbar-brand {
color: #e0e0e0;
}

BIN
docs/_static/favicon.ico vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 28 KiB

31
docs/_templates/footer.html vendored Normal file
View File

@ -0,0 +1,31 @@
{% extends "!footer.html" %}
{% block extrafooter %}
<link rel="stylesheet" href="{{ pathto('_static/extra.css', 1) }}" type="text/css" />
<header id="pionav" class="navbar navbar-inverse navbar-fixed-top">
<div class="container container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="http://platformio.org/"></i> PlatformIO</a>
</div>
<nav role="navigation">
<div>
<ul class="nav navbar-nav">
<li><a href="http://platformio.org/#!/get-started"><i class="fa fa-rocket fa-lg"></i> Get Started</a></li>
<li><a href="http://platformio.org/#!/platforms"><i class="fa fa-laptop fa-lg"></i> Platforms</a></li>
<li><a href="http://platformio.org/#!/frameworks"><i class="fa fa-cogs fa-lg"></i> Frameworks</a></li>
<li><a href="http://platformio.org/#!/boards"><i class="fa fa-gamepad fa-lg"></i> Boards</a></li>
<li ><a href="http://platformio.org/#!/lib"><i class="fa fa-code fa-lg"></i> Libraries</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="http://platformio.org/#!/who-uses"><i class="fa fa-heart-o fa-lg"></i> Who uses</a></li>
<li class="active"><a href="http://docs.platformio.org/"><i class="fa fa-book fa-lg"></i> Docs</a></li>
</ul>
</div>
</nav>
</div>
</header>
{{ super() }}
{% endblock %}

View File

@ -23,10 +23,14 @@ Here are recent articles about PlatformIO:
2015 2015
^^^^ ^^^^
* Nov 29, 2015 - **Keith Hughes** - `Using PlatformIO for Embedded Projects <http://smartspacestuff.blogspot.com/2015/11/using-platformio-for-embedded-projects.html>`_
* Nov 22, 2015 - **Michał Seroczyński** - `Using PlatformIO to get started with Arduino in CLion IDE <http://www.ches.pl/using-platformio-get-started-arduino-clion-ide/>`_
* Nov 09, 2015 - **ÁLvaro García Gómez** - `Programar con Arduino "The good way" (Programming with Arduino "The good way", Spanish) <http://congdegnu.es/2015/11/09/programar-con-arduino-the-good-way/>`_ * Nov 09, 2015 - **ÁLvaro García Gómez** - `Programar con Arduino "The good way" (Programming with Arduino "The good way", Spanish) <http://congdegnu.es/2015/11/09/programar-con-arduino-the-good-way/>`_
* Nov 06, 2015 - **nocd5** - `PlatformIOでmbedをオフラインビルドしSTM32 Nucleoボードでmrubyを使う (Use mruby in the offline build for STM32 Nucleo board with mbed and PlatformIO, Japanese) <http://qiita.com/nocd5/items/d5fda776240f7e7c17eb>`_ * Nov 06, 2015 - **nocd5** - `PlatformIOでmbedをオフラインビルドしSTM32 Nucleoボードでmrubyを使う (Use mruby in the offline build for STM32 Nucleo board with mbed and PlatformIO, Japanese) <http://qiita.com/nocd5/items/d5fda776240f7e7c17eb>`_
* Oct 18, 2015 - **Nico Coetzee** - `First Arduino I2C Experience with PlatformIO <https://electronicventurer.wordpress.com/2015/10/18/first-arduino-i2c-experience/>`_ * Oct 18, 2015 - **Nico Coetzee** - `First Arduino I2C Experience with PlatformIO <https://electronicventurer.wordpress.com/2015/10/18/first-arduino-i2c-experience/>`_
* Oct 01, 2015 - **Mistan** - `Compile and Upload Arduino Sketch with PlatformIO for Raspberry Pi Running Arch Linux <http://tech.memoryimprintstudio.com/code-building-for-arduino-with-platformio-for-raspberry-pi-with-arch-linux/>`_
* Sep 01, 2015 - **Thomas P. Weldon, Ph.D.** - `Improvised MBED FRDM-K64F Eclipse/PlatformIO Setup and Software Installation <http://thomasweldon.com/tpw/courses/embeddsp/p00pcFrdmK64_eclipsePlatformioSetup.html>`_ * Sep 01, 2015 - **Thomas P. Weldon, Ph.D.** - `Improvised MBED FRDM-K64F Eclipse/PlatformIO Setup and Software Installation <http://thomasweldon.com/tpw/courses/embeddsp/p00pcFrdmK64_eclipsePlatformioSetup.html>`_
* Aug 08, 2015 - **Josh Glendenning** - `Armstrap Eagle and PlatformIO <http://isobit.io/2015/08/08/armstrap.html>`_
* Aug 01, 2015 - **Russell Davis** - `PlatformIO on the Raspberry Pi <http://www.russelldavis.org/2015/08/01/platformio-on-the-raspberry-pi/>`_ * Aug 01, 2015 - **Russell Davis** - `PlatformIO on the Raspberry Pi <http://www.russelldavis.org/2015/08/01/platformio-on-the-raspberry-pi/>`_
* Jul 25, 2015 - **DinoTools** - `Erste Schritte mit PlatformIO (Getting Started with PlatformIO, German) <https://www.dinotools.de/2015/07/25/erste-schritte-mit-platformio/>`_ * Jul 25, 2015 - **DinoTools** - `Erste Schritte mit PlatformIO (Getting Started with PlatformIO, German) <https://www.dinotools.de/2015/07/25/erste-schritte-mit-platformio/>`_
* Jul 20, 2015 - **Eli Fatsi** - `Arduino Development in Atom Editor <http://viget.com/extend/arduino-development-in-atom-editor>`_ * Jul 20, 2015 - **Eli Fatsi** - `Arduino Development in Atom Editor <http://viget.com/extend/arduino-development-in-atom-editor>`_

View File

@ -37,49 +37,169 @@ different :ref:`platforms`.
Integration Integration
----------- -----------
Put ``circle.yml`` to the root directory of the GitHub repository. Please make sure to read Circle CI `Getting Started <https://circleci.com/docs/getting-started>`_
guide first.
.. code-block:: yaml
dependencies:
pre:
# Install the latest stable PlatformIO
- sudo pip install -U platformio
test:
override:
- platformio ci path/to/test/file.c --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
- platformio ci examples/file.ino --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
- platformio ci path/to/test/directory --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
For more details as for PlatformIO build process please look into :ref:`cmd_ci`.
Project as a library
~~~~~~~~~~~~~~~~~~~~
When project is written as a library (where own examples or testing code use
it), please use ``--lib="."`` option for :ref:`cmd_ci` command
.. code-block:: yaml
script:
- platformio ci --lib="." --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
Library dependecies
~~~~~~~~~~~~~~~~~~~
There 2 options to test source code with dependent libraries:
Install dependent library using :ref:`librarymanager`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: yaml
dependencies:
pre:
# Install the latest stable PlatformIO
- sudo pip install -U platformio
# OneWire Library with ID=1 http://platformio.org/#!/lib/show/1/OneWire
- platformio lib install 1
test:
override:
- platformio ci path/to/test/file.c --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
Manually download dependent library and include in build process via ``--lib`` option
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: yaml
dependencies:
pre:
# Install the latest stable PlatformIO
- sudo pip install -U platformio
# download library to the temporary directory
- wget https://github.com/PaulStoffregen/OneWire/archive/master.zip -O /tmp/onewire_source.zip
- unzip /tmp/onewire_source.zip -d /tmp/
test:
override:
- platformio ci path/to/test/file.c --lib="/tmp/OneWire-master" --board=TYPE_1 --board=TYPE_2 --board=TYPE_N
Custom Build Flags
~~~~~~~~~~~~~~~~~~
PlatformIO allows to specify own build flags using :envvar:`PLATFORMIO_BUILD_FLAGS` environment
.. code-block:: yaml .. code-block:: yaml
machine: machine:
environment: environment:
PLATFORMIO_CI_SRC: path/to/source/file.c PLATFORMIO_BUILD_FLAGS: -D SPECIFIC_MACROS -I/extra/inc
PLATFORMIO_CI_SRC: path/to/source/file.ino
PLATFORMIO_CI_SRC: path/to/source/directory
dependencies:
pre: For the more details, please follow to
- sudo apt-get install python2.7-dev :ref:`available build flags/options <projectconf_build_flags>`.
- sudo python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
Advanced configuration
~~~~~~~~~~~~~~~~~~~~~~
PlatformIO allows to configure multiple build environments for the single
source code using :ref:`projectconf`.
Instead of ``--board`` option, please use :option:`platformio ci --project-conf`
.. code-block:: yaml
test: test:
override: override:
- platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N - platformio ci path/to/test/file.c --project-conf=/path/to/platoformio.ini
For more details as for PlatformIO build process please look into :ref:`cmd_ci`
command.
Examples Examples
-------- --------
1. Integration for `USB_Host_Shield_2.0 <https://github.com/felis/USB_Host_Shield_2.0>`_ 1. Custom build flags
project. The ``circle.yml`` configuration file:
.. code-block:: yaml .. code-block:: yaml
machine:
environment:
PLATFORMIO_CI_SRC: examples/Bluetooth/PS3SPP/PS3SPP.ino
PLATFORMIO_CI_SRC: examples/pl2303/pl2303_gps/pl2303_gps.ino
dependencies: dependencies:
cache_directories:
- "~/.platformio"
pre: pre:
- sudo apt-get install python2.7-dev - sudo pip install -U platformio
- sudo python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
- wget https://github.com/xxxajk/spi4teensy3/archive/master.zip -O /tmp/spi4teensy3.zip # pre-install PlatformIO development platforms, they will be cached
- unzip /tmp/spi4teensy3.zip -d /tmp - platformio platforms install atmelavr atmelsam teensy
#
# Libraries from PlatformIO Library Registry:
#
# http://platformio.org/#!/lib/show/416/TinyGPS
# http://platformio.org/#!/lib/show/417/SPI4Teensy3
- platformio lib install 416 417
test: test:
override: override:
- platformio ci --lib="." --lib="/tmp/spi4teensy3-master" --board=uno --board=teensy31 --board=due - platformio ci examples/acm/acm_terminal --board=uno --board=teensy31 --board=due --lib="."
- platformio ci examples/adk/adk_barcode --board=uno --board=teensy31 --board=due --lib="."
- platformio ci examples/adk/ArduinoBlinkLED --board=uno --board=teensy31 --board=due --lib="."
- platformio ci examples/adk/demokit_20 --board=uno --board=teensy31 --board=due --lib="."
# ...
- platformio ci examples/Xbox/XBOXUSB --board=uno --board=teensy31 --board=due --lib="."
* Configuration file: https://github.com/ivankravets/USB_Host_Shield_2.0/blob/master/circle.yml
* Build History: https://circleci.com/gh/ivankravets/USB_Host_Shield_2.0/tree/master
2. Dependency on external libraries
.. code-block:: yaml
dependencies:
pre:
# Install the latest stable PlatformIO
- sudo pip install -U platformio
# download dependent libraries
- wget https://github.com/jcw/jeelib/archive/master.zip -O /tmp/jeelib.zip
- unzip /tmp/jeelib.zip -d /tmp
- wget https://github.com/Rodot/Gamebuino/archive/master.zip -O /tmp/gamebuino.zip
- unzip /tmp/gamebuino.zip -d /tmp
test:
override:
- platformio ci examples/backSoon/backSoon.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/etherNode/etherNode.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/getDHCPandDNS/getDHCPandDNS.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/getStaticIP/getStaticIP.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
# ...
- platformio ci examples/twitter/twitter.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/udpClientSendOnly/udpClientSendOnly.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/udpListener/udpListener.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
- platformio ci examples/webClient/webClient.ino --lib="." --lib="/tmp/jeelib-master" --lib="/tmp/Gamebuino-master/libraries/tinyFAT" --board=uno --board=megaatmega2560
* Configuration file: hhttps://github.com/ivankravets/ethercard/blob/master/circle.yaml
* Build History: https://circleci.com/gh/ivankravets/ethercard/tree/master

View File

@ -119,12 +119,12 @@ html_theme = 'default'
# The name of an image file (relative to this directory) to place at the top # The name of an image file (relative to this directory) to place at the top
# of the sidebar. # of the sidebar.
#html_logo = None #html_logo = '_static/platformio-logo.png'
# The name of an image file (within the static path) to use as favicon of the # The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large. # pixels large.
#html_favicon = None html_favicon = '_static/favicon.ico'
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
@ -184,22 +184,22 @@ htmlhelp_basename = 'PlatformIOdoc'
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ---------------------------------------------
latex_elements = { latex_elements = {
# The paper size ('letterpaper' or 'a4paper'). # The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper', #'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt'). # The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt', #'pointsize': '10pt',
# Additional stuff for the LaTeX preamble. # Additional stuff for the LaTeX preamble.
#'preamble': '', #'preamble': '',
} }
# Grouping the document tree into LaTeX files. List of tuples # Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'PlatformIO.tex', u'PlatformIO Documentation', ('index', 'PlatformIO.tex', u'PlatformIO Documentation',
u'Ivan Kravets', 'manual'), u'Ivan Kravets', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -242,9 +242,9 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
('index', 'PlatformIO', u'PlatformIO Documentation', ('index', 'PlatformIO', u'PlatformIO Documentation',
u'Ivan Kravets', 'PlatformIO', 'One line description of project.', u'Ivan Kravets', 'PlatformIO', 'One line description of project.',
'Miscellaneous'), 'Miscellaneous'),
] ]
# Documents to append as an appendix to all manuals. # Documents to append as an appendix to all manuals.

View File

@ -24,8 +24,8 @@ General
What is PlatformIO? What is PlatformIO?
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
`PlatformIO <http://platformio.org>`_ is an open-source cross-platform code `PlatformIO <http://platformio.org>`_ is an open source ecosystem for IoT
builder and the missing library manager. development.
PlatformIO is independent from the platform, in which it is running. In fact, PlatformIO is independent from the platform, in which it is running. In fact,
the only requirement is Python, which exists pretty much everywhere. What this the only requirement is Python, which exists pretty much everywhere. What this
@ -132,25 +132,15 @@ Answered in `issue #279 <https://github.com/platformio/platformio/issues/279>`_.
Answered in `issue #295 <https://github.com/platformio/platformio/issues/295#issuecomment-143772005>`_. Answered in `issue #295 <https://github.com/platformio/platformio/issues/295#issuecomment-143772005>`_.
.. _faq_troubleshooting_pioblocksprompt: Windows AttributeError: 'module' object has no attribute 'packages'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PlatformIO blocks command execution using user prompt Answered in `issue #252 <https://github.com/platformio/platformio/issues/252#issuecomment-127072039>`_.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you are going to run *PlatformIO* from **subprocess**, you **MUST
DISABLE** all prompts. It will allow you to avoid blocking.
There are a few options:
- using :option:`platformio --force` option before each command
- using environment variable :envvar:`PLATFORMIO_SETTING_ENABLE_PROMPTS=No <PLATFORMIO_SETTING_ENABLE_PROMPTS>`
- disable global setting ``enable_prompts`` via :ref:`cmd_settings` command
- masking under Continuous Integration system via environment variable
:envvar:`CI=true <CI>`.
.. _faq_troubleshooting_pionotfoundinpath: .. _faq_troubleshooting_pionotfoundinpath:
Program ``platformio`` not found in PATH Program ``platformio`` not found in PATH
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ''''''''''''''''''''''''''''''''''''''''
Where is ``platformio`` binary installed? Run this command in Terminal Where is ``platformio`` binary installed? Run this command in Terminal
@ -173,18 +163,12 @@ programs to the ``bin`` directory which is included in ``$PATH``. For example,
see `issue #272 <https://github.com/platformio/platformio/issues/272#issuecomment-133626112>`_. see `issue #272 <https://github.com/platformio/platformio/issues/272#issuecomment-133626112>`_.
Windows UnicodeDecodeError: 'ascii' codec can't decode byte Windows UnicodeDecodeError: 'ascii' codec can't decode byte
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Answered in `issue #143 <https://github.com/platformio/platformio/issues/143#issuecomment-88060906>`_. Answered in `issue #143 <https://github.com/platformio/platformio/issues/143#issuecomment-88060906>`_.
Serial does not work with panStampAVR board PlatformIO: command not found || An error "pkg_resources.DistributionNotFound"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Answered in `issue #144 <https://github.com/platformio/platformio/issues/144#issuecomment-87388038>`_.
PlatformIO: command not found || An error ``pkg_resources.DistributionNotFound``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please upgrade *SetupTools* package: Please upgrade *SetupTools* package:
@ -197,18 +181,45 @@ Please upgrade *SetupTools* package:
[sudo] pip uninstall platformio [sudo] pip uninstall platformio
[sudo] pip install platformio [sudo] pip install platformio
Windows AttributeError: 'module' object has no attribute 'packages' Miscellaneous
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~
Answered in `issue #252 <https://github.com/platformio/platformio/issues/252#issuecomment-127072039>`_. .. _faq_troubleshooting_pioblocksprompt:
PlatformIO blocks command execution using user prompt
'''''''''''''''''''''''''''''''''''''''''''''''''''''
If you are going to run *PlatformIO* from **subprocess**, you **MUST
DISABLE** all prompts. It will allow you to avoid blocking.
There are a few options:
- using :option:`platformio --force` option before each command
- using environment variable :envvar:`PLATFORMIO_SETTING_ENABLE_PROMPTS=No <PLATFORMIO_SETTING_ENABLE_PROMPTS>`
- disable global setting ``enable_prompts`` via :ref:`cmd_settings` command
- masking under Continuous Integration system via environment variable
:envvar:`CI=true <CI>`.
Serial does not work with panStampAVR board
'''''''''''''''''''''''''''''''''''''''''''
Answered in `issue #144 <https://github.com/platformio/platformio/issues/144#issuecomment-87388038>`_.
Building
~~~~~~~~
Can not compile a library that compiles without issue with Arduino IDE
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
* `#298: Unable to use Souliss library <https://github.com/platformio/platformio/issues/298>`_
* `#331: Unable to use MySensors library <https://github.com/platformio/platformio/issues/331>`_
ARM toolchain: cc1plus: error while loading shared libraries ARM toolchain: cc1plus: error while loading shared libraries
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
See related answers for See related answers for
`error while loading shared libraries <https://github.com/platformio/platformio/issues?utf8=✓&q=error+while+loading+shared+libraries>`_. `error while loading shared libraries <https://github.com/platformio/platformio/issues?utf8=✓&q=error+while+loading+shared+libraries>`_.
Archlinux: libncurses.so.5: cannot open shared object file Archlinux: libncurses.so.5: cannot open shared object file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Answered in `issue #291 <https://github.com/platformio/platformio/issues/291>`_. Answered in `issue #291 <https://github.com/platformio/platformio/issues/291>`_.

View File

@ -56,6 +56,10 @@ Now, in VIM ``cd /path/to/this/project`` and press ``Ctrl+B`` or ``Cmd+B``
(Mac). *PlatformIO* should compile your source code from the ``src`` directory, (Mac). *PlatformIO* should compile your source code from the ``src`` directory,
make firmware and upload it. make firmware and upload it.
.. note::
If hotkey doesn't work for you, try to add this line
``nnoremap <C-b> :make<CR>`` to ``~/.vimrc``
Screenshot Screenshot
---------- ----------

View File

@ -9,18 +9,26 @@
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.
PlatformIO is an open-source cross-platform code builder and the missing library manager PlatformIO is an open source ecosystem for IoT development
======================================================================================== ==========================================================
**Ready for embedded development, IDE and Continuous integration, Arduino and **Cross-platform code builder and library manager. Continuous and IDE
MBED compatible** integration. Arduino and MBED compatible. Ready for Cloud compiling.**
* **Development Platforms** - Embedded and Desktop development platforms with
pre-built toolchains, debuggers, uploaders and frameworks which work under
popular host OS: Mac, Windows, Linux (+ARM)
* **Embedded Boards** - Rapid Embedded Programming, IDE and Continuous
Integration in a few steps with PlatformIO thanks to built-in project
generator for the most popular embedded boards and IDE
* **Library Manager** - Hundreds Popular Libraries are organized into single
Web 2.0 platform: list by categories, keywords, authors, compatible
platforms and frameworks; learn via examples; be up-to-date with the latest
version
*Atmel AVR & SAM, Espressif, Freescale Kinetis, Nordic nRF51, NXP LPC, *Atmel AVR & SAM, Espressif, Freescale Kinetis, Nordic nRF51, NXP LPC,
Silicon Labs EFM32, ST STM32, TI MSP430 & Tiva, Teensy, Arduino, mbed, Silicon Labs EFM32, ST STM32, TI MSP430 & Tiva, Teensy, Arduino, mbed,
libOpenCM3, etc.* libOpenCM3, etc.**
.. image:: _static/platformio-logo.png
:target: http://platformio.org
* `Website <http://platformio.org>`_ * `Website <http://platformio.org>`_
* `Web 2.0 Library Search <http://platformio.org/#!/lib>`_ | * `Web 2.0 Library Search <http://platformio.org/#!/lib>`_ |
@ -34,18 +42,13 @@ libOpenCM3, etc.*
`Facebook <https://www.facebook.com/platformio>`_ | `Facebook <https://www.facebook.com/platformio>`_ |
`Reddit <http://www.reddit.com/r/platformio/>`_ `Reddit <http://www.reddit.com/r/platformio/>`_
You have **no need** to install any *IDE* or compile any tool chains. *PlatformIO*
has pre-built different development platforms and pre-configured settings for
the most popular embedded boards. For further details, please
refer to :ref:`faq_what_is_platformio`
Embedded Development. *Easier Than Ever.* Embedded Development. *Easier Than Ever.*
----------------------------------------- -----------------------------------------
* Colourful command-line output * Colourful command-line output
* :ref:`IDE Integration <ide>` with *Arduino, Eclipse, Energia, Qt Creator, * :ref:`IDE Integration <ide>` with *Arduino, Eclipse, Energia, Qt Creator,
Sublime Text, Vim, Visual Studio* Sublime Text, Vim, Visual Studio*
* :ref:`ci` with *AppVeyor, Circle CI, Drone, Shippable, Travis CI* * Cloud compiling and :ref:`ci` with *AppVeyor, Circle CI, Drone, Shippable, Travis CI*
* Built-in :ref:`Serial Port Monitor <cmd_serialports_monitor>` and * Built-in :ref:`Serial Port Monitor <cmd_serialports_monitor>` and
configurable build :ref:`-flags/-options <projectconf_build_flags>` configurable build :ref:`-flags/-options <projectconf_build_flags>`
* Pre-built tool chains, :ref:`frameworks` for the * Pre-built tool chains, :ref:`frameworks` for the
@ -68,6 +71,7 @@ The Missing Library Manager. *It's here!*
* Automatic library updating * Automatic library updating
* It runs on Windows, Mac OS X, and Linux (+ARM). * It runs on Windows, Mac OS X, and Linux (+ARM).
For further details, please refer to :ref:`faq_what_is_platformio`
Contents Contents
-------- --------

View File

@ -38,7 +38,7 @@ application (Terminal):
* Mac OS X / Linux *Terminal* application * Mac OS X / Linux *Terminal* application
* Windows ``cmd.exe`` application. * Windows ``cmd.exe`` application.
Installation options Installation Methods
-------------------- --------------------
.. warning:: .. warning::
@ -47,10 +47,10 @@ Installation options
**DON'T FORGET** to select ``Add python.exe to Path`` feature on the **DON'T FORGET** to select ``Add python.exe to Path`` feature on the
"Customize" stage. "Customize" stage.
Please *choose one of* the following installation options: Please *choose ONE of* the following methods:
Python Package Manager a) Python Package Manager
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
The latest stable version of PlatformIO may be installed/upgraded via The latest stable version of PlatformIO may be installed/upgraded via
`pip <https://pip.pypa.io>`_ as follows: `pip <https://pip.pypa.io>`_ as follows:
@ -74,8 +74,8 @@ a few options here:
.. _installation_installer_script: .. _installation_installer_script:
Installer Script b) Installer Script
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Super-Quick (Mac / Linux) Super-Quick (Mac / Linux)
''''''''''''''''''''''''' '''''''''''''''''''''''''
@ -114,8 +114,8 @@ On *Windows OS* it may look like:
# run it # run it
C:\Python27\python.exe get-platformio.py C:\Python27\python.exe get-platformio.py
Full Guide c) Full Guide
~~~~~~~~~~ ~~~~~~~~~~~~~
1. Check a ``python`` version (only 2.6-2.7 is supported): 1. Check a ``python`` version (only 2.6-2.7 is supported):
@ -144,8 +144,8 @@ For upgrading ``platformio`` to the latest version:
pip install -U platformio pip install -U platformio
Development Version d) Development Version
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
Install the latest PlatformIO from the ``develop`` branch: Install the latest PlatformIO from the ``develop`` branch:

View File

@ -11,8 +11,8 @@
.. _board_creating: .. _board_creating:
Creating Board Custom Board
============== ============
*PlatformIO* has pre-built settings for the most popular embedded boards. This *PlatformIO* has pre-built settings for the most popular embedded boards. This
list is available: list is available:

View File

@ -11,8 +11,8 @@
.. _platform_creating: .. _platform_creating:
Creating Platform Custom Platform
================= ===============
*PlatformIO* was developed like a tool which would build the same source code *PlatformIO* was developed like a tool which would build the same source code
for the different development platforms via single command :ref:`cmd_run` for the different development platforms via single command :ref:`cmd_run`

View File

@ -52,8 +52,8 @@ Desktop
linux_x86_64 linux_x86_64
windows_x86 windows_x86
Own Platform/Board Custom Platform & Board
------------------ -----------------------
.. toctree:: .. toctree::
:maxdepth: 2 :maxdepth: 2

View File

@ -530,6 +530,8 @@ Then upload firmware using :option:`platformio run --target program`
board = armstrap_eagle512 board = armstrap_eagle512
upload_protocol = gdb upload_protocol = gdb
Also, take a look at this article `Armstrap Eagle and PlatformIO <http://isobit.io/2015/08/08/armstrap.html>`_.
5. :ref:`platform_ststm32`: Upload firmware using ST-Link instead mbed's media 5. :ref:`platform_ststm32`: Upload firmware using ST-Link instead mbed's media
disk disk

View File

@ -12,14 +12,15 @@
# 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.
VERSION = (2, 3, 5) VERSION = (2, 4, 0)
__version__ = ".".join([str(s) for s in VERSION]) __version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio" __title__ = "platformio"
__description__ = ( __description__ = (
"An open-source cross-platform code builder and the missing library " "An open source ecosystem for IoT development. "
"manager (Ready for embedded development, IDE and Continuous integration, " "Cross-platform code builder and library manager. "
"Arduino and MBED compatible)" "Continuous and IDE integration. "
"Arduino and MBED compatible. Ready for Cloud compiling."
) )
__url__ = "http://platformio.org" __url__ = "http://platformio.org"

View File

@ -103,6 +103,18 @@ def main():
error_str += str(e) error_str += str(e)
else: else:
error_str += format_exc() error_str += format_exc()
error_str += """
============================================================
An unexpected error occurred. Further steps:
* Verify that you have the latest version of PlatformIO using
`platformio upgrade` command
* Report this problem to the developers
https://github.com/platformio/platformio/issues
============================================================
"""
click.secho(error_str, fg="red", err=True) click.secho(error_str, fg="red", err=True)
return 1 return 1
return 0 return 0

View File

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
import json import json
from copy import deepcopy
from os import environ, getenv from os import environ, getenv
from os.path import getmtime, isfile, join from os.path import getmtime, isfile, join
from time import time from time import time
@ -70,13 +71,14 @@ SESSION_VARS = {
class State(object): class State(object):
def __init__(self, path=None): def __init__(self, path=None, lock=False):
self.path = path self.path = path
self.lock = lock
if not self.path: if not self.path:
self.path = join(get_home_dir(), "appstate.json") self.path = join(get_home_dir(), "appstate.json")
self._state = {} self._state = {}
self._prev_state = {} self._prev_state = {}
self._lock = None self._lockfile = None
def __enter__(self): def __enter__(self):
try: try:
@ -86,7 +88,7 @@ class State(object):
self._state = json.load(fp) self._state = json.load(fp)
except ValueError: except ValueError:
self._state = {} self._state = {}
self._prev_state = self._state.copy() self._prev_state = deepcopy(self._state)
return self._state return self._state
def __exit__(self, type_, value, traceback): def __exit__(self, type_, value, traceback):
@ -99,17 +101,19 @@ class State(object):
self._unlock_state_file() self._unlock_state_file()
def _lock_state_file(self): def _lock_state_file(self):
self._lock = LockFile(self.path) if not self.lock:
return
self._lockfile = LockFile(self.path)
if (self._lock.is_locked() and if (self._lockfile.is_locked() and
(time() - getmtime(self._lock.lock_file)) > 10): (time() - getmtime(self._lockfile.lock_file)) > 10):
self._lock.break_lock() self._lockfile.break_lock()
self._lock.acquire() self._lockfile.acquire()
def _unlock_state_file(self): def _unlock_state_file(self):
if self._lock: if self._lockfile:
self._lock.release() self._lockfile.release()
def sanitize_setting(name, value): def sanitize_setting(name, value):
@ -136,7 +140,7 @@ def get_state_item(name, default=None):
def set_state_item(name, value): def set_state_item(name, value):
with State() as data: with State(lock=True) as data:
data[name] = value data[name] = value
@ -159,14 +163,14 @@ def get_setting(name):
def set_setting(name, value): def set_setting(name, value):
with State() as data: with State(lock=True) as data:
if "settings" not in data: if "settings" not in data:
data['settings'] = {} data['settings'] = {}
data['settings'][name] = sanitize_setting(name, value) data['settings'][name] = sanitize_setting(name, value)
def reset_settings(): def reset_settings():
with State() as data: with State(lock=True) as data:
if "settings" in data: if "settings" in data:
del data['settings'] del data['settings']

View File

@ -0,0 +1,50 @@
{
"samr21_xpro": {
"build": {
"f_cpu": "48000000L",
"cpu": "cortex-m0plus",
"mcu": "atsamr21g18a"
},
"frameworks": ["mbed"],
"name": "Atmel ATSAMR21-XPRO",
"platform": "atmelsam",
"upload": {
"maximum_ram_size": 32768,
"maximum_size": 262144
},
"url": "https://developer.mbed.org/platforms/SAMR21-XPRO/",
"vendor": "Atmel"
},
"saml21_xpro_b": {
"build": {
"f_cpu": "48000000L",
"cpu": "cortex-m0plus",
"mcu": "atsaml21j18b"
},
"frameworks": ["mbed"],
"name": "Atmel SAML21-XPRO-B",
"platform": "atmelsam",
"upload": {
"maximum_ram_size": 32768,
"maximum_size": 262144
},
"url": "https://developer.mbed.org/platforms/SAML21-XPRO/",
"vendor": "Atmel"
},
"samd21_xpro": {
"build": {
"f_cpu": "48000000L",
"cpu": "cortex-m0plus",
"mcu": "atsamd21j18a"
},
"frameworks": ["mbed"],
"name": "Atmel SAMD21-XPRO",
"platform": "atmelsam",
"upload": {
"maximum_ram_size": 32768,
"maximum_size": 262144
},
"url": "https://developer.mbed.org/platforms/SAMD21-XPRO/",
"vendor": "Atmel"
}
}

View File

@ -3,7 +3,7 @@
"build": { "build": {
"core": "esp8266", "core": "esp8266",
"extra_flags": "-DARDUINO_ESP8266_ESP01 -DARDUINO_ARCH_ESP8266 -DESP8266", "extra_flags": "-DARDUINO_ESP8266_ESP01 -DARDUINO_ARCH_ESP8266 -DESP8266",
"f_cpu": "40000000L", "f_cpu": "80000000L",
"ldscript": "esp8266.flash.512k.ld", "ldscript": "esp8266.flash.512k.ld",
"mcu": "esp8266", "mcu": "esp8266",
"variant": "generic" "variant": "generic"
@ -35,7 +35,7 @@
"platform": "espressif", "platform": "espressif",
"upload": { "upload": {
"maximum_ram_size": 32768, "maximum_ram_size": 32768,
"maximum_size": 524288, "maximum_size": 4194304,
"protocol": "arduino", "protocol": "arduino",
"require_upload_port" : true, "require_upload_port" : true,
"speed": 115200 "speed": 115200

View File

@ -434,7 +434,7 @@
"extra_flags": "-DARDUINO_ARCH_AVR -DAVR_MOTEINOMEGA", "extra_flags": "-DARDUINO_ARCH_AVR -DAVR_MOTEINOMEGA",
"f_cpu": "16000000L", "f_cpu": "16000000L",
"mcu": "atmega1284p", "mcu": "atmega1284p",
"variant": "moteinoMega" "variant": "moteinomega"
}, },
"frameworks": ["arduino"], "frameworks": ["arduino"],
"name": "LowPowerLab MoteinoMEGA", "name": "LowPowerLab MoteinoMEGA",

View File

@ -441,5 +441,101 @@
}, },
"url": "http://www.st.com/web/en/catalog/tools/PF260318", "url": "http://www.st.com/web/en/catalog/tools/PF260318",
"vendor": "ST" "vendor": "ST"
},
"disco_f469ni": {
"build": {
"f_cpu": "180000000L",
"cpu": "cortex-m4",
"mcu": "stm32f469nih6"
},
"frameworks": ["mbed"],
"name": "ST 32F469IDISCOVERY",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 393216,
"maximum_size": 1048576
},
"url": "http://www.st.com/web/catalog/tools/FM116/CL1620/SC959/SS1532/LN1848/PF262395",
"vendor": "ST"
},
"disco_l476vg": {
"build": {
"f_cpu": "80000000L",
"cpu": "cortex-m4",
"mcu": "stm32l476vgt6"
},
"frameworks": ["mbed"],
"name": "ST 32L476GDISCOVERY",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 131072,
"maximum_size": 1048576
},
"url": "http://www.st.com/web/catalog/tools/FM116/CL1620/SC959/SS1532/LN1848/PF261635",
"vendor": "ST"
},
"nucleo_f031k6": {
"build": {
"f_cpu": "48000000L",
"cpu": "cortex-m0",
"mcu": "stm32f031k6t6"
},
"frameworks": ["mbed"],
"name": "ST Nucleo F031K6",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 4096,
"maximum_size": 32768
},
"url": "https://developer.mbed.org/platforms/ST-Nucleo-F031K6/",
"vendor": "ST"
},
"nucleo_f042k6": {
"build": {
"f_cpu": "48000000L",
"cpu": "cortex-m0",
"mcu": "stm32f042k6t6"
},
"frameworks": ["mbed"],
"name": "ST Nucleo F042K6",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 6144,
"maximum_size": 32768
},
"url": "https://developer.mbed.org/platforms/ST-Nucleo-F042K6/",
"vendor": "ST"
},
"nucleo_f303k8": {
"build": {
"f_cpu": "72000000L",
"cpu": "cortex-m4",
"mcu": "stm32f303k8t6"
},
"frameworks": ["mbed"],
"name": "ST Nucleo F303K8",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 16384,
"maximum_size": 65536
},
"url": "https://developer.mbed.org/platforms/ST-Nucleo-F303K8/",
"vendor": "ST"
},
"nucleo_l476rg": {
"build": {
"f_cpu": "80000000L",
"cpu": "cortex-m4",
"mcu": "stm32l476rgt6"
},
"frameworks": ["mbed"],
"name": "ST Nucleo L476RG",
"platform": "ststm32",
"upload": {
"maximum_ram_size": 131072,
"maximum_size": 1048576
},
"url": "https://developer.mbed.org/platforms/ST-Nucleo-L476RG/",
"vendor": "ST"
} }
} }

View File

@ -12,6 +12,8 @@
# 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.
# pylint: disable=wrong-import-position,wrong-import-order,unused-import
try: try:
from platformio import util from platformio import util
except ImportError: except ImportError:
@ -29,7 +31,7 @@ except ImportError:
sys.path.insert(0, _p) sys.path.insert(0, _p)
try: try:
from platformio import util from platformio import util
import lockfile # NOQA pylint: disable=unused-import import lockfile # NOQA
break break
except ImportError: except ImportError:
pass pass
@ -112,6 +114,12 @@ DefaultEnvironment(
env = DefaultEnvironment() env = DefaultEnvironment()
# Append PlatformIO version
env.Append(
CPPDEFINES=["PLATFORMIO={0:02d}{1:02d}{2:02d}".format(
*util.pioversion_to_intstr())]
)
if "BOARD" in env: if "BOARD" in env:
try: try:
env.Replace(BOARD_OPTIONS=util.get_boards(env.subst("$BOARD"))) env.Replace(BOARD_OPTIONS=util.get_boards(env.subst("$BOARD")))

View File

@ -56,6 +56,8 @@ env.Replace(
"-mtext-section-literals", "-mtext-section-literals",
"-falign-functions=4", "-falign-functions=4",
"-U__STRICT_ANSI__", "-U__STRICT_ANSI__",
"-ffunction-sections",
"-fdata-sections",
"-MMD" # output dependancy info "-MMD" # output dependancy info
], ],
@ -75,7 +77,8 @@ env.Replace(
"-nostdlib", "-nostdlib",
"-Wl,--no-check-sections", "-Wl,--no-check-sections",
"-u", "call_user_start", "-u", "call_user_start",
"-Wl,-static" "-Wl,-static",
"-Wl,--gc-sections"
], ],
SIZEPRINTCMD='"$SIZETOOL" -B -d $SOURCES', SIZEPRINTCMD='"$SIZETOOL" -B -d $SOURCES',
@ -103,6 +106,8 @@ if "FRAMEWORK" in env:
] ]
) )
_board_max_rom = int(
env.get("BOARD_OPTIONS", {}).get("upload", {}).get("maximum_size", 0))
env.Append( env.Append(
BUILDERS=dict( BUILDERS=dict(
ElfToBin=Builder( ElfToBin=Builder(
@ -113,8 +118,9 @@ env.Append(
"-bo", "$TARGET", "-bo", "$TARGET",
"-bm", "dio", "-bm", "dio",
"-bf", "${BOARD_OPTIONS['build']['f_cpu'][:2]}", "-bf", "${BOARD_OPTIONS['build']['f_cpu'][:2]}",
"-bz", str(int(env.get("BOARD_OPTIONS", {}).get( "-bz",
"upload", {}).get("maximum_size") / 1024)) + "K", "%dK" % (_board_max_rom / 1024) if _board_max_rom < 1048576
else "%dM" % (_board_max_rom / 1048576),
"-bs", ".text", "-bs", ".text",
"-bp", "4096", "-bp", "4096",
"-ec", "-ec",

View File

@ -55,10 +55,10 @@ elif env.get("PLATFORM") == "timsp430":
) )
elif env.get("PLATFORM") == "espressif": elif env.get("PLATFORM") == "espressif":
env.Prepend( env.Prepend(
CPPPATH=[join("$PLATFORMFW_DIR", "sdk", "include")], CPPPATH=[join("$PLATFORMFW_DIR", "tools", "sdk", "include")],
LIBPATH=[join("$PLATFORMFW_DIR", "sdk", "lib")], LIBPATH=[join("$PLATFORMFW_DIR", "tools", "sdk", "lib")],
LIBS=["smartconfig", "pp", "main", "wpa", "lwip", LIBS=["smartconfig", "pp", "main", "wpa", "lwip",
"net80211", "wps", "crypto", "phy", "hal", "gcc", "m"] "net80211", "wps", "crypto", "phy", "hal", "axtls", "gcc", "m"]
) )
env.Replace(PLATFORMFW_DIR=PLATFORMFW_DIR) env.Replace(PLATFORMFW_DIR=PLATFORMFW_DIR)

View File

@ -23,6 +23,8 @@ including ST STM32, Ti Tiva and Stellaris, NXP LPC 11xx, 13xx, 15xx,
http://www.libopencm3.org/wiki/Main_Page http://www.libopencm3.org/wiki/Main_Page
""" """
from __future__ import absolute_import
import re import re
from os import listdir, sep, walk from os import listdir, sep, walk
from os.path import isfile, join, normpath from os.path import isfile, join, normpath

View File

@ -29,7 +29,7 @@ http://mbed.org/
import re import re
import xml.etree.ElementTree as ElementTree import xml.etree.ElementTree as ElementTree
from binascii import crc32 from binascii import crc32
from os import walk from os import getenv, walk
from os.path import basename, isfile, join, normpath from os.path import basename, isfile, join, normpath
from SCons.Script import DefaultEnvironment, Exit from SCons.Script import DefaultEnvironment, Exit
@ -54,7 +54,7 @@ MBED_VARIANTS = {
"seeedTinyBLE": "SEEED_TINY_BLE", "seeedTinyBLE": "SEEED_TINY_BLE",
"redBearLab": "RBLAB_NRF51822", "redBearLab": "RBLAB_NRF51822",
"nrf51-dt": "NRF51_DK", "nrf51-dt": "NRF51_DK",
"redBearLabBLENano": "RBLAB_NRF51822", "redBearLabBLENano": "RBLAB_BLENANO",
"wallBotBLE": "NRF51822", "wallBotBLE": "NRF51822",
"frdm_kl25z": "KL25Z", "frdm_kl25z": "KL25Z",
"frdm_kl46z": "KL46Z", "frdm_kl46z": "KL46Z",
@ -63,7 +63,10 @@ MBED_VARIANTS = {
"frdm_k20d50m": "K20D50M", "frdm_k20d50m": "K20D50M",
"frdm_k22f": "K22F", "frdm_k22f": "K22F",
"teensy31": "TEENSY3_1", "teensy31": "TEENSY3_1",
"dfcm_nnn40": "DELTA_DFCM_NNN40" "dfcm_nnn40": "DELTA_DFCM_NNN40",
"samr21_xpro": "SAMR21G18A",
"saml21_xpro_b": "SAML21J18A",
"samd21_xpro": "SAMD21J18A"
} }
MBED_LIBS_MAP = { MBED_LIBS_MAP = {
@ -223,7 +226,11 @@ env.Replace(
) )
# restore external build flags # restore external build flags
env.ProcessFlags() env.ProcessFlags([
env.get("BOARD_OPTIONS", {}).get("build", {}).get("extra_flags"),
env.get("BUILD_FLAGS"),
getenv("PLATFORMIO_BUILD_FLAGS"),
])
# Hook for K64F and K22F # Hook for K64F and K22F
if board_type in ("frdm_k22f", "frdm_k64f"): if board_type in ("frdm_k22f", "frdm_k64f"):

View File

@ -0,0 +1,61 @@
# Copyright 2014-2015 Ivan Kravets <me@ikravets.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
PlatformIO
PlatformIO Framework is an open source light-weight framework with
high-level API for cross-platform embedded programming. It lies above popular
middleware (HAL, SDK) and leverages all its benefits. This approach allowed to
incorporate different development platforms ranging from 8-bits AVR to powerful
32-bit ARM into the one embedded ecosystem.
http://platformio.org
"""
from os.path import join
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
env.Replace(
PLATFORMFW_DIR=join("$PIOPACKAGES_DIR", "framework-platformio")
)
env.VariantDirWrap(
join("$BUILD_DIR", "FrameworkPlatformIO"),
join("$PLATFORMFW_DIR", "src", "api")
)
env.Append(
CPPPATH=[
join("$BUILD_DIR", "FrameworkCMSIS"),
join("$BUILD_DIR", "FrameworkCMSISVariant")
]
)
envsafe = env.Clone()
#
# Target: Build Core Library
#
libs = []
libs.append(envsafe.BuildLibrary(
join("$BUILD_DIR", "FrameworkCMSISVariant"),
join("$PLATFORMFW_DIR", "variants", "${BOARD_OPTIONS['build']['variant']}")
))
env.Append(LIBS=libs)

View File

@ -12,6 +12,8 @@
# 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 __future__ import absolute_import
import atexit import atexit
import re import re
from glob import glob from glob import glob

View File

@ -12,7 +12,9 @@
# 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.path import join, isfile from __future__ import absolute_import
from os.path import isfile, join
from shutil import copyfile from shutil import copyfile
from time import sleep from time import sleep

View File

@ -12,17 +12,17 @@
# 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 __future__ import absolute_import
import re import re
from glob import glob 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 from os.path import basename, dirname, isdir, isfile, join, normpath, realpath
from SCons.Script import (COMMAND_LINE_TARGETS, DefaultEnvironment, Exit, from SCons.Script import (COMMAND_LINE_TARGETS, DefaultEnvironment, Exit,
SConscript) 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([
@ -39,8 +39,14 @@ def BuildProgram(env):
ASCOM="$ASPPCOM" ASCOM="$ASPPCOM"
) )
env.ProcessFlags() env.ProcessFlags([
env.BuildFramework() env.get("BOARD_OPTIONS", {}).get("build", {}).get("extra_flags"),
env.get("BUILD_FLAGS"),
getenv("PLATFORMIO_BUILD_FLAGS"),
])
env.BuildFrameworks([
f.lower().strip() for f in env.get("FRAMEWORK", "").split(",")])
# build dependent libs # build dependent libs
deplibs = env.BuildDependentLibraries("$PROJECTSRC_DIR") deplibs = env.BuildDependentLibraries("$PROJECTSRC_DIR")
@ -62,40 +68,35 @@ def BuildProgram(env):
) )
# Handle SRC_BUILD_FLAGS # Handle SRC_BUILD_FLAGS
if getenv("PLATFORMIO_SRC_BUILD_FLAGS", None): env.ProcessFlags([
env.MergeFlags(getenv("PLATFORMIO_SRC_BUILD_FLAGS")) env.get("SRC_BUILD_FLAGS", None),
if "SRC_BUILD_FLAGS" in env: getenv("PLATFORMIO_SRC_BUILD_FLAGS"),
env.MergeFlags(env['SRC_BUILD_FLAGS']) ])
env.Append(
CPPDEFINES=["PLATFORMIO={0:02d}{1:02d}{2:02d}".format(
*pioversion_to_intstr())]
)
return env.Program( return env.Program(
join("$BUILD_DIR", env.subst("$PROGNAME")), join("$BUILD_DIR", env.subst("$PROGNAME")),
env.LookupSources( env.LookupSources(
"$BUILDSRC_DIR", "$PROJECTSRC_DIR", duplicate=False, "$BUILDSRC_DIR", "$PROJECTSRC_DIR", duplicate=False,
src_filter=getenv("PLATFORMIO_SRC_FILTER", src_filter=getenv("PLATFORMIO_SRC_FILTER",
env.get("SRC_FILTER", None))), env.get("SRC_FILTER"))),
LIBS=env.get("LIBS", []) + deplibs, LIBS=env.get("LIBS", []) + deplibs,
LIBPATH=env.get("LIBPATH", []) + ["$BUILD_DIR"] LIBPATH=env.get("LIBPATH", []) + ["$BUILD_DIR"]
) )
def ProcessFlags(env): def ProcessFlags(env, flags):
if "extra_flags" in env.get("BOARD_OPTIONS", {}).get("build", {}): for f in flags:
env.MergeFlags(env.subst("${BOARD_OPTIONS['build']['extra_flags']}")) if f:
env.MergeFlags(str(f))
# Handle BUILD_FLAGS # fix relative CPPPATH
if getenv("PLATFORMIO_BUILD_FLAGS", None): for i, p in enumerate(env.get("CPPPATH", [])):
env.MergeFlags(getenv("PLATFORMIO_BUILD_FLAGS")) if isdir(p):
if "BUILD_FLAGS" in env: env['CPPPATH'][i] = realpath(p)
env.MergeFlags(env['BUILD_FLAGS'])
# Cancel any previous definition of name, either built in or # Cancel any previous definition of name, either built in or
# provided with a -D option // Issue #191 # provided with a -D option // Issue #191
undefines = [f for f in env.get("CCFLAGS", []) if f.startswith("-U")] undefines = [u for u in env.get("CCFLAGS", []) if u.startswith("-U")]
if undefines: if undefines:
for undef in undefines: for undef in undefines:
env['CCFLAGS'].remove(undef) env['CCFLAGS'].remove(undef)
@ -165,23 +166,24 @@ def LookupSources(env, variant_dir, src_dir, duplicate=True, src_filter=None):
return sources return sources
def BuildFramework(env): def BuildFrameworks(env, frameworks):
if "FRAMEWORK" not in env or "uploadlazy" in COMMAND_LINE_TARGETS: if not frameworks or "uploadlazy" in COMMAND_LINE_TARGETS:
return return
if env['FRAMEWORK'].lower() in ("arduino", "energia"): board_frameworks = env.get("BOARD_OPTIONS", {}).get("frameworks")
env.ConvertInoToCpp() if frameworks == ["platformio"]:
if board_frameworks:
frameworks.insert(0, board_frameworks[0])
for f in env['FRAMEWORK'].split(","): for f in frameworks:
framework = f.strip().lower() if f in ("arduino", "energia"):
if framework in env.get("BOARD_OPTIONS", {}).get("frameworks"): env.ConvertInoToCpp()
SConscript(
env.subst(join("$PIOBUILDER_DIR", "scripts", "frameworks", if f in board_frameworks:
"%s.py" % framework)) SConscript(env.subst(
) join("$PIOBUILDER_DIR", "scripts", "frameworks", "%s.py" % f)))
else: else:
Exit("Error: This board doesn't support %s framework!" % Exit("Error: This board doesn't support %s framework!" % f)
framework)
def BuildLibrary(env, variant_dir, src_dir, src_filter=None): def BuildLibrary(env, variant_dir, src_dir, src_filter=None):
@ -345,7 +347,7 @@ def generate(env):
env.AddMethod(IsFileWithExt) env.AddMethod(IsFileWithExt)
env.AddMethod(VariantDirWrap) env.AddMethod(VariantDirWrap)
env.AddMethod(LookupSources) env.AddMethod(LookupSources)
env.AddMethod(BuildFramework) env.AddMethod(BuildFrameworks)
env.AddMethod(BuildLibrary) env.AddMethod(BuildLibrary)
env.AddMethod(BuildDependentLibraries) env.AddMethod(BuildDependentLibraries)
return env return env

View File

@ -135,7 +135,7 @@ def lib_install(ctx, libid, version):
except AssertionError: except AssertionError:
raise exception.LibInstallDependencyError(str(item)) raise exception.LibInstallDependencyError(str(item))
except exception.LibAlreadyInstalledError: except exception.LibAlreadyInstalled:
click.secho("Already installed", fg="yellow") click.secho("Already installed", fg="yellow")

View File

@ -56,9 +56,9 @@ def cli():
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")
except (OSError, AssertionError) as e: except Exception as e: # pylint: disable=W0703
if not r: if not r:
raise exception.PlatformioUpgradeError( raise exception.UpgradeError(
"\n".join([str(cmd), str(e)])) "\n".join([str(cmd), str(e)]))
if ("Permission denied" in r['err'] and if ("Permission denied" in r['err'] and
"windows" not in util.get_systype()): "windows" not in util.get_systype()):
@ -74,7 +74,7 @@ WARNING! Don't use `sudo` for the rest PlatformIO commands.
""", fg="yellow", err=True) """, fg="yellow", err=True)
raise exception.ReturnErrorCode() raise exception.ReturnErrorCode()
else: else:
raise exception.PlatformioUpgradeError( raise exception.UpgradeError(
"\n".join([str(cmd), r['out'], r['err']])) "\n".join([str(cmd), r['out'], r['err']]))

View File

@ -149,11 +149,11 @@ class APIRequestError(PlatformioException):
MESSAGE = "[API] %s" MESSAGE = "[API] %s"
class LibAlreadyInstalledError(PlatformioException): class LibAlreadyInstalled(PlatformioException):
pass pass
class LibNotInstalledError(PlatformioException): class LibNotInstalled(PlatformioException):
MESSAGE = "Library #%d has not been installed yet" MESSAGE = "Library #%d has not been installed yet"
@ -183,11 +183,6 @@ class InvalidSettingValue(PlatformioException):
MESSAGE = "Invalid value '%s' for the setting '%s'" MESSAGE = "Invalid value '%s' for the setting '%s'"
class UpgraderFailed(PlatformioException):
MESSAGE = "An error occurred while upgrading PlatformIO"
class CIBuildEnvsEmpty(PlatformioException): class CIBuildEnvsEmpty(PlatformioException):
MESSAGE = "Can't find PlatformIO build environments.\n"\ MESSAGE = "Can't find PlatformIO build environments.\n"\
@ -195,20 +190,20 @@ class CIBuildEnvsEmpty(PlatformioException):
"predefined environments using `--project-conf` option" "predefined environments using `--project-conf` option"
class SConsNotInstalled(PlatformioException): class SConsNotInstalledError(PlatformioException):
MESSAGE = "The PlatformIO and `scons` aren't installed properly. "\ MESSAGE = "The PlatformIO and `scons` aren't installed properly. "\
"More details in FAQ/Troubleshooting section: "\ "More details in FAQ/Troubleshooting section: "\
"http://docs.platformio.org/en/latest/faq.html" "http://docs.platformio.org/en/latest/faq.html"
class PlatformioUpgradeError(PlatformioException): class UpgradeError(PlatformioException):
MESSAGE = "%s \n\n"\ MESSAGE = """%s
"1. Please report this issue here: "\
"https://github.com/platformio/platformio/issues \n"\ * Try different installation/upgrading steps:
"2. Try different installation/upgrading steps: "\ http://docs.platformio.org/en/latest/installation.html
"http://docs.platformio.org/en/latest/installation.html" """
class CygwinEnvDetected(PlatformioException): class CygwinEnvDetected(PlatformioException):

View File

@ -21,7 +21,7 @@ from tempfile import gettempdir
from platformio import telemetry, util from platformio import telemetry, util
from platformio.downloader import FileDownloader from platformio.downloader import FileDownloader
from platformio.exception import LibAlreadyInstalledError, LibNotInstalledError from platformio.exception import LibAlreadyInstalled, LibNotInstalled
from platformio.unpacker import FileUnpacker from platformio.unpacker import FileUnpacker
@ -73,17 +73,17 @@ class LibraryManager(object):
for item in self.get_installed().values(): for item in self.get_installed().values():
if "id" in item and item['id'] == id_: if "id" in item and item['id'] == id_:
return item return item
raise LibNotInstalledError(id_) raise LibNotInstalled(id_)
def is_installed(self, id_): def is_installed(self, id_):
try: try:
return int(self.get_info(id_)['id']) == id_ return int(self.get_info(id_)['id']) == id_
except LibNotInstalledError: except LibNotInstalled:
return False return False
def install(self, id_, version=None): def install(self, id_, version=None):
if self.is_installed(id_): if self.is_installed(id_):
raise LibAlreadyInstalledError() raise LibAlreadyInstalled()
dlinfo = util.get_api_result( dlinfo = util.get_api_result(
"/lib/download/" + str(id_), "/lib/download/" + str(id_),
@ -120,4 +120,4 @@ class LibraryManager(object):
label="#%d %s" % (id_, item['name']) label="#%d %s" % (id_, item['name'])
) )
return True return True
raise LibNotInstalledError(id_) raise LibNotInstalled(id_)

View File

@ -145,11 +145,6 @@ def after_upgrade(ctx):
click.style("give", fg="cyan"), click.style("give", fg="cyan"),
click.style("https://github.com/platformio/platformio", fg="cyan") click.style("https://github.com/platformio/platformio", fg="cyan")
)) ))
click.echo("- %s for the new features/issues on Bountysource > %s" % (
click.style("vote", fg="cyan"),
click.style("https://www.bountysource.com/teams/platformio/issues",
fg="cyan")
))
click.echo("*" * terminal_width) click.echo("*" * terminal_width)
click.echo("") click.echo("")
@ -171,7 +166,7 @@ def after_upgrade(ctx):
telemetry.on_event(category="Auto", action="Upgrade", telemetry.on_event(category="Auto", action="Upgrade",
label="%s > %s" % (last_version, __version__)) label="%s > %s" % (last_version, __version__))
else: else:
raise exception.UpgraderFailed() raise exception.UpgradeError("Auto upgrading...")
click.echo("") click.echo("")

View File

@ -395,7 +395,7 @@ class BasePlatform(object):
stderr=util.AsyncPipe(self.on_run_err) stderr=util.AsyncPipe(self.on_run_err)
) )
except (OSError, AssertionError): except (OSError, AssertionError):
raise exception.SConsNotInstalled() raise exception.SConsNotInstalledError()
assert "returncode" in result assert "returncode" in result
# if self._found_error: # if self._found_error:

View File

@ -291,7 +291,10 @@ def on_exception(e):
return return
mp = MeasurementProtocol() mp = MeasurementProtocol()
mp['exd'] = "%s: %s" % (type(e).__name__, e) mp['exd'] = "%s: %s" % (type(e).__name__, e)
mp['exf'] = int(not isinstance(e, exception.PlatformioException)) mp['exf'] = int(any([
not isinstance(e, exception.PlatformioException),
"Error" in e.__class__.__name__
]))
mp.send("exception") mp.send("exception")

View File

@ -64,7 +64,7 @@ class ZIPArchive(ArchiveBase):
def preserve_mtime(item, dest_dir): def preserve_mtime(item, dest_dir):
util.change_filemtime( util.change_filemtime(
join(dest_dir, item.filename), join(dest_dir, item.filename),
mktime(list(item.date_time) + [0]*3) mktime(list(item.date_time) + [0] * 3)
) )
def get_items(self): def get_items(self):

View File

@ -27,6 +27,7 @@ from threading import Thread
from platformio import __apiurl__, __version__, exception from platformio import __apiurl__, __version__, exception
# pylint: disable=wrong-import-order
try: try:
from configparser import ConfigParser from configparser import ConfigParser
except ImportError: except ImportError:
@ -67,6 +68,7 @@ class AsyncPipe(Thread):
class cd(object): class cd(object):
def __init__(self, new_path): def __init__(self, new_path):
self.new_path = new_path self.new_path = new_path
self.prev_path = os.getcwd() self.prev_path = os.getcwd()

View File

@ -1,7 +1,7 @@
bottle==0.12.9 bottle==0.12.9
click==5.1 click==5.1
colorama==0.3.3 colorama==0.3.3
lockfile==0.11.0 lockfile==0.12.2
pyserial==2.7 pyserial==2.7
requests==2.8.1 requests==2.8.1
scons==2.4.1 scons==2.4.1

View File

@ -21,7 +21,7 @@ from platformio import (__author__, __description__, __email__, __license__,
install_requires = [ install_requires = [
"bottle", "bottle",
"click>=3.2", "click>=3.2,<6",
"lockfile>=0.9.1", "lockfile>=0.9.1",
"pyserial", "pyserial",
"requests>=2.4.0" "requests>=2.4.0"
@ -72,7 +72,7 @@ setup(
"Topic :: Software Development :: Compilers" "Topic :: Software Development :: Compilers"
], ],
keywords=( keywords=(
"builder library manager embedded development ide continuous " "iot builder library manager embedded development ide continuous "
"integration atmel avr sam espressif esp freescale kinetis nordic " "integration atmel avr sam espressif esp freescale kinetis nordic "
"nrf51 nxp lpc silicon labs efm32 st stm32 ti msp430 tiva teensy " "nrf51 nxp lpc silicon labs efm32 st stm32 ti msp430 tiva teensy "
"arduino mbed libopencm3" "arduino mbed libopencm3"