Install SCons automatically and avoid error: option --single-version-externally-managed not recognized

This commit is contained in:
Ivan Kravets
2015-10-13 18:24:40 +01:00
parent 177353bf7a
commit b183431c27
5 changed files with 72 additions and 49 deletions

View File

@ -13,9 +13,11 @@ PlatformIO 2.0
* PlatformIO `command completion in Terminal <http://docs.platformio.org/en/latest/faq.html#command-completion-in-terminal>`_ for ``bash`` and ``zsh`` * PlatformIO `command completion in Terminal <http://docs.platformio.org/en/latest/faq.html#command-completion-in-terminal>`_ for ``bash`` and ``zsh``
* Added support for ubIQio Ardhat board * Added support for ubIQio Ardhat board
(`pull #302 <https://github.com/platformio/platformio/pull/302>`_) (`pull #302 <https://github.com/platformio/platformio/pull/302>`_)
* Install SCons automatically and avoid ``error: option --single-version-externally-managed not recognized``
(`issue #279 <https://github.com/platformio/platformio/issues/279>`_)
* Use Teensy CLI Loader for upload of .hex files on Mac OS X * Use Teensy CLI Loader for upload of .hex files on Mac OS X
(`issue #306 <https://github.com/platformio/platformio/issues/306>`_) (`issue #306 <https://github.com/platformio/platformio/issues/306>`_)
* Fixed missing of `framework-mbed <http://docs.platformio.org/en/latest/frameworks/mbed.html>`_ * Fixed missing `framework-mbed <http://docs.platformio.org/en/latest/frameworks/mbed.html>`_
package for `teensy <http://docs.platformio.org/en/latest/platforms/teensy.html>`_ package for `teensy <http://docs.platformio.org/en/latest/platforms/teensy.html>`_
platform platform
(`issue #305 <https://github.com/platformio/platformio/issues/305>`_) (`issue #305 <https://github.com/platformio/platformio/issues/305>`_)

View File

@ -1,7 +1,7 @@
# Copyright (C) Ivan Kravets <me@ikravets.com> # Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details. # See LICENSE for details.
VERSION = (2, 3, "4.dev2") VERSION = (2, 3, "4.dev3")
__version__ = ".".join([str(s) for s in VERSION]) __version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio" __title__ = "platformio"

View File

@ -3,8 +3,6 @@
import os import os
import re import re
import sys
from glob import glob
from imp import load_source from imp import load_source
from os.path import isdir, isfile, join from os.path import isdir, isfile, join
@ -374,7 +372,7 @@ class BasePlatform(object):
self._found_error = False self._found_error = False
try: try:
# test that SCons is installed correctly # test that SCons is installed correctly
assert self.test_scons() assert util.test_scons()
result = util.exec_command( result = util.exec_command(
[ [
@ -397,39 +395,6 @@ class BasePlatform(object):
return result 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): def on_run_out(self, line):
self._echo_line(line, level=3) self._echo_line(line, level=3)

View File

@ -7,13 +7,13 @@ import json
import os import os
import re import re
import subprocess import subprocess
import sys
from glob import glob
from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, from os.path import (abspath, basename, dirname, expanduser, isdir, isfile,
join, realpath) join, realpath)
from platform import system, uname from platform import system, uname
from threading import Thread from threading import Thread
import requests
from platformio import __apiurl__, __version__, exception from platformio import __apiurl__, __version__, exception
try: try:
@ -277,12 +277,14 @@ def get_logicaldisks():
def get_request_defheaders(): def get_request_defheaders():
import requests
return {"User-Agent": "PlatformIO/%s CI/%d %s" % ( return {"User-Agent": "PlatformIO/%s CI/%d %s" % (
__version__, int(is_ci()), requests.utils.default_user_agent() __version__, int(is_ci()), requests.utils.default_user_agent()
)} )}
def get_api_result(path, params=None, data=None): def get_api_result(path, params=None, data=None):
import requests
result = None result = None
r = None r = None
@ -312,6 +314,53 @@ def get_api_result(path, params=None, data=None):
return result 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 @memoized
def _lookup_boards(): def _lookup_boards():
boards = {} boards = {}

View File

@ -6,7 +6,21 @@ from platform import system
from setuptools import find_packages, setup from setuptools import find_packages, setup
from platformio import (__author__, __description__, __email__, __license__, 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( setup(
name=__title__, name=__title__,
@ -17,14 +31,7 @@ setup(
author_email=__email__, author_email=__email__,
url=__url__, url=__url__,
license=__license__, license=__license__,
install_requires=[ install_requires=install_requires,
"bottle",
"click>=3.2",
"lockfile>=0.9.1",
"pyserial",
"requests>=2.4.0",
"SCons"
] + (["colorama"] if system() == "Windows" else []),
packages=find_packages(), packages=find_packages(),
package_data={ package_data={
"platformio": [ "platformio": [