diff --git a/HISTORY.rst b/HISTORY.rst index 80c773e5..57d5783a 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,7 +1,25 @@ Release History =============== -1.0.0 (2015-02-27) +1.1.0 (2015-03-05) +------------------ + +* Implemented ``PLATFORMIO_*`` environment variables + (`issue #102 `_) +* Added support for *SainSmart* boards to + `atmelsam `__ + development platform +* Added + `Project Configuration `__ + option named `envs_dir `__ +* Disabled "prompts" automatically for *Continuous Integration* systems + (`issue #103 `_) +* Fixed firmware uploading for + `atmelavr `__ + boards which work within ``usbtiny`` protocol +* Fixed uploading for *Digispark* board (`issue #106 `_) + +1.0.1 (2015-02-27) ------------------ **PlatformIO 1.0 - recommended for production** @@ -219,7 +237,7 @@ Release History `srcbuild_flags `_ environment option * Allowed to override some of settings via system environment variables - such as: ``$PIOSRCBUILD_FLAGS`` and ``$PIOENVS_DIR`` + such as: ``PLATFORMIO_SRCBUILD_FLAGS`` and ``PLATFORMIO_ENVS_DIR`` * Added ``--upload-port`` option for `platformio run `__ command * Implemented (especially for `SmartAnthill `_) `platformio run -t uploadlazy `_ diff --git a/docs/envvars.rst b/docs/envvars.rst new file mode 100644 index 00000000..ec8fd586 --- /dev/null +++ b/docs/envvars.rst @@ -0,0 +1,120 @@ +.. _envvars: + +Environment variables +===================== + +`Environment variables `_ +are a set of dynamic named values that can affect the way running processes +will behave on a computer. + +*PlatformIO* handles variables which start with ``PLATFORMIO_`` prefix. They +have the **HIGHEST PRIORITY**. + +.. contents:: + +General +------- + +PlatformIO uses *General* environment variables for the common +operations/commands. + +.. _envvar_CI: + +CI +~~ + +PlatformIO handles ``CI`` variable which is setup by +`Continuous Integration `_ +(Travis, Circle and etc.) systems. +Currently, PlatformIO uses it to disable prompts. + +In other words, ``CI=true`` automatically setup +:ref:`PLATFORMIO_SETTING_ENABLE_PROMPTS=false `. + +.. _envvar_PLATFORMIO_HOME_DIR: + +PLATFORMIO_HOME_DIR +~~~~~~~~~~~~~~~~~~~ + +Allows to override :ref:`projectconf` option +:ref:`projectconf_pio_home_dir`. + +.. _envvar_PLATFORMIO_LIB_DIR: + +PLATFORMIO_LIB_DIR +~~~~~~~~~~~~~~~~~~ + +Allows to override :ref:`projectconf` option +:ref:`projectconf_pio_lib_dir`. + +.. _envvar_PLATFORMIO_SRC_DIR: + +PLATFORMIO_SRC_DIR +~~~~~~~~~~~~~~~~~~ + +Allows to override :ref:`projectconf` option +:ref:`projectconf_pio_src_dir`. + +.. _envvar_PLATFORMIO_ENVS_DIR: + +PLATFORMIO_ENVS_DIR +~~~~~~~~~~~~~~~~~~~ + +Allows to override :ref:`projectconf` option +:ref:`projectconf_pio_envs_dir`. + + +Builder +------- + +.. _envvar_PLATFORMIO_SRCBUILD_FLAGS: + +PLATFORMIO_SRCBUILD_FLAGS +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override :ref:`projectconf` option +:ref:`projectconf_srcbuild_flags`. + +Settings +-------- + +Allows to override PlatformIO settings. You can manage them via +:ref:`cmd_settings` command. + + +PLATFORMIO_SETTING_AUTO_UPDATE_LIBRARIES +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`auto_update_libraries`. + +PLATFORMIO_SETTING_AUTO_UPDATE_PLATFORMS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`auto_update_platforms`. + +PLATFORMIO_SETTING_CHECK_LIBRARIES_INTERVAL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`check_libraries_interval`. + +PLATFORMIO_SETTING_CHECK_PLATFORMIO_INTERVAL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`check_platformio_interval`. + +PLATFORMIO_SETTING_CHECK_PLATFORMS_INTERVAL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`check_platforms_interval`. + +.. _envvar_PLATFORMIO_SETTING_ENABLE_PROMPTS: + +PLATFORMIO_SETTING_ENABLE_PROMPTS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`enable_prompts`. + +PLATFORMIO_SETTING_ENABLE_TELEMETRY +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Allows to override setting :option:`enable_telemetry`. diff --git a/docs/index.rst b/docs/index.rst index f0b272f2..3f7bd777 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -57,6 +57,7 @@ Contents quickstart installation projectconf + envvars platforms/index librarymanager/index userguide/index diff --git a/docs/installation.rst b/docs/installation.rst index bd860f10..d4a4b61a 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -30,9 +30,14 @@ application: application. .. warning:: - If you are going to use *PlatformIO* for "*Cloud Compiling*", please - don't forget to turn off :ref:`enable_prompts ` setting. It - will allow you to avoid blocking when call ``platformio`` like subprocess. + 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 environment variable :ref:`PLATFORMIO_SETTING_ENABLE_PROMPTS=No ` + - disable global setting ``enable_prompts`` via :ref:`cmd_settings` command + - masking under Continuous Integration system via environment variable + :ref:`CI=true `. Please *choose one of* the following: diff --git a/docs/platforms/atmelsam.rst b/docs/platforms/atmelsam.rst index 9070424f..14363615 100644 --- a/docs/platforms/atmelsam.rst +++ b/docs/platforms/atmelsam.rst @@ -70,7 +70,13 @@ Boards - Flash - RAM * - ``due`` - - `Arduino Due `_ + - `Arduino Due (Programming Port) `_ + - at91sam3x8e ``cortex-m3`` + - 84 MHz ``84000000L`` + - 512 Kb + - 32 Kb + * - ``dueUSB`` + - `Arduino Due (USB Native Port) `_ - at91sam3x8e ``cortex-m3`` - 84 MHz ``84000000L`` - 512 Kb @@ -81,6 +87,18 @@ Boards - 84 MHz ``84000000L`` - 512 kb - 32 Kb + * - ``sainSmartDue`` + - `SainSmart Due (Programming Port) `_ + - at91sam3x8e ``cortex-m3`` + - 84 MHz ``84000000L`` + - 512 Kb + - 32 Kb + * - ``sainSmartDueUSB`` + - `SainSmart Due (USB Native Port) `_ + - at91sam3x8e ``cortex-m3`` + - 84 MHz ``84000000L`` + - 512 Kb + - 32 Kb More detailed information you can find here `Atmel SMART ARM-based MCUs `_. diff --git a/docs/platforms/index.rst b/docs/platforms/index.rst index fa6d03a9..5aa06bcc 100644 --- a/docs/platforms/index.rst +++ b/docs/platforms/index.rst @@ -17,7 +17,7 @@ MCU, upload protocol or etc. Please use ``board`` option. atmelavr atmelsam stm32 + teensy timsp430 titiva - teensy creating_platform diff --git a/docs/projectconf.rst b/docs/projectconf.rst index 6f531002..bf741fe4 100644 --- a/docs/projectconf.rst +++ b/docs/projectconf.rst @@ -1,7 +1,7 @@ .. _projectconf: -Project Configuration File -========================== +Project Configuration File ``platformio.ini`` +============================================= The Project configuration file is named ``platformio.ini``. This is a `INI-style `_ file. @@ -33,11 +33,18 @@ Options ``home_dir`` ^^^^^^^^^^^^ -A ``$PIO_HOME_DIR`` is used to store platform tool chains, frameworks, -external libraries, service data and etc. +Is used to store platform tool chains, frameworks, external libraries, +service data and etc. -A default value is user's home directory: *Unix* - ``~/.platformio``, -Windows - ``%HOMEPATH%\.platformio``. +A default value is User's home directory: + +* Unix ``~/.platformio`` +* Windows ``%HOMEPATH%\.platformio`` + +This option can be overridden by global environment variable +:ref:`envvar_PLATFORMIO_HOME_DIR`. + +.. _projectconf_pio_lib_dir: ``lib_dir`` ^^^^^^^^^^^ @@ -45,21 +52,53 @@ Windows - ``%HOMEPATH%\.platformio``. This directory is used to store external libraries downloaded by :ref:`librarymanager`. -A default value is ``$PIO_HOME_DIR/lib``. +A default value is ``%home_dir%/lib``. + +This option can be overridden by global environment variable +:ref:`envvar_PLATFORMIO_LIB_DIR`. + +.. _projectconf_pio_src_dir: ``src_dir`` ^^^^^^^^^^^ -The path to project's source directory. PlatformIO uses it for :ref:`cmd_run` +A path to project's source directory. PlatformIO uses it for :ref:`cmd_run` command. -A default value is ``$PROJECT_DIR/src``. +A default value is ``%project_dir%/src``. + +This option can be overridden by global environment variable +:ref:`envvar_PLATFORMIO_SRC_DIR`. .. note:: This option is useful for people who migrate from Arduino/Energia IDEs where source directory should have the same name like the main source file. See `example `__ project with own source directory. +.. _projectconf_pio_envs_dir: + +``envs_dir`` +^^^^^^^^^^^^ + +*PlatformIO Builder* within :ref:`cmd_run` command uses this folder for project +environments to store compiled object files, static libraries, firmwares and +other cached information. It allows PlatformIO to build source code extremely +fast! + +*You can delete this folder without any risk!* If you modify :ref:`projectconf`, +then PlatformIO will remove this folder automatically. It will be created on the +next build operation. + +A default value is ``%project_dir%/.pioenvs``. + +This option can be overridden by global environment variable +:ref:`envvar_PLATFORMIO_ENVS_DIR`. + +.. note:: + If you have any problems with building your Project environmets which + are defined in :ref:`projectconf`, then **TRY TO DELETE** this folder. In + this situation you will remove all cached files without any risk. + [env:NAME] ---------- @@ -99,7 +138,7 @@ See ``framework`` type in *Frameworks* section of :ref:`platforms` ``board`` ^^^^^^^^^ -*PlatformIO* has pre-configured settings for most popular boards. You don't +*PlatformIO* has pre-configured settings for the most popular boards. You don't need to specify ``board_mcu``, ``board_f_cpu``, ``upload_protocol`` or ``upload_speed`` options. Just define a ``board`` type and *PlatformIO* will pre-fill options described above with appropriate values. @@ -115,8 +154,8 @@ recognize MCU architecture. The correct type of ``board_mcu`` depends on platform library. For example, the list of ``board_mcu`` for "megaAVR Devices" is described `here `_. -The full list of ``board_mcu`` for popular embedded platforms you can find in -*Boards* section of :ref:`platforms`. See "Microcontroller" column. +The full list of ``board_mcu`` for the popular embedded platforms you can find +in *Boards* section of :ref:`platforms`. See "Microcontroller" column. ``board_f_cpu`` @@ -126,21 +165,21 @@ An option ``board_f_cpu`` is used to define MCU frequency (Hertz, Clock). A format of this option is ``C-like long integer`` value with ``L`` suffix. The 1 Hertz is equal to ``1L``, then 16 Mhz (Mega Hertz) is equal to ``16000000L``. -The full list of ``board_f_cpu`` for popular embedded platforms you can find in -*Boards* section of :ref:`platforms`. See "Frequency" column. +The full list of ``board_f_cpu`` for the popular embedded platforms you can +find in *Boards* section of :ref:`platforms`. See "Frequency" column. ``upload_port`` ^^^^^^^^^^^^^^^ -This option is used by "uploader" tool to send firmware to the board via +This option is used by "uploader" tool when sending firmware to board via ``upload_port``. For example, * ``/dev/ttyUSB0`` - Unix-based OS * ``COM3`` - Windows OS -If ``upload_port`` isn't specified, then *PlatformIO* will try to detect -``upload_port`` automatically. +If ``upload_port`` isn't specified, then *PlatformIO* will try to detect it +automatically. To print all available serial ports use :ref:`cmd_serialports` command. @@ -155,7 +194,7 @@ A protocol that "uploader" tool uses to talk to the board. ^^^^^^^^^^^^^^^^ A connection speed (`baud rate `_) -which "uploader" tool uses when sending firmware to the board. +which "uploader" tool uses when sending firmware to board. ``targets`` @@ -256,12 +295,17 @@ For more detailed information about available flags/options go to: * `Options for Directory Search `_ +.. _projectconf_srcbuild_flags: ``srcbuild_flags`` ^^^^^^^^^^^^^^^^^^ -This is option ``srcbuild_flags`` has the same behaviour like ``build_flags`` -but will be applied only for project source code from ``src`` directory. +An option ``srcbuild_flags`` has the same behaviour like ``build_flags`` +but will be applied only for the project source code from +:ref:`projectconf_pio_src_dir` directory. + +This option can be overridden by global environment variable +:ref:`envvar_PLATFORMIO_SRCBUILD_FLAGS`. ``ignore_libs`` ^^^^^^^^^^^^^^^ @@ -281,6 +325,10 @@ Example: Examples -------- +.. note:: + A full list with project examples can be found in + `PlatformIO Repository `_. + 1. :ref:`platform_atmelavr`: Arduino UNO board with auto pre-configured ``board_*`` and ``upload_*`` options (use only ``board`` option) and Arduino Wiring-based Framework diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 1ad7e264..16e20e36 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -58,8 +58,7 @@ Change working directory to the project's root where is located If you don't have installed required platforms, then *PlatformIO* will propose you to install them automatically. -Further examples can be found in the ``examples/`` directory in the source -distribution or `on the web `_. +Further examples can be found in `PlatformIO Repository `_. Also, for more detailed information as for commands please go to :ref:`userguide` sections. diff --git a/docs/userguide/cmd_settings.rst b/docs/userguide/cmd_settings.rst index c001c16f..4fe14304 100644 --- a/docs/userguide/cmd_settings.rst +++ b/docs/userguide/cmd_settings.rst @@ -23,6 +23,72 @@ Description Get/List existing settings +Options +~~~~~~~ + +.. option:: auto_update_libraries + +:Default: Yes +:Values: Yes/No + +Automatically update libraries. + +.. option:: auto_update_platforms + +:Default: Yes +:Values: Yes/No + +Automatically update platforms. + +.. option:: check_libraries_interval + +:Default: 7 +:Values: Days (Number) + +Check for the library updates interval. + +.. option:: check_platformio_interval + +:Default: 3 +:Values: Days (Number) + +Check for the new PlatformIO interval. + +.. option:: check_platforms_interval + +:Default: 7 +:Values: Days (Number) + +Check for the platform updates interval. + +.. option:: enable_prompts + +:Default: Yes +:Values: Yes/No + +Can PlatformIO communicate with you via prompts? + +* propose to install platforms which aren't installed yet +* paginate over library search results +* and etc. + +.. warning:: + If you are going to run *PlatformIO* from **subprocess**, you **MUST + DISABLE** all prompts. It will allow you to avoid blocking. + +.. option:: enable_telemetry + +:Default: Yes +:Values: Yes/No + +Shares commands, platforms and libraries usage to help us make PlatformIO +better. + + +.. note:: + * The ``Yes`` value is equl to: ``True``, ``Y``, ``1``. + The value is not case sensetive. + * You can override these settings using :ref:`envvars`. Examples ~~~~~~~~ diff --git a/examples/atmelavr-and-arduino/arduino-internal-libs/platformio.ini b/examples/atmelavr-and-arduino/arduino-internal-libs/platformio.ini index e784abdd..6ddaa27a 100644 --- a/examples/atmelavr-and-arduino/arduino-internal-libs/platformio.ini +++ b/examples/atmelavr-and-arduino/arduino-internal-libs/platformio.ini @@ -32,10 +32,10 @@ platform = atmelavr framework = arduino board = leonardo -[env:arduino_pro16MHzatmega168] +[env:arduino_pro16MHzatmega328] platform = atmelavr framework = arduino -board = pro16MHzatmega168 +board = pro16MHzatmega328 [env:arduino_megaatmega1280] platform = atmelavr diff --git a/platformio/__init__.py b/platformio/__init__.py index 7e3220d6..4d895b31 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (1, 0, 0) +VERSION = (1, 1, 0) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/app.py b/platformio/app.py index 60d7d827..fe299d6a 100644 --- a/platformio/app.py +++ b/platformio/app.py @@ -2,6 +2,7 @@ # See LICENSE for details. import json +from os import environ, getenv from os.path import isfile, join from platformio import __version__ @@ -71,6 +72,24 @@ class State(object): json.dump(self._state, fp) +def sanitize_setting(name, value): + if name not in DEFAULT_SETTINGS: + raise InvalidSettingName(name) + + defdata = DEFAULT_SETTINGS[name] + try: + if "validator" in defdata: + value = defdata['validator']() + elif isinstance(defdata['value'], bool): + if not isinstance(value, bool): + value = str(value).lower() in ("true", "yes", "y", "1") + elif isinstance(defdata['value'], int): + value = int(value) + except Exception: + raise InvalidSettingValue(value, name) + return value + + def get_state_item(name, default=None): with State() as data: return data.get(name, default) @@ -82,8 +101,13 @@ def set_state_item(name, value): def get_setting(name): - if name not in DEFAULT_SETTINGS: - raise InvalidSettingName(name) + # disable prompts for Continuous Integration systems + if name == "enable_prompts" and getenv("CI", "").lower() == "true": + return False + + _env_name = "PLATFORMIO_SETTING_%s" % name.upper() + if _env_name in environ: + return sanitize_setting(name, getenv(_env_name)) with State() as data: if "settings" in data and name in data['settings']: @@ -93,25 +117,10 @@ def get_setting(name): def set_setting(name, value): - if name not in DEFAULT_SETTINGS: - raise InvalidSettingName(name) - - defdata = DEFAULT_SETTINGS[name] - try: - if "validator" in defdata: - value = defdata['validator']() - elif isinstance(defdata['value'], bool): - if not isinstance(value, bool): - value = str(value).lower() in ("yes", "y", "1") - elif isinstance(defdata['value'], int): - value = int(value) - except Exception: - raise InvalidSettingValue(value, name) - with State() as data: if "settings" not in data: data['settings'] = {} - data['settings'][name] = value + data['settings'][name] = sanitize_setting(name, value) def reset_settings(): diff --git a/platformio/boards/adafruit.json b/platformio/boards/adafruit.json index ce5563d5..4e7832d0 100644 --- a/platformio/boards/adafruit.json +++ b/platformio/boards/adafruit.json @@ -18,6 +18,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": false @@ -55,8 +56,8 @@ "platform": "atmelavr", "upload": { "maximum_ram_size": 512, - "protocol": "usbtiny", - "maximum_size": 8192 + "maximum_size": 8192, + "protocol": "usbtiny" } }, @@ -74,8 +75,7 @@ "upload": { "maximum_ram_size": 2048, "maximum_size": 28672, - "protocol": "usbtiny", - "speed": 115200 + "protocol": "usbtiny" } }, @@ -93,8 +93,7 @@ "upload": { "maximum_ram_size": 2048, "maximum_size": 28672, - "protocol": "usbtiny", - "speed": 115200 + "protocol": "usbtiny" } }, "protrinket3ftdi": { @@ -112,6 +111,7 @@ "maximum_ram_size": 2048, "maximum_size": 28672, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -130,6 +130,7 @@ "maximum_ram_size": 2048, "maximum_size": 28672, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } } diff --git a/platformio/boards/arduino.json b/platformio/boards/arduino.json index 142fdb6d..43779bc1 100644 --- a/platformio/boards/arduino.json +++ b/platformio/boards/arduino.json @@ -18,6 +18,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -38,6 +39,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -56,6 +58,7 @@ "maximum_ram_size": 1024, "maximum_size": 7168, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -75,6 +78,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -94,6 +98,7 @@ "maximum_ram_size": 2048, "maximum_size": 28672, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -112,6 +117,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -130,6 +136,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -152,6 +159,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -172,6 +180,7 @@ "maximum_ram_size": 2048, "maximum_size": 32256, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -190,6 +199,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -212,6 +222,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -232,6 +243,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -250,6 +262,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -268,6 +281,7 @@ "maximum_ram_size": 8192, "maximum_size": 253952, "protocol": "wiring", + "require_upload_port" : true, "speed": 115200 } }, @@ -286,6 +300,7 @@ "maximum_ram_size": 8192, "maximum_size": 126976, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -304,6 +319,7 @@ "maximum_ram_size": 8192, "maximum_size": 253952, "protocol": "wiring", + "require_upload_port" : true, "speed": 115200 } }, @@ -326,6 +342,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -346,6 +363,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -364,6 +382,7 @@ "maximum_ram_size": 2048, "maximum_size": 28672, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -382,6 +401,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -400,6 +420,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -418,6 +439,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -436,6 +458,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -454,6 +477,7 @@ "maximum_ram_size": 1024, "maximum_size": 14336, "protocol": "arduino", + "require_upload_port" : true, "speed": 19200 } }, @@ -472,6 +496,7 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -494,6 +519,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -518,6 +544,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -538,6 +565,7 @@ "maximum_ram_size": 2048, "maximum_size": 32256, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -560,6 +588,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "via_ssh": true, @@ -587,9 +616,35 @@ "maximum_ram_size": 28672, "maximum_size": 524288, "protocol": "sam-ba", - "speed": 57600, + "require_upload_port" : true, "use_1200bps_touch": true, - "wait_for_upload_port": false + "wait_for_upload_port": true + } + }, + "dueUSB": { + "build": { + "core": "arduino", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM", + "f_cpu": "84000000L", + "mcu": "at91sam3x8e", + "cpu": "cortex-m3", + "pid": "0x003e", + "usb_product": "Arduino Due", + "variant": "arduino_due_x", + "vid": "0x2341", + "ldscript": "sam3x8e.ld" + }, + "framework": "arduino", + "name": "Arduino Due (USB Native Port)", + "platform": "atmelsam", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 28672, + "maximum_size": 524288, + "protocol": "sam-ba", + "require_upload_port" : true, + "use_1200bps_touch": true, + "wait_for_upload_port": true } } } diff --git a/platformio/boards/digistump.json b/platformio/boards/digistump.json index 610cad58..8e0dc576 100644 --- a/platformio/boards/digistump.json +++ b/platformio/boards/digistump.json @@ -8,15 +8,12 @@ "variant": "digispark_tiny" }, "framework": "arduino", - "name": "Digispark (Default - 16.5mhz)", + "name": "Digispark (Default - 16 MHz)", "platform": "atmelavr", "upload": { - "disable_flushing": false, "maximum_ram_size": 512, "maximum_size": 6012, - "protocol": "digispark", - "use_1200bps_touch": false, - "wait_for_upload_port": false + "protocol": "digispark" } }, "digispark-pro": { @@ -28,15 +25,12 @@ "variant": "digispark_pro" }, "framework": "arduino", - "name": "Digispark Pro (Default 16 Mhz)", + "name": "Digispark Pro (Default 16 MHz)", "platform": "atmelavr", "upload": { - "disable_flushing": false, "maximum_ram_size": 512, "maximum_size": 14844, - "protocol": "digispark", - "use_1200bps_touch": false, - "wait_for_upload_port": false + "protocol": "digispark" } }, "digispark-pro32": { @@ -48,15 +42,12 @@ "variant": "digispark_pro32" }, "framework": "arduino", - "name": "Digispark Pro (16 Mhz) (32 byte buffer)", + "name": "Digispark Pro (16 MHz) (32 byte buffer)", "platform": "atmelavr", "upload": { - "disable_flushing": false, "maximum_ram_size": 512, "maximum_size": 14844, - "protocol": "digispark", - "use_1200bps_touch": false, - "wait_for_upload_port": false + "protocol": "digispark" } }, "digispark-pro64": { @@ -68,15 +59,12 @@ "variant": "digispark_pro64" }, "framework": "arduino", - "name": "Digispark Pro (16 Mhz) (64 byte buffer)", + "name": "Digispark Pro (16 MHz) (64 byte buffer)", "platform": "atmelavr", "upload": { - "disable_flushing": false, "maximum_ram_size": 512, "maximum_size": 14844, - "protocol": "digispark", - "use_1200bps_touch": false, - "wait_for_upload_port": false + "protocol": "digispark" } }, "digix": { @@ -96,10 +84,11 @@ "name": "Digistump DigiX", "platform": "atmelsam", "upload": { - "disable_flushing": false, + "disable_flushing": true, "maximum_ram_size": 28672, "maximum_size": 524288, "protocol": "sam-ba", + "require_upload_port" : true, "use_1200bps_touch": true, "wait_for_upload_port": true } diff --git a/platformio/boards/engduino.json b/platformio/boards/engduino.json index 4263e4b2..32235a93 100644 --- a/platformio/boards/engduino.json +++ b/platformio/boards/engduino.json @@ -18,6 +18,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -42,6 +43,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -66,6 +68,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true diff --git a/platformio/boards/microduino.json b/platformio/boards/microduino.json index a55e42e0..86d09dcf 100644 --- a/platformio/boards/microduino.json +++ b/platformio/boards/microduino.json @@ -14,6 +14,7 @@ "maximum_ram_size": 16384, "maximum_size": 130048, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -32,6 +33,7 @@ "maximum_ram_size": 16384, "maximum_size": 130048, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -50,6 +52,7 @@ "maximum_ram_size": 1024, "maximum_size": 15872, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -68,6 +71,7 @@ "maximum_ram_size": 1024, "maximum_size": 15872, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } }, @@ -86,6 +90,7 @@ "maximum_ram_size": 2048, "maximum_size": 32256, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -103,6 +108,7 @@ "upload": { "maximum_ram_size": 2048, "maximum_size": 32256, + "require_upload_port" : true, "protocol": "arduino", "speed": 57600 } @@ -125,6 +131,7 @@ "maximum_ram_size": 2560, "maximum_size": 28672, "protocol": "avr109", + "require_upload_port" : true, "speed": 57600, "use_1200bps_touch": true, "wait_for_upload_port": true @@ -145,6 +152,7 @@ "maximum_ram_size": 4096, "maximum_size": 64512, "protocol": "arduino", + "require_upload_port" : true, "speed": 115200 } }, @@ -163,6 +171,7 @@ "maximum_ram_size": 4096, "maximum_size": 64512, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } } diff --git a/platformio/boards/misc.json b/platformio/boards/misc.json index a061b2e2..8c1e85a0 100644 --- a/platformio/boards/misc.json +++ b/platformio/boards/misc.json @@ -14,7 +14,60 @@ "maximum_ram_size": 2048, "maximum_size": 30720, "protocol": "arduino", + "require_upload_port" : true, "speed": 57600 } + }, + "sainSmartDue": { + "build": { + "core": "arduino", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM", + "f_cpu": "84000000L", + "mcu": "at91sam3x8e", + "cpu": "cortex-m3", + "pid": "0x003e", + "usb_product": "Arduino Due", + "variant": "arduino_due_x", + "vid": "0x2341", + "ldscript": "sam3x8e.ld" + }, + "framework": "arduino", + "name": "SainSmart Due (Programming Port)", + "platform": "atmelsam", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 28672, + "maximum_size": 524288, + "protocol": "sam-ba", + "require_upload_port" : true, + "use_1200bps_touch": true, + "wait_for_upload_port": true + } + }, + "sainSmartDueUSB": { + "build": { + "core": "arduino", + "extra_flags": "-D__SAM3X8E__ -DARDUINO_SAM_DUE -DARDUINO_ARCH_SAM", + "f_cpu": "84000000L", + "mcu": "at91sam3x8e", + "cpu": "cortex-m3", + "pid": "0x003e", + "usb_product": "Arduino Due", + "variant": "arduino_due_x", + "vid": "0x2341", + "ldscript": "sam3x8e.ld" + }, + "framework": "arduino", + "name": "SainSmart Due (USB Native Port)", + "platform": "atmelsam", + "upload": { + "disable_flushing": true, + "maximum_ram_size": 28672, + "maximum_size": 524288, + "protocol": "sam-ba", + "require_upload_port" : true, + "use_1200bps_touch": true, + "wait_for_upload_port": true + } } } \ No newline at end of file diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 5fcc2d51..587c0f21 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -50,7 +50,10 @@ commonvars.AddVariables( ) DefaultEnvironment( - tools=["gcc", "g++", "as", "ar", "gnulink", "platformio"], + tools=[ + "gcc", "g++", "as", "ar", "gnulink", + "platformio", "pioupload", "pioar" + ], toolpath=[join("$PIOBUILDER_DIR", "tools")], variables=commonvars, diff --git a/platformio/builder/scripts/atmelavr.py b/platformio/builder/scripts/atmelavr.py index 4cf5276e..c32fe8b1 100644 --- a/platformio/builder/scripts/atmelavr.py +++ b/platformio/builder/scripts/atmelavr.py @@ -20,16 +20,16 @@ def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 with open(path, "w") as f: f.write(str(value)) - if "UPLOAD_SPEED" in env: - env.Append( - UPLOADERFLAGS=["-b", "$UPLOAD_SPEED"] - ) + upload_options = env.get("BOARD_OPTIONS", {}).get("upload", {}) - if "usb" not in env.subst("$UPLOAD_PROTOCOL"): - env.AutodetectUploadPort() - env.Append( - UPLOADERFLAGS=["-P", "$UPLOAD_PORT"] - ) + if env.subst("$UPLOAD_SPEED"): + env.Append(UPLOADERFLAGS=["-b", "$UPLOAD_SPEED"]) + + if not upload_options.get("require_upload_port", False): + return + + env.AutodetectUploadPort() + env.Append(UPLOADERFLAGS=["-P", "$UPLOAD_PORT"]) if env.subst("$BOARD") == "raspduino": _rpi_sysgpio("/sys/class/gpio/export", 18) @@ -38,9 +38,7 @@ def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 sleep(0.1) _rpi_sysgpio("/sys/class/gpio/gpio18/value", 0) _rpi_sysgpio("/sys/class/gpio/unexport", 18) - elif "UPLOAD_PORT" in env: - upload_options = env.get("BOARD_OPTIONS", {}).get("upload", {}) - + else: if not upload_options.get("disable_flushing", False): env.FlushSerialBuffer("$UPLOAD_PORT") @@ -65,7 +63,7 @@ if "digispark" in env.get( "-c", "$UPLOAD_PROTOCOL", "--timeout", "60" ], - UPLOADHEXCMD='"$UPLOADER" $UPLOADERFLAGS -U flash:w:$SOURCES:i' + UPLOADHEXCMD='"$UPLOADER" $UPLOADERFLAGS $SOURCES' ) else: diff --git a/platformio/builder/scripts/atmelsam.py b/platformio/builder/scripts/atmelsam.py index e098e371..347cb75a 100644 --- a/platformio/builder/scripts/atmelsam.py +++ b/platformio/builder/scripts/atmelsam.py @@ -10,10 +10,33 @@ from os.path import join from SCons.Script import (COMMAND_LINE_TARGETS, AlwaysBuild, Default, DefaultEnvironment, SConscript) +from platformio.util import get_serialports + def BeforeUpload(target, source, env): # pylint: disable=W0613,W0621 env.AutodetectUploadPort() + board_type = env.subst("$BOARD") + env.Append( + UPLOADERFLAGS=[ + "-U", + "true" if "usb" in board_type.lower( + ) or board_type == "digix" else "false" + ]) + + upload_options = env.get("BOARD_OPTIONS", {}).get("upload", {}) + + if not upload_options.get("disable_flushing", False): + env.FlushSerialBuffer("$UPLOAD_PORT") + + before_ports = [i['port'] for i in get_serialports()] + + if upload_options.get("use_1200bps_touch", False): + env.TouchSerialPort("$UPLOAD_PORT", 1200) + + if upload_options.get("wait_for_upload_port", False): + env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports)) + env = DefaultEnvironment() diff --git a/platformio/builder/scripts/baseavr.py b/platformio/builder/scripts/baseavr.py index 912250bf..bfe19df8 100644 --- a/platformio/builder/scripts/baseavr.py +++ b/platformio/builder/scripts/baseavr.py @@ -50,11 +50,6 @@ env.Replace( SIZEPRINTCMD='"$SIZETOOL" --mcu=$BOARD_MCU -C -d $SOURCES' ) -if "UPLOAD_SPEED" in env: - env.Append(UPLOADERFLAGS=["-b", "$UPLOAD_SPEED"]) -if env.subst("$UPLOAD_PROTOCOL") != "usbtiny": - env.Append(UPLOADERFLAGS=["-P", "$UPLOAD_PORT"]) - env.Append( BUILDERS=dict( ElfToEep=Builder( diff --git a/platformio/builder/tools/pioar.py b/platformio/builder/tools/pioar.py new file mode 100644 index 00000000..e3b2fed4 --- /dev/null +++ b/platformio/builder/tools/pioar.py @@ -0,0 +1,42 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + +import atexit +from os import remove +from tempfile import mkstemp + +MAX_SOURCES_LENGTH = 8000 # Windows CLI has limit with command length to 8192 + + +def _remove_tmpfile(path): + try: + remove(path) + except WindowsError: # pylint: disable=E0602 + pass + + +def _huge_sources_hook(sources): + if len(str(sources)) < MAX_SOURCES_LENGTH: + return sources + + _, tmp_file = mkstemp() + with open(tmp_file, "w") as f: + f.write(str(sources).replace("\\", "/")) + + atexit.register(_remove_tmpfile, tmp_file) + + return "@%s" % tmp_file + + +def exists(_): + return True + + +def generate(env): + + env.Replace( + _huge_sources_hook=_huge_sources_hook, + ARCOM=env.get("ARCOM", "").replace( + "$SOURCES", "${_huge_sources_hook(SOURCES)}")) + + return env diff --git a/platformio/builder/tools/pioupload.py b/platformio/builder/tools/pioupload.py new file mode 100644 index 00000000..130fd22f --- /dev/null +++ b/platformio/builder/tools/pioupload.py @@ -0,0 +1,76 @@ +# Copyright (C) Ivan Kravets +# See LICENSE for details. + +import platform +from time import sleep + +from SCons.Script import Exit +from serial import Serial + +from platformio.util import get_serialports + + +def FlushSerialBuffer(env, port): + s = Serial(env.subst(port)) + s.flushInput() + s.setDTR(False) + s.setRTS(False) + sleep(0.1) + s.setDTR(True) + s.setRTS(True) + s.close() + + +def TouchSerialPort(env, port, baudrate): + s = Serial(port=env.subst(port), baudrate=baudrate) + s.close() + if platform.system() != "Darwin": + sleep(0.3) + + +def WaitForNewSerialPort(_, before): + new_port = None + elapsed = 0 + while elapsed < 10: + now = [i['port'] for i in get_serialports()] + diff = list(set(now) - set(before)) + if diff: + new_port = diff[0] + break + + before = now + sleep(0.25) + elapsed += 0.25 + + if not new_port: + Exit("Error: Couldn't find a board on the selected port. " + "Check that you have the correct port selected. " + "If it is correct, try pressing the board's reset " + "button after initiating the upload.") + + return new_port + + +def AutodetectUploadPort(env): + if "UPLOAD_PORT" not in env: + for item in get_serialports(): + if "VID:PID" in item['hwid']: + print "Auto-detected UPLOAD_PORT: %s" % item['port'] + env.Replace(UPLOAD_PORT=item['port']) + break + + if "UPLOAD_PORT" not in env: + Exit("Error: Please specify `upload_port` for environment or use " + "global `--upload-port` option.\n") + + +def exists(_): + return True + + +def generate(env): + env.AddMethod(FlushSerialBuffer) + env.AddMethod(TouchSerialPort) + env.AddMethod(WaitForNewSerialPort) + env.AddMethod(AutodetectUploadPort) + return env diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 79dd62a6..37931953 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -2,17 +2,12 @@ # See LICENSE for details. import atexit -import platform import re from os import getenv, listdir, remove, sep, walk from os.path import basename, dirname, isdir, isfile, join, normpath -from time import sleep -from SCons.Script import Exit, SConscript, SConscriptChdir +from SCons.Script import SConscript, SConscriptChdir from SCons.Util import case_sensitive_suffixes -from serial import Serial - -from platformio.util import get_serialports def ProcessGeneral(env): @@ -64,7 +59,7 @@ def BuildFirmware(env, corelibs): _LIBFLAGS=" -Wl,--end-group" ) - firmenv.MergeFlags(getenv("PIOSRCBUILD_FLAGS", "$SRCBUILD_FLAGS")) + firmenv.MergeFlags(getenv("PLATFORMIO_SRCBUILD_FLAGS", "$SRCBUILD_FLAGS")) return firmenv.Program( join("$BUILD_DIR", "firmware"), @@ -303,60 +298,6 @@ def ConvertInoToCpp(env): atexit.register(delete_tmpcpp, tmpcpp) -def FlushSerialBuffer(env, port): - s = Serial(env.subst(port)) - s.flushInput() - s.setDTR(False) - s.setRTS(False) - sleep(0.1) - s.setDTR(True) - s.setRTS(True) - s.close() - - -def TouchSerialPort(env, port, baudrate): - s = Serial(port=env.subst(port), baudrate=baudrate) - s.close() - if platform.system() != "Darwin": - sleep(0.3) - - -def WaitForNewSerialPort(_, before): - new_port = None - elapsed = 0 - while elapsed < 10: - now = [i['port'] for i in get_serialports()] - diff = list(set(now) - set(before)) - if diff: - new_port = diff[0] - break - - before = now - sleep(0.25) - elapsed += 0.25 - - if not new_port: - Exit("Error: Couldn't find a board on the selected port. " - "Check that you have the correct port selected. " - "If it is correct, try pressing the board's reset " - "button after initiating the upload.") - - return new_port - - -def AutodetectUploadPort(env): - if "UPLOAD_PORT" not in env: - for item in get_serialports(): - if "VID:PID" in item['hwid']: - print "Auto-detected UPLOAD_PORT: %s" % item['port'] - env.Replace(UPLOAD_PORT=item['port']) - break - - if "UPLOAD_PORT" not in env: - Exit("Error: Please specify `upload_port` for environment or use " - "global `--upload-port` option.\n") - - def exists(_): return True @@ -369,8 +310,4 @@ def generate(env): env.AddMethod(BuildLibrary) env.AddMethod(BuildDependentLibraries) env.AddMethod(ConvertInoToCpp) - env.AddMethod(FlushSerialBuffer) - env.AddMethod(TouchSerialPort) - env.AddMethod(WaitForNewSerialPort) - env.AddMethod(AutodetectUploadPort) return env diff --git a/platformio/util.py b/platformio/util.py index ea48f79b..b4f0473c 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -56,25 +56,29 @@ def get_systype(): return ("%s_%s" % (data[0], data[4])).lower() -def _get_projconf_option_dir(option_name): +def _get_projconf_option_dir(name, default=None): + _env_name = "PLATFORMIO_%s" % name.upper() + if _env_name in os.environ: + return os.getenv(_env_name) + try: config = get_project_config() if (config.has_section("platformio") and - config.has_option("platformio", option_name)): - option_dir = config.get("platformio", option_name) + config.has_option("platformio", name)): + option_dir = config.get("platformio", name) if option_dir.startswith("~"): option_dir = expanduser(option_dir) return abspath(option_dir) except exception.NotPlatformProject: pass - return None + return default def get_home_dir(): - home_dir = _get_projconf_option_dir("home_dir") - - if not home_dir: - home_dir = join(expanduser("~"), ".platformio") + home_dir = _get_projconf_option_dir( + "home_dir", + join(expanduser("~"), ".platformio") + ) if not isdir(home_dir): os.makedirs(home_dir) @@ -84,12 +88,10 @@ def get_home_dir(): def get_lib_dir(): - lib_dir = _get_projconf_option_dir("lib_dir") - - if not lib_dir: - lib_dir = join(get_home_dir(), "lib") - - return lib_dir + return _get_projconf_option_dir( + "lib_dir", + join(get_home_dir(), "lib") + ) def get_source_dir(): @@ -101,16 +103,17 @@ def get_project_dir(): def get_projectsrc_dir(): - src_dir = _get_projconf_option_dir("src_dir") - - if not src_dir: - src_dir = join(get_project_dir(), "src") - - return src_dir + return _get_projconf_option_dir( + "src_dir", + join(get_project_dir(), "src") + ) def get_pioenvs_dir(): - return os.getenv("PIOENVS_DIR", join(get_project_dir(), ".pioenvs")) + return _get_projconf_option_dir( + "envs_dir", + join(get_project_dir(), ".pioenvs") + ) def get_project_config(): diff --git a/tests/conftest.py b/tests/conftest.py index 5721f7c3..50170650 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,28 +1,24 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. +from os import environ + from click.testing import CliRunner import pytest -from platformio import app @pytest.fixture(scope="session") def platformio_setup(request): - prev_settings = dict( - enable_telemetry=None, - enable_prompts=None - ) - for key, value in prev_settings.iteritems(): - prev_settings[key] = app.get_setting(key) - # disable temporary - if prev_settings[key]: - app.set_setting(key, False) + pioenvvars = ("ENABLE_PROMPTS", "ENABLE_TELEMETRY") + for v in pioenvvars: + environ["PLATFORMIO_SETTING_%s" % v] = "No" def platformio_teardown(): - # restore settings - for key, value in prev_settings.iteritems(): - app.set_setting(key, value) + for v in pioenvvars: + _name = "PLATFORMIO_SETTING_%s" % v + if _name in environ: + del environ[_name] request.addfinalizer(platformio_teardown) diff --git a/tox.ini b/tox.ini index 8099fce0..3bc8d18e 100644 --- a/tox.ini +++ b/tox.ini @@ -38,6 +38,8 @@ basepython = py27: python2.7 usedevelop = True deps = pytest +setenv = + PLATFORMIO_SETTING_ENABLE_PROMPTS = False commands = {envpython} --version pip install --egg http://sourceforge.net/projects/scons/files/latest/download