summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--review.py2
-rw-r--r--src/engine/SCons/Action.py32
-rw-r--r--src/engine/SCons/Conftest.py1
-rw-r--r--src/engine/SCons/Errors.py4
-rw-r--r--src/engine/SCons/Executor.py2
-rw-r--r--src/engine/SCons/SConf.py16
-rw-r--r--src/engine/SCons/Scanner/__init__.py2
-rw-r--r--src/engine/SCons/Script/SConscript.py2
-rw-r--r--src/engine/SCons/Script/__init__.py2
-rw-r--r--src/engine/SCons/Taskmaster.py10
-rw-r--r--src/engine/SCons/Tool/__init__.py4
-rw-r--r--src/engine/SCons/Tool/g++.py5
-rw-r--r--src/engine/SCons/Tool/gas.py5
-rw-r--r--src/engine/SCons/Tool/gcc.py2
-rw-r--r--src/engine/SCons/Tool/link.py2
-rw-r--r--src/engine/SCons/Tool/swig.py2
-rw-r--r--src/engine/SCons/Util.py19
-rw-r--r--src/engine/SCons/dblite.py16
-rw-r--r--src/script/scons.py10
19 files changed, 76 insertions, 62 deletions
diff --git a/review.py b/review.py
index 72e187e..8d033ed 100644
--- a/review.py
+++ b/review.py
@@ -1627,7 +1627,7 @@ def FormatSubversionPropertyChanges(filename, props):
See the following doctest for example.
- >>> print FormatSubversionPropertyChanges('foo.cc', [('svn:eol-style', 'LF')])
+ >>> print(FormatSubversionPropertyChanges('foo.cc', [('svn:eol-style', 'LF')]))
Property changes on: foo.cc
___________________________________________________________________
Added: svn:eol-style
diff --git a/src/engine/SCons/Action.py b/src/engine/SCons/Action.py
index e8574cb..68c93b4 100644
--- a/src/engine/SCons/Action.py
+++ b/src/engine/SCons/Action.py
@@ -237,9 +237,9 @@ def _code_contents(code):
# The code contents depends on the number of local variables
# but not their actual names.
- contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames)))
+ contents.append(str.encode("%s,%s" % (code.co_argcount, len(code.co_varnames))))
try:
- contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars)))
+ contents.append(str.encode(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars))))
except AttributeError:
# Older versions of Python do not support closures.
contents.append(",0,0")
@@ -252,19 +252,19 @@ def _code_contents(code):
# Note that we also always ignore the first entry of co_consts
# which contains the function doc string. We assume that the
# function does not access its doc string.
- contents.append(',(' + ','.join(map(_object_contents,code.co_consts[1:])) + ')')
+ contents.append(b',(' + b','.join(map(_object_contents,code.co_consts[1:])) + b')')
# The code contents depends on the variable names used to
# accessed global variable, as changing the variable name changes
# the variable actually accessed and therefore changes the
# function result.
- contents.append(',(' + ','.join(map(_object_contents,code.co_names)) + ')')
+ contents.append(b',(' + b','.join(map(_object_contents,code.co_names)) + b')')
# The code contents depends on its actual code!!!
- contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')')
+ contents.append(b',(' + remove_set_lineno_codes(code.co_code) + b')')
- return ''.join(contents)
+ return b''.join(contents)
def _function_contents(func):
@@ -274,9 +274,9 @@ def _function_contents(func):
# The function contents depends on the value of defaults arguments
if func.__defaults__:
- contents.append(',(' + ','.join(map(_object_contents,func.__defaults__)) + ')')
+ contents.append(b',(' + b','.join(map(_object_contents,func.__defaults__)) + b')')
else:
- contents.append(',()')
+ contents.append(b',()')
# The function contents depends on the closure captured cell values.
try:
@@ -290,9 +290,9 @@ def _function_contents(func):
xxx = [_object_contents(x.cell_contents) for x in closure]
except AttributeError:
xxx = []
- contents.append(',(' + ','.join(xxx) + ')')
+ contents.append(b',(' + b','.join(xxx) + b')')
- return ''.join(contents)
+ return b''.join(contents)
def _actionAppend(act1, act2):
@@ -434,14 +434,20 @@ class ActionBase(object):
def get_contents(self, target, source, env):
result = [ self.get_presig(target, source, env) ]
+ def clean (u):
+ if isinstance (u, bytes):
+ return u
+ elif isinstance (u, str):
+ return bytes (u, 'utf-8')
+ result = [ clean(r) for r in result ]
# This should never happen, as the Action() factory should wrap
# the varlist, but just in case an action is created directly,
# we duplicate this check here.
vl = self.get_varlist(target, source, env)
if is_String(vl): vl = (vl,)
for v in vl:
- result.append(env.subst('${'+v+'}'))
- return ''.join(result)
+ result.append(bytes(env.subst('${'+v+'}'), 'utf-8'))
+ return b''.join(result)
def __add__(self, other):
return _actionAppend(self, other)
@@ -1135,7 +1141,7 @@ class ListAction(ActionBase):
Simple concatenation of the signatures of the elements.
"""
- return "".join([x.get_contents(target, source, env) for x in self.list])
+ return b"".join([x.get_contents(target, source, env) for x in self.list])
def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
show=_null, execute=_null, chdir=_null, executor=None):
diff --git a/src/engine/SCons/Conftest.py b/src/engine/SCons/Conftest.py
index d466278..4e2a3e8 100644
--- a/src/engine/SCons/Conftest.py
+++ b/src/engine/SCons/Conftest.py
@@ -101,7 +101,6 @@ Autoconf-like configuration support; low level implementation of tests.
#
import re
-from types import IntType
#
# PUBLIC VARIABLES
diff --git a/src/engine/SCons/Errors.py b/src/engine/SCons/Errors.py
index 3b8c3f9..54e888c 100644
--- a/src/engine/SCons/Errors.py
+++ b/src/engine/SCons/Errors.py
@@ -32,8 +32,6 @@ __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import SCons.Util
-import exceptions
-
class BuildError(Exception):
""" Errors occuring while building.
@@ -163,7 +161,7 @@ def convert_to_BuildError(status, exc_info=None):
status=2,
exitstatus=2,
exc_info=exc_info)
- elif isinstance(status, exceptions.EnvironmentError):
+ elif isinstance(status, EnvironmentError):
# If an IOError/OSError happens, raise a BuildError.
# Report the name of the file or directory that caused the
# error, which might be different from the target being built
diff --git a/src/engine/SCons/Executor.py b/src/engine/SCons/Executor.py
index 6f2489b..68419b8 100644
--- a/src/engine/SCons/Executor.py
+++ b/src/engine/SCons/Executor.py
@@ -427,7 +427,7 @@ class Executor(object):
except KeyError:
pass
env = self.get_build_env()
- result = "".join([action.get_contents(self.get_all_targets(),
+ result = b"".join([action.get_contents(self.get_all_targets(),
self.get_all_sources(),
env)
for action in self.get_action_list()])
diff --git a/src/engine/SCons/SConf.py b/src/engine/SCons/SConf.py
index 987f88d..e14c5e0 100644
--- a/src/engine/SCons/SConf.py
+++ b/src/engine/SCons/SConf.py
@@ -175,13 +175,19 @@ class Streamer(object):
"""
def __init__(self, orig):
self.orig = orig
- self.s = io.StringIO()
+ try:
+ import StringIO
+ self.s = StringIO.StringIO()
+ except:
+ self.s = io.StringIO()
def write(self, str):
- if self.orig:
- self.orig.write(str)
- self.s.write(str)
-
+ try:
+ if self.orig:
+ self.orig.write(str)
+ self.s.write(str)
+ except:
+ print ('oops')
def writelines(self, lines):
for l in lines:
self.write(l + '\n')
diff --git a/src/engine/SCons/Scanner/__init__.py b/src/engine/SCons/Scanner/__init__.py
index 6ec8df9..8801094 100644
--- a/src/engine/SCons/Scanner/__init__.py
+++ b/src/engine/SCons/Scanner/__init__.py
@@ -325,7 +325,7 @@ class Classic(Current):
def __init__(self, name, suffixes, path_variable, regex, *args, **kw):
- self.cre = re.compile(regex, re.M)
+ self.cre = re.compile(SCons.Util.to_bytes(regex), re.M)
def _scan(node, env, path=(), self=self):
node = node.rfile()
diff --git a/src/engine/SCons/Script/SConscript.py b/src/engine/SCons/Script/SConscript.py
index fefffef..05cb6a6 100644
--- a/src/engine/SCons/Script/SConscript.py
+++ b/src/engine/SCons/Script/SConscript.py
@@ -257,7 +257,7 @@ def _SConscript(fs, *files, **kw):
pass
try:
try:
- exec(_file_, call_stack[-1].globals)
+ exec(_file_.read(), call_stack[-1].globals)
except SConscriptReturn:
pass
finally:
diff --git a/src/engine/SCons/Script/__init__.py b/src/engine/SCons/Script/__init__.py
index 9f2837c..e9e8b71 100644
--- a/src/engine/SCons/Script/__init__.py
+++ b/src/engine/SCons/Script/__init__.py
@@ -364,7 +364,7 @@ GlobalDefaultBuilders = [
]
for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
- exec("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
+ exec ("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
del name
# There are a handful of variables that used to live in the
diff --git a/src/engine/SCons/Taskmaster.py b/src/engine/SCons/Taskmaster.py
index 54d04a8..14ffe8c 100644
--- a/src/engine/SCons/Taskmaster.py
+++ b/src/engine/SCons/Taskmaster.py
@@ -518,13 +518,9 @@ class Task(object):
Raises a pending exception that was recorded while getting a
Task ready for execution.
"""
- exc = self.exc_info()[:]
- try:
- exc_type, exc_value, exc_traceback = exc
- except ValueError:
- exc_type, exc_value = exc
- exc_traceback = None
- raise exc_type(exc_value).with_traceback(exc_traceback)
+
+ import six
+ six.reraise(*self.exc_info())
class AlwaysTask(Task):
def needs_execute(self):
diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py
index ac180a9..1d5b504 100644
--- a/src/engine/SCons/Tool/__init__.py
+++ b/src/engine/SCons/Tool/__init__.py
@@ -114,7 +114,7 @@ class Tool(object):
if file:
file.close()
except ImportError as e:
- if str(e)!="No module named %s"%self.name:
+ if not str(e).startswith ("No module"):
raise SCons.Errors.EnvironmentError(e)
try:
import zipimport
@@ -144,7 +144,7 @@ class Tool(object):
file.close()
return module
except ImportError as e:
- if str(e)!="No module named %s"%self.name:
+ if not str(e).startswith("No module"):
raise SCons.Errors.EnvironmentError(e)
try:
import zipimport
diff --git a/src/engine/SCons/Tool/g++.py b/src/engine/SCons/Tool/g++.py
index e4da5fe..0e1c181 100644
--- a/src/engine/SCons/Tool/g++.py
+++ b/src/engine/SCons/Tool/g++.py
@@ -40,8 +40,7 @@ import subprocess
import SCons.Tool
import SCons.Util
-cplusplus = __import__('c++', globals(), locals(), [])
-
+cplusplus = __import__(__package__+'.c++', globals(), locals(), ['*'])
compilers = ['g++']
def generate(env):
@@ -75,7 +74,7 @@ def generate(env):
#line = pipe.stdout.read().strip()
#if line:
# env['CXXVERSION'] = line
- line = pipe.stdout.readline()
+ line = SCons.Util.to_str (pipe.stdout.readline())
match = re.search(r'[0-9]+(\.[0-9]+)+', line)
if match:
env['CXXVERSION'] = match.group(0)
diff --git a/src/engine/SCons/Tool/gas.py b/src/engine/SCons/Tool/gas.py
index 28f84db..d01bd60 100644
--- a/src/engine/SCons/Tool/gas.py
+++ b/src/engine/SCons/Tool/gas.py
@@ -33,7 +33,10 @@ selection method.
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
-as_module = __import__('as', globals(), locals(), [])
+try:
+ as_module = __import__('as', globals(), locals(), [])
+except:
+ as_module = __import__(__package__+'.as', globals(), locals(), ['*'])
assemblers = ['as', 'gas']
diff --git a/src/engine/SCons/Tool/gcc.py b/src/engine/SCons/Tool/gcc.py
index 4f87b24..72f9bfd 100644
--- a/src/engine/SCons/Tool/gcc.py
+++ b/src/engine/SCons/Tool/gcc.py
@@ -65,7 +65,7 @@ def generate(env):
#line = pipe.stdout.read().strip()
#if line:
# env['CCVERSION'] = line
- line = pipe.stdout.readline()
+ line = SCons.Util.to_str (pipe.stdout.readline())
match = re.search(r'[0-9]+(\.[0-9]+)+', line)
if match:
env['CCVERSION'] = match.group(0)
diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py
index 5539f62..864a018 100644
--- a/src/engine/SCons/Tool/link.py
+++ b/src/engine/SCons/Tool/link.py
@@ -42,7 +42,7 @@ import SCons.Warnings
from SCons.Tool.FortranCommon import isfortran
-cplusplus = __import__('c++', globals(), locals(), [])
+cplusplus = __import__(__package__+'.c++', globals(), locals(), ['*'])
issued_mixed_link_warning = False
diff --git a/src/engine/SCons/Tool/swig.py b/src/engine/SCons/Tool/swig.py
index d51a386..5d2264c 100644
--- a/src/engine/SCons/Tool/swig.py
+++ b/src/engine/SCons/Tool/swig.py
@@ -131,7 +131,7 @@ def _get_swig_version(env):
stdout = subprocess.PIPE)
if pipe.wait() != 0: return
- out = pipe.stdout.read()
+ out = SCons.Util.to_str (pipe.stdout.read())
match = re.search(r'SWIG Version\s+(\S+)$', out, re.MULTILINE)
if match:
return match.group(1)
diff --git a/src/engine/SCons/Util.py b/src/engine/SCons/Util.py
index f2e5325..00fde6c 100644
--- a/src/engine/SCons/Util.py
+++ b/src/engine/SCons/Util.py
@@ -37,7 +37,6 @@ import collections
# Don't "from types import ..." these because we need to get at the
# types module later to look for UnicodeType.
-InstanceType = types.InstanceType
MethodType = types.MethodType
FunctionType = types.FunctionType
try: str
@@ -1370,7 +1369,7 @@ def AddMethod(obj, function, name=None):
setattr(obj, name, MethodType(function, obj, obj.__class__))
else:
# "obj" is a class, so it gets an unbound method.
- setattr(obj, name, MethodType(function, None, obj))
+ setattr(obj, name, function)
def RenameFunction(function, name):
"""
@@ -1402,7 +1401,7 @@ else:
md5 = True
def MD5signature(s):
m = hashlib.md5()
- m.update(str(s))
+ m.update(to_bytes(str(s)))
return m.hexdigest()
def MD5filesignature(fname, chunksize=65536):
@@ -1412,7 +1411,7 @@ else:
blck = f.read(chunksize)
if not blck:
break
- m.update(str(blck))
+ m.update(to_bytes (str(blck)))
f.close()
return m.hexdigest()
@@ -1486,6 +1485,18 @@ class NullSeq(Null):
del __revision__
+def to_bytes (s):
+ if bytes is str:
+ return s
+ else:
+ return bytes (s, 'utf-8')
+
+def to_str (s):
+ if bytes is str:
+ return s
+ else:
+ return str (s, 'utf-8')
+
# Local Variables:
# tab-width:4
# indent-tabs-mode:nil
diff --git a/src/engine/SCons/dblite.py b/src/engine/SCons/dblite.py
index 89b9856..99af54a 100644
--- a/src/engine/SCons/dblite.py
+++ b/src/engine/SCons/dblite.py
@@ -16,14 +16,10 @@ ignore_corrupt_dbfiles = 0
def corruption_warning(filename):
print("Warning: Discarding corrupt database:", filename)
-try: str
-except NameError:
- def is_string(s):
- return isinstance(s, str)
-else:
- def is_string(s):
- return type(s) in (str, str)
-
+def is_string(s):
+ return isinstance(s, str)
+def is_bytes(s):
+ return isinstance (s, bytes)
try:
str('a')
except NameError:
@@ -148,8 +144,8 @@ class dblite(object):
self._check_writable()
if (not is_string(key)):
raise TypeError("key `%s' must be a string but is %s" % (key, type(key)))
- if (not is_string(value)):
- raise TypeError("value `%s' must be a string but is %s" % (value, type(value)))
+ if (not is_bytes(value)):
+ raise TypeError("value `%s' must be a bytes but is %s" % (value, type(value)))
self._dict[key] = value
self._needs_sync = 0o001
diff --git a/src/script/scons.py b/src/script/scons.py
index 46e6d2b..89eef34 100644
--- a/src/script/scons.py
+++ b/src/script/scons.py
@@ -55,11 +55,11 @@ import sys
# engine modules if they're in either directory.
-if sys.version_info >= (3,0,0):
- msg = "scons: *** SCons version %s does not run under Python version %s.\n\
-Python 3 is not yet supported.\n"
- sys.stderr.write(msg % (__version__, sys.version.split()[0]))
- sys.exit(1)
+## if sys.version_info >= (3,0,0):
+## msg = "scons: *** SCons version %s does not run under Python version %s.\n\
+## Python 3 is not yet supported.\n"
+## sys.stderr.write(msg % (__version__, sys.version.split()[0]))
+## sys.exit(1)
script_dir = sys.path[0]