diff --git a/HISTORY.rst b/HISTORY.rst index 3c4a5f7d..8cf78a3a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,24 @@ Release History PlatformIO 2.0 -------------- +2.3.4 (2015-10-13) +~~~~~~~~~~~~~~~~~~ + +* 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 `_) +* 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 `framework-mbed `_ + package for `teensy `_ + platform + (`issue #305 `_) + 2.3.3 (2015-10-02) ~~~~~~~~~~~~~~~~~~ diff --git a/README.rst b/README.rst index bc7998be..e27d5901 100644 --- a/README.rst +++ b/README.rst @@ -31,12 +31,13 @@ PlatformIO `Home & Demo `_ | `Project Examples `_ | -`Code `_ | +`Source Code `_ | `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 diff --git a/docs/faq.rst b/docs/faq.rst index 8aa0bd0c..833eb024 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -24,13 +24,14 @@ 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 -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: @@ -55,6 +56,34 @@ 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. +Command 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)" + +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 @@ -75,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: 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/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/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/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 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 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/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 33f6ab52..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, 3) +VERSION = (2, 3, 4) __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", 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/commands/run.py b/platformio/commands/run.py index daf6ae41..11a16325 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -36,13 +36,19 @@ 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: - _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(): @@ -221,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 84b6aca0..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): @@ -104,17 +104,23 @@ 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 CleanPioenvsDirError(PlatformioException): + + MESSAGE = "Can not remove temporary directory `%s`. "\ + "Please remove it manually" class GetSerialPortsError(PlatformioException): @@ -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." - ) 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")]): 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) 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/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 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/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 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": [