diff --git a/HISTORY.rst b/HISTORY.rst index bcdc4578..e6bea3a7 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,17 @@ Release History =============== +2.2.1 (2015-??-??) +------------------ + +* Project generator for `CLion IDE `__ + (`issue #132 `_) +* Updated ``tool-bossac`` package to 1.5 version for `atmelsam `__ platform +* Updated ``sdk-esp8266`` package for `espressif `__ platform + (`issue #251 `_) +* Fixed incorrect arguments handling for `platformio serialports monitor `_ command + (`issue #248 `_) + 2.2.0 (2015-07-01) ------------------ diff --git a/docs/_static/ide-platformio-clion.png b/docs/_static/ide-platformio-clion.png new file mode 100644 index 00000000..11f0754f Binary files /dev/null and b/docs/_static/ide-platformio-clion.png differ diff --git a/docs/ci/appveyor.rst b/docs/ci/appveyor.rst index 65ca0eb9..edfafcd5 100644 --- a/docs/ci/appveyor.rst +++ b/docs/ci/appveyor.rst @@ -134,7 +134,7 @@ same for the all projects, don't need to modify them): function InstallScons ($python_home) { Write-Host "Start installing Scons" $pip_path = $python_home + "/Scripts/pip.exe" - & $pip_path install --egg "http://sourceforge.net/projects/scons/files/latest/download" + & $pip_path install --egg "http://dl.platformio.org/scons.zip" Write-Host "Scons installed" } diff --git a/docs/ide.rst b/docs/ide.rst index 48053b78..6e5623fe 100644 --- a/docs/ide.rst +++ b/docs/ide.rst @@ -7,6 +7,7 @@ IDE Integration :maxdepth: 2 ide/arduino + ide/clion ide/eclipse ide/energia ide/qtcreator diff --git a/docs/ide/clion.rst b/docs/ide/clion.rst new file mode 100644 index 00000000..4f8bc333 --- /dev/null +++ b/docs/ide/clion.rst @@ -0,0 +1,51 @@ +.. _ide_clion: + +CLion +===== + +The `CLion `_ is a cross-platform C/C++ IDE +for Linux, OS X, and Windows integrated with the CMake build system. The +initial version will support the GCC and Clang compilers and GDB debugger. +Clion includes such features as a smart editor, code quality assurance, +automated refactorings, project manager, integrated version control systems. + +This software can be used with: + +* all available :ref:`platforms` +* all available :ref:`frameworks` + +Refer to the `CDT Documentation `_ +page for more detailed information. + +.. contents:: + +Integration +----------- + +Project Generator +^^^^^^^^^^^^^^^^^ + +Since PlatformIO 2.0 you can generate CLion compatible project using +:option:`platformio init --ide` command. Please choose board type using +:ref:`cmd_boards` command and run: + +.. code-block:: shell + + platformio init --ide clion --board %TYPE% + +Then import this project from start menu or via ``File > Import Project>`` and +specify root directory where is located :ref:`projectconf`. + +.. 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 `_. + + Active discussion located in + `PlatformIO issue #132 `_. + +Screenshot +---------- + +.. image:: ../_static/ide-platformio-clion.png + :target: http://docs.platformio.org/en/latest/_static/ide-platformio-clion.png diff --git a/docs/installation.rst b/docs/installation.rst index 26d6460f..0dbb97e6 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -34,6 +34,12 @@ application: :ref:`MUST DISABLE ` all prompts. It will allow you to avoid blocking. +.. note:: + **Linux Users:** Don't forget to install "udev" rules file + `99-platformio-udev.rules `_ (an instruction is located in the file). + + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer Troubleshooting --------------- @@ -65,6 +71,10 @@ script. Then run the following (you might need to run ``sudo`` first): .. code-block:: bash + # change directory to folder where is located downloaded "get-platformio.py" + cd /path/to/dir/where/is/installer/script + + # run it python get-platformio.py @@ -72,6 +82,10 @@ On *Windows OS* it may look like: .. code-block:: bash + # change directory to folder where is located downloaded "get-platformio.py" + cd C:\path\to\dir\where\is\installer\script + + # run it C:\Python27\python.exe get-platformio.py Full Guide diff --git a/docs/platforms/atmelavr.rst b/docs/platforms/atmelavr.rst index 048b7bef..0ffb8f67 100644 --- a/docs/platforms/atmelavr.rst +++ b/docs/platforms/atmelavr.rst @@ -33,6 +33,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/atmelsam.rst b/docs/platforms/atmelsam.rst index 12b77aa8..92f515dc 100644 --- a/docs/platforms/atmelsam.rst +++ b/docs/platforms/atmelsam.rst @@ -33,6 +33,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/espressif.rst b/docs/platforms/espressif.rst index 2e159da3..1a134dcb 100644 --- a/docs/platforms/espressif.rst +++ b/docs/platforms/espressif.rst @@ -36,6 +36,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/freescalekinetis.rst b/docs/platforms/freescalekinetis.rst index 3f8bbb03..c2ebcc80 100644 --- a/docs/platforms/freescalekinetis.rst +++ b/docs/platforms/freescalekinetis.rst @@ -27,6 +27,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/nordicnrf51.rst b/docs/platforms/nordicnrf51.rst index bb922543..a4f21e32 100644 --- a/docs/platforms/nordicnrf51.rst +++ b/docs/platforms/nordicnrf51.rst @@ -27,6 +27,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/nxplpc.rst b/docs/platforms/nxplpc.rst index 1f2e402b..52edd4e5 100644 --- a/docs/platforms/nxplpc.rst +++ b/docs/platforms/nxplpc.rst @@ -27,6 +27,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/siliconlabsefm32.rst b/docs/platforms/siliconlabsefm32.rst index 448d95db..4c1b987a 100644 --- a/docs/platforms/siliconlabsefm32.rst +++ b/docs/platforms/siliconlabsefm32.rst @@ -27,6 +27,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/ststm32.rst b/docs/platforms/ststm32.rst index 1276ddbf..05cb3f18 100644 --- a/docs/platforms/ststm32.rst +++ b/docs/platforms/ststm32.rst @@ -42,6 +42,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/teensy.rst b/docs/platforms/teensy.rst index 11d25e24..29dbc2b0 100644 --- a/docs/platforms/teensy.rst +++ b/docs/platforms/teensy.rst @@ -36,6 +36,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/timsp430.rst b/docs/platforms/timsp430.rst index 913f1970..b81aada7 100644 --- a/docs/platforms/timsp430.rst +++ b/docs/platforms/timsp430.rst @@ -33,6 +33,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/docs/platforms/titiva.rst b/docs/platforms/titiva.rst index 0f98f8d7..d54e6f33 100644 --- a/docs/platforms/titiva.rst +++ b/docs/platforms/titiva.rst @@ -36,6 +36,9 @@ Packages **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + Frameworks diff --git a/examples/espressif/esp8266-native/src/user_main.c b/examples/espressif/esp8266-native/src/user_main.c index b6f4d027..14e0d077 100644 --- a/examples/espressif/esp8266-native/src/user_main.c +++ b/examples/espressif/esp8266-native/src/user_main.c @@ -15,19 +15,54 @@ #include "smartconfig.h" void ICACHE_FLASH_ATTR -smartconfig_done(void *data) +smartconfig_done(sc_status status, void *pdata) { - struct station_config *sta_conf = data; + switch(status) { + case SC_STATUS_WAIT: + os_printf("SC_STATUS_WAIT\n"); + break; + case SC_STATUS_FIND_CHANNEL: + os_printf("SC_STATUS_FIND_CHANNEL\n"); + break; + case SC_STATUS_GETTING_SSID_PSWD: + os_printf("SC_STATUS_GETTING_SSID_PSWD\n"); + sc_type *type = pdata; + if (*type == SC_TYPE_ESPTOUCH) { + os_printf("SC_TYPE:SC_TYPE_ESPTOUCH\n"); + } else { + os_printf("SC_TYPE:SC_TYPE_AIRKISS\n"); + } + break; + case SC_STATUS_LINK: + os_printf("SC_STATUS_LINK\n"); + struct station_config *sta_conf = pdata; + + wifi_station_set_config(sta_conf); + wifi_station_disconnect(); + wifi_station_connect(); + break; + case SC_STATUS_LINK_OVER: + os_printf("SC_STATUS_LINK_OVER\n"); + if (pdata != NULL) { + uint8 phone_ip[4] = {0}; - wifi_station_set_config(sta_conf); - wifi_station_disconnect(); - wifi_station_connect(); + os_memcpy(phone_ip, (uint8*)pdata, 4); + os_printf("Phone ip: %d.%d.%d.%d\n",phone_ip[0],phone_ip[1],phone_ip[2],phone_ip[3]); + } + smartconfig_stop(); + break; + } + +} + +void user_rf_pre_init(void) +{ } void user_init(void) { os_printf("SDK version:%s\n", system_get_sdk_version()); - + wifi_set_opmode(STATION_MODE); - smartconfig_start(SC_TYPE_AIRKISS, smartconfig_done); + smartconfig_start(smartconfig_done); } diff --git a/platformio/__init__.py b/platformio/__init__.py index 4cb7841d..bf88694a 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -1,7 +1,7 @@ # Copyright (C) Ivan Kravets # See LICENSE for details. -VERSION = (2, 2, 0) +VERSION = (2, 2, 1) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/builder/scripts/espressif.py b/platformio/builder/scripts/espressif.py index 484765f6..3875dd15 100644 --- a/platformio/builder/scripts/espressif.py +++ b/platformio/builder/scripts/espressif.py @@ -122,7 +122,7 @@ if "FRAMEWORK" not in env: LDSCRIPT_PATH=join( "$PIOPACKAGES_DIR", "sdk-esp8266", "ld", "eagle.app.v6.ld"), LIBS=["c", "gcc", "phy", "pp", "net80211", "lwip", "wpa", "main", - "json", "upgrade", "smartconfig", "at", "ssl"] + "json", "upgrade", "smartconfig", "pwm", "at", "ssl"] ) # @@ -136,7 +136,11 @@ target_elf = env.BuildFirmware() # if "uploadlazy" in COMMAND_LINE_TARGETS: - target_firm = join("$BUILD_DIR", "firmware.bin") + target_firm = [ + join("$BUILD_DIR", "firmware_00000.bin"), + join("$BUILD_DIR", "firmware_%s.bin" % + ("40000" if "FRAMEWORK" not in env else "10000")) + ] else: target_firm = env.ElfToBin( [join("$BUILD_DIR", "firmware_00000"), diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index e13b0105..3ea18f9f 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -6,7 +6,8 @@ from glob import glob from os import getenv, listdir, sep, walk from os.path import basename, dirname, isdir, isfile, join, normpath -from SCons.Script import DefaultEnvironment, Exit, SConscript +from SCons.Script import (COMMAND_LINE_TARGETS, DefaultEnvironment, Exit, + SConscript) from SCons.Util import case_sensitive_suffixes from platformio.util import pioversion_to_intstr @@ -155,7 +156,7 @@ def LookupSources(env, variant_dir, src_dir, duplicate=True, src_filter=None): def BuildFramework(env): - if "FRAMEWORK" not in env: + if "FRAMEWORK" not in env or "uploadlazy" in COMMAND_LINE_TARGETS: return if env['FRAMEWORK'].lower() in ("arduino", "energia"): diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 6eade5f9..4b8ec5b2 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -163,7 +163,7 @@ class EnvironmentProcessor(object): telemetry.on_run_environment(self.options, build_targets) # install platform and libs dependencies - _autoinstall_platform(self.cmd_ctx, platform) + _autoinstall_platform(self.cmd_ctx, platform, build_targets) if "lib_install" in self.options: _autoinstall_libs(self.cmd_ctx, self.options['lib_install']) @@ -171,14 +171,34 @@ class EnvironmentProcessor(object): return p.run(build_vars, build_targets, self.verbose_level) -def _autoinstall_platform(ctx, platform): +def _autoinstall_platform(ctx, platform, targets): installed_platforms = PlatformFactory.get_platforms( installed=True).keys() - if (platform not in installed_platforms and ( - not app.get_setting("enable_prompts") or + cmd_options = {} + p = PlatformFactory.newPlatform(platform) + + if "uploadlazy" in targets: + upload_tools = p.pkg_aliases_to_names(["uploader"]) + + # platform without uploaders + if not upload_tools and platform in installed_platforms: + return + # uploaders are already installed + if set(upload_tools) <= set(p.get_installed_packages()): + return + + cmd_options['skip_default_package'] = True + if upload_tools: + cmd_options['with_package'] = ["uploader"] + + elif (platform in installed_platforms and + set(p.get_default_packages()) <= set(p.get_installed_packages())): + return + + if (not app.get_setting("enable_prompts") or click.confirm("The platform '%s' has not been installed yet. " - "Would you like to install it now?" % platform))): - ctx.invoke(cmd_platforms_install, platforms=[platform]) + "Would you like to install it now?" % platform)): + ctx.invoke(cmd_platforms_install, platforms=[platform], **cmd_options) def _autoinstall_libs(ctx, libids_list): diff --git a/platformio/commands/serialports.py b/platformio/commands/serialports.py index 5c241d03..820f4b4a 100644 --- a/platformio/commands/serialports.py +++ b/platformio/commands/serialports.py @@ -68,7 +68,7 @@ def serialports_list(json_output): @click.option("--quiet", is_flag=True, help="Diagnostics: suppress non-error messages, default=Off") def serialports_monitor(**kwargs): - sys.argv = sys.argv[3:] + sys.argv = sys.argv[2:] if not kwargs['port']: for item in get_serialports(): diff --git a/platformio/ide/projectgenerator.py b/platformio/ide/projectgenerator.py index 2d6dbcc6..1720e467 100644 --- a/platformio/ide/projectgenerator.py +++ b/platformio/ide/projectgenerator.py @@ -2,8 +2,7 @@ # See LICENSE for details. import json -from glob import glob -from os import listdir, walk +from os import listdir, makedirs, walk from os.path import abspath, basename, expanduser, isdir, join, relpath import bottle @@ -76,14 +75,26 @@ class ProjectGenerator(object): return result def get_tpls(self): + tpls = [] tpls_dir = join(util.get_source_dir(), "ide", "tpls", self.ide) - return glob(join(tpls_dir, ".*.tpl")) + glob(join(tpls_dir, "*.tpl")) + for root, _, files in walk(tpls_dir): + for f in files: + if f.endswith(".tpl"): + tpls.append(( + root.replace(tpls_dir, ""), join(root, f))) + return tpls def generate(self): - for tpl_path in self.get_tpls(): - file_name = basename(tpl_path)[:-4] - with open(join(self.project_dir, file_name), "w") as f: - f.write(self._render_tpl(tpl_path).encode("utf8")) + for _relpath, _path in self.get_tpls(): + tpl_dir = self.project_dir + if _relpath: + tpl_dir = join(self.project_dir, _relpath)[1:] + if not isdir(tpl_dir): + makedirs(tpl_dir) + + file_name = basename(_path)[:-4] + with open(join(tpl_dir, file_name), "w") as f: + f.write(self._render_tpl(_path).encode("utf8")) def _render_tpl(self, tpl_path): content = "" diff --git a/platformio/ide/tpls/clion/.idea/clion.iml.tpl b/platformio/ide/tpls/clion/.idea/clion.iml.tpl new file mode 100644 index 00000000..bc2cd874 --- /dev/null +++ b/platformio/ide/tpls/clion/.idea/clion.iml.tpl @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/platformio/ide/tpls/clion/.idea/modules.xml.tpl b/platformio/ide/tpls/clion/.idea/modules.xml.tpl new file mode 100644 index 00000000..9ce81f04 --- /dev/null +++ b/platformio/ide/tpls/clion/.idea/modules.xml.tpl @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/platformio/ide/tpls/clion/.idea/platformio.iml.tpl b/platformio/ide/tpls/clion/.idea/platformio.iml.tpl new file mode 100644 index 00000000..bc2cd874 --- /dev/null +++ b/platformio/ide/tpls/clion/.idea/platformio.iml.tpl @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/platformio/ide/tpls/clion/.idea/workspace.xml.tpl b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl new file mode 100644 index 00000000..04b41db6 --- /dev/null +++ b/platformio/ide/tpls/clion/.idea/workspace.xml.tpl @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + % for file in srcfiles: + + + + + + + + + + + % end + + + + + true + + + + + + + + + + + + + + + + + C/C++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1435919971910 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/platformio/ide/tpls/clion/CMakeLists.txt.tpl b/platformio/ide/tpls/clion/CMakeLists.txt.tpl new file mode 100644 index 00000000..9707347f --- /dev/null +++ b/platformio/ide/tpls/clion/CMakeLists.txt.tpl @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.2) +project({{project_name}}) +% for include in includes: +% if include.startswith(user_home_dir): +include_directories("$ENV{HOME}{{include.replace(user_home_dir, '').replace("\\", "/")}}") +% else: +include_directories("{{include}}") +% end +% end + +% for define in defines: +add_definitions(-D{{define}}) +% end + +add_custom_target( + PLATFORMIO_BUILD ALL + COMMAND platformio -f run + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target( + PLATFORMIO_UPLOAD ALL + COMMAND platformio -f run --target upload + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target( + PLATFORMIO_CLEAN ALL + COMMAND platformio -f run --target clean + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) \ No newline at end of file diff --git a/platformio/platforms/atmelavr.py b/platformio/platforms/atmelavr.py index 23486589..11f7205c 100644 --- a/platformio/platforms/atmelavr.py +++ b/platformio/platforms/atmelavr.py @@ -25,10 +25,12 @@ class AtmelavrPlatform(BasePlatform): }, "tool-avrdude": { + "alias": "uploader", "default": True }, "tool-micronucleus": { + "alias": "uploader", "default": True }, @@ -51,11 +53,11 @@ class AtmelavrPlatform(BasePlatform): for v in variables: if "BOARD=" not in v: continue - tuploader = "tool-avrdude" + disable_tool = "tool-micronucleus" _, board = v.split("=") bdata = get_boards(board) if "digispark" in bdata['build']['core']: - tuploader = "tool-micronucleus" - self.PACKAGES[tuploader]['alias'] = "uploader" + disable_tool = "tool-avrdude" + del self.PACKAGES[disable_tool]['alias'] break return BasePlatform.run(self, variables, targets, verbose) diff --git a/platformio/platforms/base.py b/platformio/platforms/base.py index 7dd2732f..8874e7f3 100644 --- a/platformio/platforms/base.py +++ b/platformio/platforms/base.py @@ -242,6 +242,10 @@ class BasePlatform(object): names.append(name) return names + def get_default_packages(self): + return [k for k, v in self.get_packages().items() + if v.get("default", False)] + def get_installed_packages(self): pm = PackageManager() return [n for n in self.get_packages().keys() if pm.is_installed(n)] diff --git a/scripts/docspregen.py b/scripts/docspregen.py index 1c07ef65..5f9f3ac5 100644 --- a/scripts/docspregen.py +++ b/scripts/docspregen.py @@ -91,6 +91,9 @@ def generate_packages(packages): **Linux Users:** Don't forget to install "udev" rules file `99-platformio-udev.rules `_ (an instruction is located in the file). + **Windows Users:** Please check that you have correctly installed USB driver + from board manufacturer + """) return "\n".join(lines) diff --git a/scripts/get-platformio.py b/scripts/get-platformio.py index 26b0c932..a8ccd81c 100644 --- a/scripts/get-platformio.py +++ b/scripts/get-platformio.py @@ -100,9 +100,7 @@ def main(): ("Installing Python Package Manager", install_pip, []), ("Installing PlatformIO and dependencies", install_pypi_packages, [ [["setuptools"], ["platformio"], [ - "--egg", - "http://sourceforge.net/projects/platformio-storage/files/" - "scons.zip/download" + "--egg", "http://dl.platformio.org/scons.zip" ]] ]) ] diff --git a/tox.ini b/tox.ini index d96bb3d8..1f425256 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ deps = isort flake8 commands = - pip install --egg http://sourceforge.net/projects/platformio-storage/files/scons.zip/download + pip install --egg http://dl.platformio.org/scons.zip [testenv:docs] basepython = python2.7 @@ -48,5 +48,5 @@ passenv = * deps = pytest commands = {envpython} --version - pip install --egg http://sourceforge.net/projects/platformio-storage/files/scons.zip/download + pip install --egg http://dl.platformio.org/scons.zip py.test -v --basetemp="{envtmpdir}" tests