From 1426e7879397804c2ec506ffaac17cde978c4723 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 3 Oct 2015 15:38:33 +0100 Subject: [PATCH 01/16] Show valid environment names when user typed unknown values --- platformio/__init__.py | 2 +- platformio/commands/run.py | 7 +++++-- platformio/exception.py | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 33f6ab52..e181eb57 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 3, 3) +VERSION = (2, 3, "4.dev0") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/commands/run.py b/platformio/commands/run.py index daf6ae41..8fdf485b 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -36,9 +36,12 @@ def cli(ctx, environment, target, upload_port, # pylint: disable=R0913,R0914 if not config.sections(): raise exception.ProjectEnvsNotAvailable() - unknown = set(environment) - set([s[4:] for s in config.sections()]) + known = set([s[4:] for s in config.sections() + if s.startswith("env:")]) + unknown = set(environment) - known if unknown: - raise exception.UnknownEnvNames(", ".join(unknown)) + raise exception.UnknownEnvNames( + ", ".join(unknown), ", ".join(known)) # clean obsolete .pioenvs dir if not disable_auto_clean: diff --git a/platformio/exception.py b/platformio/exception.py index 84b6aca0..940d41d2 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -104,17 +104,17 @@ class UnsupportedArchiveType(PlatformioException): class ProjectEnvsNotAvailable(PlatformioException): - MESSAGE = "Please setup environments in `platformio.ini` file." + MESSAGE = "Please setup environments in `platformio.ini` file" class InvalidEnvName(PlatformioException): - MESSAGE = "Invalid environment '%s'. The name must start " "with 'env:'." + MESSAGE = "Invalid environment '%s'. The name must start with 'env:'" class UnknownEnvNames(PlatformioException): - MESSAGE = "Unknown environment names '%s'." + MESSAGE = "Unknown environment names '%s'. Valid names are '%s'" class GetSerialPortsError(PlatformioException): From 52b98dd159cbb13b31a6567152828cff220bd596 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 4 Oct 2015 15:20:49 +0100 Subject: [PATCH 02/16] Add "Commands completion in Terminal" --- docs/faq.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/faq.rst b/docs/faq.rst index 8aa0bd0c..ef95f275 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -24,8 +24,9 @@ between team members, regardless of operating system they prefer to work with. Beyond that, PlatformIO can be run not only on commonly used desktops/laptops but also on the servers without X Window System. While PlatformIO itself is a console application, it can be used in combination with one's favorite -:ref:`ide` or text editor such as :ref:`ide_arduino`, :ref:`ide_eclipse`, -:ref:`ide_visualstudio`, :ref:`ide_vim`, :ref:`ide_sublimetext`, etc. +:ref:`ide` or text editor such as :ref:`ide_arduino`, :ref:`ide_atom`, +:ref:`ide_clion`, :ref:`ide_eclipse`, :ref:`ide_qtcreator`, +:ref:`ide_sublimetext`, :ref:`ide_vim`, :ref:`ide_visualstudio`, etc. Alright, so PlatformIO can run on different operating systems. But more importantly, from development perspective at least, is a list of supported @@ -55,6 +56,19 @@ the project developed using PlatformIO is as follows: * Users develop code and PlatformIO makes sure that it is compiled, prepared and uploaded to all the boards of interest. +Commands completion in Terminal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Bash completion +''''''''''''''' + +Bash completion support will complete subcommands and parameters. To enable +Bash completion for `platformio` subcommands you need to put into your `.bashrc`: + +.. code-block:: bash + + eval "$(_PLATFORMIO_COMPLETE=source platformio)" + .. _faq_troubleshooting: Troubleshooting From 1c9dc2ba3d32125015869fff84e2c998cf8cff99 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 6 Oct 2015 17:06:47 +0100 Subject: [PATCH 03/16] Handle WindowsError when can't remove .pioenvs directory --- platformio/commands/run.py | 8 +++--- platformio/exception.py | 52 ++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 8fdf485b..11a16325 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -45,7 +45,10 @@ def cli(ctx, environment, target, upload_port, # pylint: disable=R0913,R0914 # clean obsolete .pioenvs dir if not disable_auto_clean: - _clean_pioenvs_dir() + try: + _clean_pioenvs_dir(util.get_pioenvs_dir()) + except Exception: + raise exception.CleanPioenvsDirError(util.get_pioenvs_dir()) results = [] for section in config.sections(): @@ -224,8 +227,7 @@ def _autoinstall_libs(ctx, libids_list): ctx.invoke(cmd_lib_install, libid=not_intalled_libs) -def _clean_pioenvs_dir(): - pioenvs_dir = util.get_pioenvs_dir() +def _clean_pioenvs_dir(pioenvs_dir): structhash_file = join(pioenvs_dir, "structure.hash") proj_hash = calculate_project_hash() diff --git a/platformio/exception.py b/platformio/exception.py index 940d41d2..8195912e 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -33,14 +33,14 @@ class UnknownPlatform(PlatformioException): class PlatformNotInstalledYet(PlatformioException): - MESSAGE = ("The platform '%s' has not been installed yet. " - "Use `platformio platforms install` command") + MESSAGE = "The platform '%s' has not been installed yet. "\ + "Use `platformio platforms install` command" class UnknownCLICommand(PlatformioException): - MESSAGE = ("Unknown command '%s'. Please use `platformio --help`" - " to see all available commands") + MESSAGE = "Unknown command '%s'. Please use `platformio --help`"\ + " to see all available commands" class UnknownBoard(PlatformioException): @@ -75,14 +75,14 @@ class FDUnrecognizedStatusCode(PlatformioException): class FDSizeMismatch(PlatformioException): - MESSAGE = ("The size (%d bytes) of downloaded file '%s' " - "is not equal to remote size (%d bytes)") + MESSAGE = "The size (%d bytes) of downloaded file '%s' "\ + "is not equal to remote size (%d bytes)" class FDSHASumMismatch(PlatformioException): - MESSAGE = ("The 'sha1' sum '%s' of downloaded file '%s' " - "is not equal to remote '%s'") + MESSAGE = "The 'sha1' sum '%s' of downloaded file '%s' "\ + "is not equal to remote '%s'" class NotPlatformProject(PlatformioException): @@ -117,6 +117,12 @@ class UnknownEnvNames(PlatformioException): MESSAGE = "Unknown environment names '%s'. Valid names are '%s'" +class CleanPioenvsDirError(PlatformioException): + + MESSAGE = "Can not remove temporary directory `%s`. "\ + "Please remove it manually" + + class GetSerialPortsError(PlatformioException): MESSAGE = "No implementation for your platform ('%s') available" @@ -124,7 +130,7 @@ class GetSerialPortsError(PlatformioException): class GetLatestVersionError(PlatformioException): - MESSAGE = "Can't retrieve the latest PlatformIO version" + MESSAGE = "Can not retrieve the latest PlatformIO version" class APIRequestError(PlatformioException): @@ -173,36 +179,28 @@ class UpgraderFailed(PlatformioException): class CIBuildEnvsEmpty(PlatformioException): - MESSAGE = ( - "Can't find PlatformIO build environments.\nPlease specify `--board` " - "or path to `platformio.ini` with predefined environments using " - "`--project-conf` option" - ) + MESSAGE = "Can't find PlatformIO build environments.\n"\ + "Please specify `--board` or path to `platformio.ini` with "\ + "predefined environments using `--project-conf` option" class SConsNotInstalled(PlatformioException): - MESSAGE = ( - "The PlatformIO and `scons` aren't installed properly. " - "More details in FAQ/Troubleshooting section: " + MESSAGE = "The PlatformIO and `scons` aren't installed properly. "\ + "More details in FAQ/Troubleshooting section: "\ "http://docs.platformio.org/en/latest/faq.html" - ) class PlatformioUpgradeError(PlatformioException): - MESSAGE = ( - "%s \n\n" - "1. Please report this issue here: " - "https://github.com/platformio/platformio/issues \n" - "2. Try different installation/upgrading steps: " + MESSAGE = "%s \n\n"\ + "1. Please report this issue here: "\ + "https://github.com/platformio/platformio/issues \n"\ + "2. Try different installation/upgrading steps: "\ "http://docs.platformio.org/en/latest/installation.html" - ) class CygwinEnvDetected(PlatformioException): - MESSAGE = ( - "PlatformIO does not work within Cygwin environment. " + MESSAGE = "PlatformIO does not work within Cygwin environment. "\ "Use native Terminal instead." - ) From c395dd5ebd0c3ab5843fd642677610f5b991d01c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 7 Oct 2015 11:57:46 +0100 Subject: [PATCH 04/16] Update requests to 2.8.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c2c1efc3..d942675f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,5 @@ click==5.1 colorama==0.3.3 lockfile==0.10.2 pyserial==2.7 -requests==2.7.0 +requests==2.8.0 scons==2.3.6 From 3a0614641b8aa8d4c5dbcbfc6c5c181d59b9306b Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 8 Oct 2015 16:50:47 +0100 Subject: [PATCH 05/16] Add links for Hackaday --- README.rst | 5 +++-- docs/faq.rst | 4 ++-- docs/index.rst | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index bc7998be..9708443d 100644 --- a/README.rst +++ b/README.rst @@ -31,8 +31,9 @@ PlatformIO `Home & Demo `_ | `Project Examples `_ | -`Code `_ | -`Documentation `_ || +`Source Code `_ | +`Documentation `_ + `Blog `_ | `Reddit `_ | `Facebook `_ | diff --git a/docs/faq.rst b/docs/faq.rst index ef95f275..8a7fc30d 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -30,8 +30,8 @@ console application, it can be used in combination with one's favorite Alright, so PlatformIO can run on different operating systems. But more importantly, from development perspective at least, is a list of supported -boards and MCUs. To keep things short: PlatformIO supports over 100 -:ref:`Embedded Boards ` and all major +boards and MCUs. To keep things short: PlatformIO supports over 150+ +`Embedded Boards `_ and all major :ref:`Development Platforms `. PlatformIO allows users to: diff --git a/docs/index.rst b/docs/index.rst index febb2777..33e9d7ce 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -18,9 +18,10 @@ libOpenCM3, etc.* * `Source Code `_ | `Issues `_ * `Blog `_ | - `Reddit `_ | + `Twitter `_ | + `Hackaday `_ | `Facebook `_ | - `Twitter `_ + `Reddit `_ 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 From 6e274cbf20c67b72d7b97da8cc5658bac1eb47c2 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 8 Oct 2015 16:59:12 +0100 Subject: [PATCH 06/16] Correct social links --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 9708443d..e27d5901 100644 --- a/README.rst +++ b/README.rst @@ -32,12 +32,12 @@ PlatformIO `Home & Demo `_ | `Project Examples `_ | `Source Code `_ | -`Documentation `_ - +`Documentation `_ || `Blog `_ | -`Reddit `_ | +`Twitter `_ | +`Hackaday `_ | `Facebook `_ | -`Twitter `_ +`Reddit `_ .. image:: https://raw.githubusercontent.com/platformio/platformio/develop/docs/_static/platformio-logo.png :target: http://platformio.org From 3b8d7304ffc841df65b1d9b6e77aedd17a7e24da Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 9 Oct 2015 14:12:30 +0100 Subject: [PATCH 07/16] Propose upgrading via `pip` --- platformio/maintenance.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platformio/maintenance.py b/platformio/maintenance.py index 5efec017..97675dab 100644 --- a/platformio/maintenance.py +++ b/platformio/maintenance.py @@ -184,10 +184,12 @@ def check_platformio_upgrade(): click.echo("") click.echo("*" * terminal_width) click.secho("There is a new version %s of PlatformIO available.\n" - "Please upgrade it via " % latest_version, + "Please upgrade it via `" % latest_version, fg="yellow", nl=False) click.secho("platformio upgrade", fg="cyan", nl=False) - click.secho(" command.\nChanges: ", fg="yellow", nl=False) + click.secho("` or `", fg="yellow", nl=False) + click.secho("pip install -U platformio", fg="cyan", nl=False) + click.secho("` command.\nChanges: ", fg="yellow", nl=False) click.secho("http://docs.platformio.org/en/latest/history.html", fg="cyan") click.echo("*" * terminal_width) From 7467c281cc43c8e07a0c12d3e2a941ad8f557462 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 10 Oct 2015 11:33:38 +0100 Subject: [PATCH 08/16] Add support for @ubIQio Ardhat board --- HISTORY.rst | 6 ++++++ platformio/__init__.py | 2 +- platformio/boards/misc.json | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 3c4a5f7d..75e475ba 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,12 @@ Release History PlatformIO 2.0 -------------- +2.3.4 (2015-10-??) +~~~~~~~~~~~~~~~~~~ + +* Added support for ubIQio Ardhat board + (`pull #302 `_) + 2.3.3 (2015-10-02) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/__init__.py b/platformio/__init__.py index e181eb57..51ef87aa 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 3, "4.dev0") +VERSION = (2, 3, "4.dev1") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/boards/misc.json b/platformio/boards/misc.json index fbcbf031..ed4fde29 100644 --- a/platformio/boards/misc.json +++ b/platformio/boards/misc.json @@ -1,4 +1,26 @@ { + "ardhat": { + "build": { + "core": "arduino", + "extra_flags": "-DARDUINO_ARCH_AVR -DAVR_ARDHAT", + "f_cpu": "16000000L", + "mcu": "atmega328p", + "variant": "standard" + }, + "frameworks": ["arduino"], + "name": "ubIQio Ardhat", + "platform": "atmelavr", + "upload": { + "maximum_ram_size": 2048, + "maximum_size": 32256, + "protocol": "arduino", + "require_upload_port" : true, + "speed": 115200 + }, + "url": "http://ardhat.com", + "vendor": "ubIQio" + }, + "raspduino": { "build": { "core": "arduino", From 20edf7de41b3fc9a9c0dda24ee18198cd0c3a2ea Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 10 Oct 2015 11:35:01 +0100 Subject: [PATCH 09/16] Add support for @ubIQio Ardhat board // Resolve #302 --- docs/frameworks/arduino.rst | 22 +++++++++++++++++++++- docs/platforms/atmelavr.rst | 20 ++++++++++++++++++++ docs/platforms/espressif.rst | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/docs/frameworks/arduino.rst b/docs/frameworks/arduino.rst index 2902cd6d..0e76b4f1 100644 --- a/docs/frameworks/arduino.rst +++ b/docs/frameworks/arduino.rst @@ -476,7 +476,7 @@ Espressif * - ``esp01`` - `Espressif ESP8266 board `_ - ESP8266 - - 80 MHz + - 40 MHz - 512 Kb - 32 Kb @@ -976,3 +976,23 @@ Wicked Device - 16 MHz - 128 Kb - 16 Kb + +ubIQio +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``ardhat`` + - `ubIQio Ardhat `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb diff --git a/docs/platforms/atmelavr.rst b/docs/platforms/atmelavr.rst index cfd264d0..c86340e0 100644 --- a/docs/platforms/atmelavr.rst +++ b/docs/platforms/atmelavr.rst @@ -872,3 +872,23 @@ Wicked Device - 16 MHz - 128 Kb - 16 Kb + +ubIQio +~~~~~~ + +.. list-table:: + :header-rows: 1 + + * - Type ``board`` + - Name + - Microcontroller + - Frequency + - Flash + - RAM + + * - ``ardhat`` + - `ubIQio Ardhat `_ + - ATMEGA328P + - 16 MHz + - 32 Kb + - 2 Kb diff --git a/docs/platforms/espressif.rst b/docs/platforms/espressif.rst index 1a134dcb..5fde9300 100644 --- a/docs/platforms/espressif.rst +++ b/docs/platforms/espressif.rst @@ -77,6 +77,6 @@ Espressif * - ``esp01`` - `Espressif ESP8266 board `_ - ESP8266 - - 80 MHz + - 40 MHz - 512 Kb - 32 Kb From 1164ef31ca6791e71d7002f9f256b32479f273a7 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 12 Oct 2015 13:24:42 +0100 Subject: [PATCH 10/16] Fix missing of `framework-mbed` package for `teensy` platform // Resolve #305 --- HISTORY.rst | 4 ++++ docs/frameworks/mbed.rst | 3 +++ docs/platforms/teensy.rst | 24 +++++++++++++++--------- platformio/platforms/teensy.py | 4 ++++ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 75e475ba..1e4480cf 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,10 @@ PlatformIO 2.0 * Added support for ubIQio Ardhat board (`pull #302 `_) +* Fixed missing of `framework-mbed `_ + package for `teensy `_ + platform + (`issue #305 `_) 2.3.3 (2015-10-02) ~~~~~~~~~~~~~~~~~~ diff --git a/docs/frameworks/mbed.rst b/docs/frameworks/mbed.rst index 1d54bc9d..0d4fa0cf 100644 --- a/docs/frameworks/mbed.rst +++ b/docs/frameworks/mbed.rst @@ -31,6 +31,9 @@ Platforms * - :ref:`platform_ststm32` - The STM32 family of 32-bit Flash MCUs based on the ARM Cortex-M processor is designed to offer new degrees of freedom to MCU users. It offers a 32-bit product range that combines very high performance, real-time capabilities, digital signal processing, and low-power, low-voltage operation, while maintaining full integration and ease of development. + * - :ref:`platform_teensy` + - Teensy is a complete USB-based microcontroller development system, in a very small footprint, capable of implementing many types of projects. All programming is done via the USB port. No special programmer is needed, only a standard "Mini-B" USB cable and a PC or Macintosh with a USB port. + Boards ------ diff --git a/docs/platforms/teensy.rst b/docs/platforms/teensy.rst index 29dbc2b0..02e0c732 100644 --- a/docs/platforms/teensy.rst +++ b/docs/platforms/teensy.rst @@ -17,21 +17,24 @@ Packages * - Name - Contents + * - ``framework-arduinoteensy`` + - `Arduino Wiring-based Framework `_ + + * - ``tool-teensy`` + - `Teensy Loader `_ + + * - ``toolchain-gccarmnoneeabi`` + - `gcc-arm-embedded `_, `GDB `_ + + * - ``framework-mbed`` + - `mbed Framework `_ + * - ``toolchain-atmelavr`` - `avr-gcc `_, `GDB `_, `AVaRICE `_, `SimulAVR `_ * - ``ldscripts`` - `Linker Scripts `_ - * - ``framework-arduinoteensy`` - - `Arduino Wiring-based Framework `_ - - * - ``toolchain-gccarmnoneeabi`` - - `gcc-arm-embedded `_, `GDB `_ - - * - ``tool-teensy`` - - `Teensy Loader `_ - .. warning:: **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). @@ -52,6 +55,9 @@ Frameworks * - :ref:`framework_arduino` - Arduino Framework allows writing cross-platform software to control devices attached to a wide range of Arduino boards to create all kinds of creative coding, interactive objects, spaces or physical experiences. + * - :ref:`framework_mbed` + - The mbed framework The mbed SDK has been designed to provide enough hardware abstraction to be intuitive and concise, yet powerful enough to build complex projects. It is built on the low-level ARM CMSIS APIs, allowing you to code down to the metal if needed. In addition to RTOS, USB and Networking libraries, a cookbook of hundreds of reusable peripheral and module libraries have been built on top of the SDK by the mbed Developer Community. + Boards ------ diff --git a/platformio/platforms/teensy.py b/platformio/platforms/teensy.py index 07316d15..3ebc4002 100644 --- a/platformio/platforms/teensy.py +++ b/platformio/platforms/teensy.py @@ -35,6 +35,10 @@ class TeensyPlatform(BasePlatform): "default": True }, + "framework-mbed": { + "default": True + }, + "tool-teensy": { "alias": "uploader", "default": True From f758d8607a529cf60e7b33f3b8114f0804f2d0eb Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 12 Oct 2015 16:29:24 +0100 Subject: [PATCH 11/16] Use teensy CLI loader for upload of .hex files on OSX // Resolve #306 --- HISTORY.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 1e4480cf..4a50f1ee 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -9,6 +9,8 @@ PlatformIO 2.0 * Added support for ubIQio Ardhat board (`pull #302 `_) +* Use Teensy CLI Loader for upload of .hex files on Mac OS X + (`issue #306 `_) * Fixed missing of `framework-mbed `_ package for `teensy `_ platform From de2d6818c1d4a1e02d1e8540e6929f80966eaa4e Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 13 Oct 2015 14:01:16 +0100 Subject: [PATCH 12/16] Full support of CLion IDE including code auto-completion // Resolve #132 --- HISTORY.rst | 3 + docs/ide/clion.rst | 16 +++- docs/quickstart.rst | 4 +- docs/userguide/cmd_init.rst | 8 +- examples/ide/clion/.idea/clion.iml | 4 +- examples/ide/clion/.idea/workspace.xml | 93 +++++++------------ examples/ide/clion/CMakeLists.txt | 11 ++- platformio/__init__.py | 2 +- platformio/commands/init.py | 2 +- platformio/ide/projectgenerator.py | 25 ++++- .../ide/tpls/clion/.idea/workspace.xml.tpl | 2 +- platformio/ide/tpls/clion/CMakeLists.txt.tpl | 14 ++- .../ide/tpls/qtcreator/platformio.pro.tpl | 2 +- .../platformio.vcxproj.filters.tpl | 2 +- .../tpls/visualstudio/platformio.vcxproj.tpl | 2 +- 15 files changed, 105 insertions(+), 85 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 4a50f1ee..b757ec66 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,9 @@ PlatformIO 2.0 2.3.4 (2015-10-??) ~~~~~~~~~~~~~~~~~~ +* Full support of `CLion IDE `_ + including code auto-completion + (`issue #132 `_) * Added support for ubIQio Ardhat board (`pull #302 `_) * Use Teensy CLI Loader for upload of .hex files on Mac OS X diff --git a/docs/ide/clion.rst b/docs/ide/clion.rst index 5353fd06..8e1093ae 100644 --- a/docs/ide/clion.rst +++ b/docs/ide/clion.rst @@ -47,11 +47,19 @@ There are 3 predefined targets for building: * ``PLATFORMIO_CLEAN`` - clean compiled objects and etc. .. warning:: - CLion is still in the development stage, so some of the features (like, - auto-complete) probably will not work with PlatformIO. See - `CLion issue #CPP-3977 `_. + PlatformIO generates empty project by default and **code auto-completion + will not work!** To enable auto-completion please choose one of: - Active discussion located in + * Add source files ``*.c, *.cpp, etc`` to ``src`` directory and re-initialize + project with command above + * Manually correct ``add_executable`` command in ``CMakeLists.txt`` file + (will be created in project directory after initialization). + + ``*.ino`` file isn't acceptable for ``add_executable`` command. You should + convert it manually to ``*.cpp``. See `project example `_. + + More info `CLion issue #CPP-3977 `_. + Active discussion is located in `PlatformIO issue #132 `_. Screenshot diff --git a/docs/quickstart.rst b/docs/quickstart.rst index a4d5864a..7ef08e6d 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -28,7 +28,7 @@ Quickstart The next files/directories will be created in *** platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| - src - Put your source code here + src - Put your source files here lib - Put here project specific (private) libraries Do you want to continue? [y/N]: y Project has been successfully initialized! @@ -37,7 +37,7 @@ Quickstart `platformio run --target upload` or `platformio run -t upload` - upload firmware to embedded board `platformio run --target clean` - clean project (remove compiled files) -Put your source code ``*.h, *.c, *.cpp or *.ino`` files to ``src`` directory. +Put your source files ``*.h, *.c, *.cpp or *.ino`` to ``src`` directory. 4. Process the project's environments. diff --git a/docs/userguide/cmd_init.rst b/docs/userguide/cmd_init.rst index 29fedc47..88be4447 100644 --- a/docs/userguide/cmd_init.rst +++ b/docs/userguide/cmd_init.rst @@ -22,7 +22,7 @@ Initialize new PlatformIO based project. This command will create: * :ref:`projectconf` -* ``src`` - a source directory. Put your source code here +* ``src`` - a source directory. Put your source files here * ``lib`` - a directory for the project specific (private) libraries. PlatformIO will compile them to static libraries and link to executable file @@ -94,7 +94,7 @@ Examples The next files/directories will be created in *** platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| - src - Put your source code here + src - Put your source files here lib - Put here project specific (private) libraries Do you want to continue? [y/N]: y Project has been successfully initialized! @@ -112,7 +112,7 @@ Examples The next files/directories will be created in *** platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| - src - Put your source code here + src - Put your source files here lib - Put here project specific (private) libraries Do you want to continue? [y/N]: y Project has been successfully initialized! @@ -136,7 +136,7 @@ Examples The next files/directories will be created in *** platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| - src - Put your source code here + src - Put your source files here lib - Put here project specific (private) libraries Do you want to continue? [y/N]: y Project has been successfully initialized! diff --git a/examples/ide/clion/.idea/clion.iml b/examples/ide/clion/.idea/clion.iml index 352882ec..bc2cd874 100644 --- a/examples/ide/clion/.idea/clion.iml +++ b/examples/ide/clion/.idea/clion.iml @@ -1,9 +1,7 @@ - - - + diff --git a/examples/ide/clion/.idea/workspace.xml b/examples/ide/clion/.idea/workspace.xml index 214a2cba..95694b4f 100644 --- a/examples/ide/clion/.idea/workspace.xml +++ b/examples/ide/clion/.idea/workspace.xml @@ -2,13 +2,13 @@ - - - - - - - + + + + + + + @@ -33,25 +33,25 @@ - + - - + + - - + + - + @@ -67,8 +67,8 @@ - @@ -116,13 +116,13 @@ - - + + @@ -173,15 +173,15 @@ - + - + - + @@ -206,27 +206,27 @@ - + - - - - - - - - + + + + + + + + - - - + + + @@ -240,35 +240,12 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ide/clion/CMakeLists.txt b/examples/ide/clion/CMakeLists.txt index 06cc9517..19d9e858 100644 --- a/examples/ide/clion/CMakeLists.txt +++ b/examples/ide/clion/CMakeLists.txt @@ -1,7 +1,8 @@ cmake_minimum_required(VERSION 3.2) -project(PlatformIO) +project(clion) -set(PLATFORMIO_CMD platformio) +set(ENV{PATH} "/Volumes/SOFT/Projects/GitHub/platformio/origin/.tox/develop/bin:/usr/local/opt/pyenv/shims:/Users/ikravets/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin") +set(PLATFORMIO_CMD "/Volumes/SOFT/Projects/GitHub/platformio/origin/.tox/develop/bin/platformio") include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoavr/variants/standard") include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoavr/cores/arduino") @@ -14,7 +15,7 @@ add_definitions(-DF_CPU=16000000L) add_definitions(-DARDUINO_ARCH_AVR) add_definitions(-DARDUINO_AVR_UNO) add_definitions(-DARDUINO=10605) -add_definitions(-DPLATFORMIO=020300) +add_definitions(-DPLATFORMIO=020304) add_definitions(-D__AVR_ATmega328P__) add_custom_target( @@ -33,4 +34,6 @@ add_custom_target( PLATFORMIO_CLEAN ALL COMMAND ${PLATFORMIO_CMD} -f -c clion run --target clean WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) \ No newline at end of file +) + +add_executable(clion src/blink.cpp) diff --git a/platformio/__init__.py b/platformio/__init__.py index 51ef87aa..33ac68f2 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 3, "4.dev1") +VERSION = (2, 3, "4.dev2") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/commands/init.py b/platformio/commands/init.py index 319f79b3..c558fcd5 100644 --- a/platformio/commands/init.py +++ b/platformio/commands/init.py @@ -65,7 +65,7 @@ def cli(ctx, project_dir, board, ide, # pylint: disable=R0913 click.style(project_dir, fg="cyan")) click.echo("%s - Project Configuration File. |-> PLEASE EDIT ME <-|" % click.style("platformio.ini", fg="cyan")) - click.echo("%s - Put your source code here" % + click.echo("%s - Put your source files here" % click.style("src", fg="cyan")) click.echo("%s - Put here project specific (private) libraries" % click.style("lib", fg="cyan")) diff --git a/platformio/ide/projectgenerator.py b/platformio/ide/projectgenerator.py index 6597b41d..a66bda87 100644 --- a/platformio/ide/projectgenerator.py +++ b/platformio/ide/projectgenerator.py @@ -7,6 +7,7 @@ import re from os.path import abspath, basename, expanduser, isdir, join, relpath import bottle +import click from platformio import util @@ -72,7 +73,7 @@ class ProjectGenerator(object): def get_project_name(self): return basename(self.project_dir) - def get_srcfiles(self): + def get_src_files(self): result = [] with util.cd(self.project_dir): for root, _, files in os.walk(util.get_projectsrc_dir()): @@ -80,6 +81,14 @@ class ProjectGenerator(object): result.append(relpath(join(root, f))) return result + @staticmethod + def get_main_src_file(src_files): + for f in src_files: + for ext in ("c", "cpp"): + if f.endswith(".%s" % ext): + return f + return None + def get_tpls(self): tpls = [] tpls_dir = join(util.get_source_dir(), "ide", "tpls", self.ide) @@ -112,11 +121,23 @@ class ProjectGenerator(object): return bottle.template(content, **self._tplvars) def _gather_tplvars(self): + src_files = self.get_src_files() + main_src_file = self.get_main_src_file(src_files) + + if not main_src_file and self.ide == "clion": + click.secho( + "Warning! Can not find main source file (*.c, *.cpp). So, " + "code auto-completion is disabled. Please add source files " + "to `src` directory and re-initialize project or edit " + "`CMakeLists.txt` file manually (`add_executable` command).", + fg="yellow") + self._tplvars.update(self.get_project_env()) self._tplvars.update(self.get_project_build_data()) self._tplvars.update({ "project_name": self.get_project_name(), - "srcfiles": self.get_srcfiles(), + "src_files": src_files, + "main_src_file": main_src_file, "user_home_dir": abspath(expanduser("~")), "project_dir": self.project_dir, "systype": util.get_systype(), diff --git a/platformio/ide/tpls/clion/.idea/workspace.xml.tpl b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl index 04b41db6..d76300c8 100644 --- a/platformio/ide/tpls/clion/.idea/workspace.xml.tpl +++ b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl @@ -47,7 +47,7 @@ - % for file in srcfiles: + % for file in src_files: diff --git a/platformio/ide/tpls/clion/CMakeLists.txt.tpl b/platformio/ide/tpls/clion/CMakeLists.txt.tpl index b8e7ed62..680805a1 100644 --- a/platformio/ide/tpls/clion/CMakeLists.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeLists.txt.tpl @@ -8,7 +8,7 @@ set(PLATFORMIO_CMD "{{platformio_path}}") % if include.startswith(user_home_dir): include_directories("$ENV{HOME}{{include.replace(user_home_dir, '').replace("\\", "/")}}") % else: -include_directories("{{include}}") +include_directories("{{include.replace("\\", "/")}}") % end % end @@ -32,4 +32,14 @@ add_custom_target( PLATFORMIO_CLEAN ALL COMMAND ${PLATFORMIO_CMD} -f -c clion run --target clean WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) \ No newline at end of file +) + +% if main_src_file: +add_executable({{project_name}} {{main_src_file}}) +% else: +# +# To enable code auto-completion, please specify path +# to main source file (*.c, *.cpp) and uncomment line below +# +# add_executable({{project_name}} src/main_change_me.cpp) +% end diff --git a/platformio/ide/tpls/qtcreator/platformio.pro.tpl b/platformio/ide/tpls/qtcreator/platformio.pro.tpl index a173ed07..b33b91cf 100644 --- a/platformio/ide/tpls/qtcreator/platformio.pro.tpl +++ b/platformio/ide/tpls/qtcreator/platformio.pro.tpl @@ -21,6 +21,6 @@ OTHER_FILES += \ platformio.ini SOURCES += \ - % for file in srcfiles: + % for file in src_files: {{file}} % end diff --git a/platformio/ide/tpls/visualstudio/platformio.vcxproj.filters.tpl b/platformio/ide/tpls/visualstudio/platformio.vcxproj.filters.tpl index 716218f9..d66bb4be 100644 --- a/platformio/ide/tpls/visualstudio/platformio.vcxproj.filters.tpl +++ b/platformio/ide/tpls/visualstudio/platformio.vcxproj.filters.tpl @@ -13,7 +13,7 @@ - % for file in srcfiles: + % for file in src_files: % if any([file.endswith(".%s" % e) for e in ("h", "hh", "hpp", "inc")]): diff --git a/platformio/ide/tpls/visualstudio/platformio.vcxproj.tpl b/platformio/ide/tpls/visualstudio/platformio.vcxproj.tpl index c0201b39..b27a7ab2 100644 --- a/platformio/ide/tpls/visualstudio/platformio.vcxproj.tpl +++ b/platformio/ide/tpls/visualstudio/platformio.vcxproj.tpl @@ -58,7 +58,7 @@ - % for file in srcfiles: + % for file in src_files: % if any([file.endswith(".%s" % e) for e in ("h", "hh", "hpp", "inc")]): From 177353bf7a15d63ca43ea449f2eb41a29ae54b6c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 13 Oct 2015 17:44:28 +0100 Subject: [PATCH 13/16] PlatformIO command completion in Terminal for bash and zsh // Resolve #290 --- HISTORY.rst | 1 + docs/faq.rst | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index b757ec66..997e6059 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -10,6 +10,7 @@ PlatformIO 2.0 * Full support of `CLion IDE `_ including code auto-completion (`issue #132 `_) +* PlatformIO `command completion in Terminal `_ for ``bash`` and ``zsh`` * Added support for ubIQio Ardhat board (`pull #302 `_) * Use Teensy CLI Loader for upload of .hex files on Mac OS X diff --git a/docs/faq.rst b/docs/faq.rst index 8a7fc30d..bdbec42a 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -56,8 +56,8 @@ the project developed using PlatformIO is as follows: * Users develop code and PlatformIO makes sure that it is compiled, prepared and uploaded to all the boards of interest. -Commands completion in Terminal -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Command completion in Terminal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bash completion ''''''''''''''' @@ -69,6 +69,21 @@ Bash completion for `platformio` subcommands you need to put into your `.bashrc` eval "$(_PLATFORMIO_COMPLETE=source platformio)" +ZSH completion +'''''''''''''' + +To enable ``zsh`` completion please run these commands: + +.. code-block: bash + + autoload bashcompinit && bashcompinit + eval "$(_PLATFORMIO_COMPLETE=source platformio)" + +.. note:: + + For permanent command completion you need to place commands above to + ``~/.bashrc`` or ``~/.zshrc`` file. + .. _faq_troubleshooting: Troubleshooting @@ -89,6 +104,9 @@ Try these solutions: [sudo] pip uninstall scons [sudo] pip install scons + # if you have "error: option --single-version-externally-managed not recognized", then + [sudo] pip install --egg scons + 2. Install PlatformIO using :ref:`installation_installer_script`. .. _faq_troubleshooting_sconssingverextmanaged: From b183431c277a644725955eef1e615b483f3edea3 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 13 Oct 2015 18:24:40 +0100 Subject: [PATCH 14/16] Install SCons automatically and avoid `error: option --single-version-externally-managed not recognized` --- HISTORY.rst | 4 ++- platformio/__init__.py | 2 +- platformio/platforms/base.py | 37 +------------------------ platformio/util.py | 53 ++++++++++++++++++++++++++++++++++-- setup.py | 25 +++++++++++------ 5 files changed, 72 insertions(+), 49 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 997e6059..49771c84 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -13,9 +13,11 @@ PlatformIO 2.0 * PlatformIO `command completion in Terminal `_ for ``bash`` and ``zsh`` * Added support for ubIQio Ardhat board (`pull #302 `_) +* Install SCons automatically and avoid ``error: option --single-version-externally-managed not recognized`` + (`issue #279 `_) * Use Teensy CLI Loader for upload of .hex files on Mac OS X (`issue #306 `_) -* Fixed missing of `framework-mbed `_ +* Fixed missing `framework-mbed `_ package for `teensy `_ platform (`issue #305 `_) diff --git a/platformio/__init__.py b/platformio/__init__.py index 33ac68f2..fffd186e 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 3, "4.dev2") +VERSION = (2, 3, "4.dev3") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/platforms/base.py b/platformio/platforms/base.py index ddc21a5b..21866942 100644 --- a/platformio/platforms/base.py +++ b/platformio/platforms/base.py @@ -3,8 +3,6 @@ import os import re -import sys -from glob import glob from imp import load_source from os.path import isdir, isfile, join @@ -374,7 +372,7 @@ class BasePlatform(object): self._found_error = False try: # test that SCons is installed correctly - assert self.test_scons() + assert util.test_scons() result = util.exec_command( [ @@ -397,39 +395,6 @@ class BasePlatform(object): return result - @staticmethod - def test_scons(): - try: - r = util.exec_command(["scons", "--version"]) - if "ImportError: No module named SCons.Script" in r['err']: - _PYTHONPATH = [] - for p in sys.path: - if not p.endswith("-packages"): - continue - for item in glob(join(p, "scons*")): - if isdir(join(item, "SCons")) and item not in sys.path: - _PYTHONPATH.append(item) - sys.path.insert(0, item) - if _PYTHONPATH: - _PYTHONPATH = str(os.pathsep).join(_PYTHONPATH) - if os.getenv("PYTHONPATH"): - os.environ['PYTHONPATH'] += os.pathsep + _PYTHONPATH - else: - os.environ['PYTHONPATH'] = _PYTHONPATH - r = util.exec_command(["scons", "--version"]) - assert r['returncode'] == 0 - return True - except (OSError, AssertionError): - for p in sys.path: - try: - r = util.exec_command([join(p, "scons"), "--version"]) - assert r['returncode'] == 0 - os.environ['PATH'] += os.pathsep + p - return True - except (OSError, AssertionError): - pass - return False - def on_run_out(self, line): self._echo_line(line, level=3) diff --git a/platformio/util.py b/platformio/util.py index fa71848b..e9f5efe6 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -7,13 +7,13 @@ import json import os import re import subprocess +import sys +from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, join, realpath) from platform import system, uname from threading import Thread -import requests - from platformio import __apiurl__, __version__, exception try: @@ -277,12 +277,14 @@ def get_logicaldisks(): def get_request_defheaders(): + import requests return {"User-Agent": "PlatformIO/%s CI/%d %s" % ( __version__, int(is_ci()), requests.utils.default_user_agent() )} def get_api_result(path, params=None, data=None): + import requests result = None r = None @@ -312,6 +314,53 @@ def get_api_result(path, params=None, data=None): return result +def test_scons(): + try: + r = exec_command(["scons", "--version"]) + if "ImportError: No module named SCons.Script" in r['err']: + _PYTHONPATH = [] + for p in sys.path: + if not p.endswith("-packages"): + continue + for item in glob(join(p, "scons*")): + if isdir(join(item, "SCons")) and item not in sys.path: + _PYTHONPATH.append(item) + sys.path.insert(0, item) + if _PYTHONPATH: + _PYTHONPATH = str(os.pathsep).join(_PYTHONPATH) + if os.getenv("PYTHONPATH"): + os.environ['PYTHONPATH'] += os.pathsep + _PYTHONPATH + else: + os.environ['PYTHONPATH'] = _PYTHONPATH + r = exec_command(["scons", "--version"]) + assert r['returncode'] == 0 + return True + except (OSError, AssertionError): + for p in sys.path: + try: + r = exec_command([join(p, "scons"), "--version"]) + assert r['returncode'] == 0 + os.environ['PATH'] += os.pathsep + p + return True + except (OSError, AssertionError): + pass + return False + + +def install_scons(): + r = exec_command(["pip", "install", "-U", "scons"]) + if r['returncode'] != 0: + r = exec_command(["pip", "install", "--egg", "scons"]) + return r['returncode'] == 0 + + +def scons_in_pip(): + r = exec_command(["pip", "list"]) + if r['returncode'] != 0: + return False + return "scons (" in r['out'].lower() + + @memoized def _lookup_boards(): boards = {} diff --git a/setup.py b/setup.py index 668ada4a..35d674df 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,21 @@ from platform import system from setuptools import find_packages, setup from platformio import (__author__, __description__, __email__, __license__, - __title__, __url__, __version__) + __title__, __url__, __version__, util) + +install_requires = [ + "bottle", + "click>=3.2", + "lockfile>=0.9.1", + "pyserial<3", + "requests>=2.4.0" +] + +if system() == "Windows": + install_requires.append("colorama") + +if (not util.test_scons() and not util.install_scons()) or util.scons_in_pip(): + install_requires.append("scons") setup( name=__title__, @@ -17,14 +31,7 @@ setup( author_email=__email__, url=__url__, license=__license__, - install_requires=[ - "bottle", - "click>=3.2", - "lockfile>=0.9.1", - "pyserial", - "requests>=2.4.0", - "SCons" - ] + (["colorama"] if system() == "Windows" else []), + install_requires=install_requires, packages=find_packages(), package_data={ "platformio": [ From c07e957e28fd50a378bb6fd94a5f13e6cf8b85c5 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 13 Oct 2015 18:36:37 +0100 Subject: [PATCH 15/16] Fix FAQ doc --- docs/faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/faq.rst b/docs/faq.rst index bdbec42a..833eb024 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -74,7 +74,7 @@ ZSH completion To enable ``zsh`` completion please run these commands: -.. code-block: bash +.. code-block:: bash autoload bashcompinit && bashcompinit eval "$(_PLATFORMIO_COMPLETE=source platformio)" From b7d261965156fc2034eb8095ae93efd21e55222e Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 13 Oct 2015 18:40:23 +0100 Subject: [PATCH 16/16] Version bump to 2.3.4 (issues #132, #279, #290, #302, #305, #306) --- HISTORY.rst | 2 +- platformio/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 49771c84..8cf78a3a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,7 @@ Release History PlatformIO 2.0 -------------- -2.3.4 (2015-10-??) +2.3.4 (2015-10-13) ~~~~~~~~~~~~~~~~~~ * Full support of `CLion IDE `_ diff --git a/platformio/__init__.py b/platformio/__init__.py index fffd186e..7243c4ee 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 3, "4.dev3") +VERSION = (2, 3, 4) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio"