Hi Neal,

thanks for all your efforts, trying to get SCons running with Python3. I created a diff of the (current trunk + 2to3) against your repo, please find the patch file attached.

Looking at the changes, I think it might be worth a try, and compile the patch into a little fixer script of its own. Then we could continue with our basic development on Python v2.6 or v2.7, but easily create a Python3 version by applying our personal "fixer" and 2to3 on top of it.

Just as an idea...

Best regards,

Dirk

On 09.09.2013 16:50, Neal Becker wrote:
Gary Oberbrunner wrote:

[...]
The bulk of those changes are the result of running 2to3-3.3 script.  If you
want to see my manual changes, run 2to3 on the previous hg version, and then
diff that to mine.


diff -r orig/QMTest/TestCmd.py scons-p3/QMTest/TestCmd.py
0a1
> from __future__ import print_function
953c954
<                 print(str("Preserved directory " + dir + "\n"), end=' ')
---
>                 print("Preserved directory " + dir + "\n", end=' ')
diff -r orig/review.py scons-p3/review.py
1630c1630
<   >>> print FormatSubversionPropertyChanges('foo.cc', [('svn:eol-style', 'LF')])
---
>   >>> print(FormatSubversionPropertyChanges('foo.cc', [('svn:eol-style', 'LF')]))
diff -r orig/src/engine/SCons/Action.py scons-p3/src/engine/SCons/Action.py
240c240
<     contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames)))
---
>     contents.append(str.encode("%s,%s" % (code.co_argcount, len(code.co_varnames))))
242c242
<         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))))
255c255
<     contents.append(',(' + ','.join(map(_object_contents,code.co_consts[1:])) + ')')
---
>     contents.append(b',(' + b','.join(map(_object_contents,code.co_consts[1:])) + b')')
261c261
<     contents.append(',(' + ','.join(map(_object_contents,code.co_names)) + ')')
---
>     contents.append(b',(' + b','.join(map(_object_contents,code.co_names)) + b')')
265c265
<     contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')')
---
>     contents.append(b',(' + remove_set_lineno_codes(code.co_code) + b')')
267c267
<     return ''.join(contents)
---
>     return b''.join(contents)
277c277
<         contents.append(',(' + ','.join(map(_object_contents,func.__defaults__)) + ')')
---
>         contents.append(b',(' + b','.join(map(_object_contents,func.__defaults__)) + b')')
279c279
<         contents.append(',()')
---
>         contents.append(b',()')
293c293
<     contents.append(',(' + ','.join(xxx) + ')')
---
>     contents.append(b',(' + b','.join(xxx) + b')')
295c295
<     return ''.join(contents)
---
>     return b''.join(contents)
436a437
>         result = [ SCons.Util.to_bytes(r) for r in result ]
443,444c444,445
<             result.append(env.subst('${'+v+'}'))
<         return ''.join(result)
---
>             result.append(SCons.Util.to_bytes(env.subst('${'+v+'}')))
>         return b''.join(result)
1138c1139
<         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])
diff -r orig/src/engine/SCons/Conftest.py scons-p3/src/engine/SCons/Conftest.py
104d103
< from types import IntType
diff -r orig/src/engine/SCons/dblite.py scons-p3/src/engine/SCons/dblite.py
19,26c19,22
< 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)
32a29,30
> if bytes is not str:
>     dblite_suffix += '.p3'
151,152c149,150
<     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)))
245d242
<   print("OK")
diff -r orig/src/engine/SCons/Errors.py scons-p3/src/engine/SCons/Errors.py
35,36d34
< import exceptions
< 
166c164
<     elif isinstance(status, exceptions.EnvironmentError):
---
>     elif isinstance(status, EnvironmentError):
diff -r orig/src/engine/SCons/Executor.py scons-p3/src/engine/SCons/Executor.py
430c430
<         result = "".join([action.get_contents(self.get_all_targets(),
---
>         result = b"".join([action.get_contents(self.get_all_targets(),
diff -r orig/src/engine/SCons/Scanner/__init__.py scons-p3/src/engine/SCons/Scanner/__init__.py
328c328
<         self.cre = re.compile(regex, re.M)
---
>         self.cre = re.compile(SCons.Util.to_bytes(regex), re.M)
396a397
>         include = list (map (SCons.Util.to_str, include))
408c409
<         return SCons.Node.FS._my_normcase(' '.join(include))
---
>         return SCons.Node.FS._my_normcase(b' '.join(include))
diff -r orig/src/engine/SCons/SConf.py scons-p3/src/engine/SCons/SConf.py
178c178,182
<         self.s = io.StringIO()
---
>         try:
>             import StringIO
>             self.s = StringIO.StringIO()
>         except:
>             self.s = io.StringIO()
181,184c185,190
<         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')
diff -r orig/src/engine/SCons/Script/__init__.py scons-p3/src/engine/SCons/Script/__init__.py
367c367
<     exec("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
---
>     exec ("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
diff -r orig/src/engine/SCons/Script/SConscript.py scons-p3/src/engine/SCons/Script/SConscript.py
260c260
<                             exec(_file_, call_stack[-1].globals)
---
>                             exec(_file_.read(), call_stack[-1].globals)
diff -r orig/src/engine/SCons/Taskmaster.py scons-p3/src/engine/SCons/Taskmaster.py
521,527c521,523
<         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())
diff -r orig/src/engine/SCons/Tool/gas.py scons-p3/src/engine/SCons/Tool/gas.py
36c36,39
< as_module = __import__('as', globals(), locals(), [])
---
> try:
>     as_module = __import__('as', globals(), locals(), [])
> except:
>     as_module = __import__(__package__+'.as', globals(), locals(), ['*'])
diff -r orig/src/engine/SCons/Tool/gcc.py scons-p3/src/engine/SCons/Tool/gcc.py
68c68
<         line = pipe.stdout.readline()
---
>         line = SCons.Util.to_str (pipe.stdout.readline())
diff -r orig/src/engine/SCons/Tool/g++.py scons-p3/src/engine/SCons/Tool/g++.py
43,44c43
< cplusplus = __import__('c++', globals(), locals(), [])
< 
---
> cplusplus = __import__(__package__+'.c++', globals(), locals(), ['*'])
78c77
<         line = pipe.stdout.readline()
---
>         line = SCons.Util.to_str (pipe.stdout.readline())
diff -r orig/src/engine/SCons/Tool/__init__.py scons-p3/src/engine/SCons/Tool/__init__.py
117c117
<                 if str(e)!="No module named %s"%self.name:
---
>                 if not str(e).startswith ("No module"):
147c147
<                     if str(e)!="No module named %s"%self.name:
---
>                     if not str(e).startswith("No module"):
diff -r orig/src/engine/SCons/Tool/link.py scons-p3/src/engine/SCons/Tool/link.py
45c45
< cplusplus = __import__('c++', globals(), locals(), [])
---
> cplusplus = __import__(__package__+'.c++', globals(), locals(), ['*'])
diff -r orig/src/engine/SCons/Tool/swig.py scons-p3/src/engine/SCons/Tool/swig.py
134c134
<     out = pipe.stdout.read()
---
>     out = SCons.Util.to_str (pipe.stdout.read())
diff -r orig/src/engine/SCons/Util.py scons-p3/src/engine/SCons/Util.py
40d39
< InstanceType    = types.InstanceType
1373c1372
<         setattr(obj, name, MethodType(function, None, obj))
---
>         setattr(obj, name, function)
1405c1404
<             m.update(str(s))
---
>             m.update(to_bytes(str(s)))
1415c1414
<                 m.update(str(blck))
---
>                 m.update(to_bytes (str(blck)))
1487a1487,1498
> 
> def to_bytes (s):
>     if isinstance (s, bytes) or 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')
diff -r orig/src/script/scons.py scons-p3/src/script/scons.py
58,62c58,62
< 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)
diff -r orig/src/setup.py scons-p3/src/setup.py
49,56d48
< # Exit with error if trying to install with Python >= 3.0
< if sys.version_info >= (3,0,0):
<     msg = "scons: *** SCons does not run under Python version %s.\n\
< Python 3 and above are not yet supported.\n"
<     sys.stderr.write(msg % (sys.version.split()[0]))
<     sys.exit(1)
< 
< 
_______________________________________________
Scons-dev mailing list
[email protected]
http://two.pairlist.net/mailman/listinfo/scons-dev

Reply via email to