Skip to content

Commit

Permalink
Update to waf 1.8.17.
Browse files Browse the repository at this point in the history
  • Loading branch information
karllinden committed Dec 12, 2015
1 parent f3cf9d6 commit bb8e749
Show file tree
Hide file tree
Showing 32 changed files with 306 additions and 141 deletions.
1 change: 1 addition & 0 deletions .wafupdaterc
Expand Up @@ -134,4 +134,5 @@ WAFLIB_STRIP_EXTRAS="
why
win32_opts
xcode
xcode6
"
2 changes: 1 addition & 1 deletion waf
Expand Up @@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.

import os, sys, inspect

VERSION="1.8.14"
VERSION="1.8.17"
REVISION="x"
GIT="x"
INSTALL="x"
Expand Down
25 changes: 12 additions & 13 deletions waflib/Build.py
Expand Up @@ -44,6 +44,10 @@
POST_BOTH = 2
"""Post mode: post the task generators at once, then re-check them for each group"""

PROTOCOL = -1
if sys.platform == 'cli':
PROTOCOL = 0

class BuildContext(Context.Context):
'''executes the build'''

Expand Down Expand Up @@ -322,7 +326,7 @@ def store(self):
try:
waflib.Node.pickle_lock.acquire()
waflib.Node.Nod3 = self.node_class
x = cPickle.dumps(data, -1)
x = cPickle.dumps(data, PROTOCOL)
finally:
waflib.Node.pickle_lock.release()

Expand Down Expand Up @@ -821,17 +825,10 @@ def post(self):
else:
y = self.path.find_resource(x)
if not y:
if Logs.verbose:
Logs.warn('Could not find %s immediately (may cause broken builds)' % x)
idx = self.generator.bld.get_group_idx(self)
for tg in self.generator.bld.groups[idx]:
if not isinstance(tg, inst) and id(tg) != id(self):
tg.post()
y = self.path.find_resource(x)
if y:
break
if os.path.isabs(x):
y = self.bld.root.make_node(x)
else:
raise Errors.WafError('Could not find %r in %r' % (x, self.path))
y = self.path.make_node(x)
buf.append(y)
self.inputs = buf

Expand Down Expand Up @@ -1039,6 +1036,7 @@ def build(bld):
:param postpone: execute the task immediately to perform the installation
:type postpone: bool
"""
assert(dest)
tsk = inst(env=env or self.env)
tsk.bld = self
tsk.path = cwd or self.path
Expand Down Expand Up @@ -1075,6 +1073,7 @@ def build(bld):
:param postpone: execute the task immediately to perform the installation
:type postpone: bool
"""
assert(dest)
tsk = inst(env=env or self.env)
tsk.bld = self
tsk.path = cwd or self.path
Expand Down Expand Up @@ -1107,11 +1106,11 @@ def build(bld):
:param relative_trick: make the symlink relative (default: ``False``)
:type relative_trick: bool
"""

if Utils.is_win32:
# symlinks *cannot* work on that platform
# TODO waf 1.9 - replace by install_as
return

assert(dest)
tsk = inst(env=env or self.env)
tsk.bld = self
tsk.dest = dest
Expand Down
20 changes: 7 additions & 13 deletions waflib/Configure.py
Expand Up @@ -151,14 +151,8 @@ def execute(self):
if ver:
app = "%s (%s)" % (app, ver)

now = time.ctime()
pyver = sys.hexversion
systype = sys.platform
args = " ".join(sys.argv)
wafver = Context.WAFVERSION
abi = Context.ABI
self.to_log(conf_template % vars())

params = {'now': time.ctime(), 'pyver': sys.hexversion, 'systype': sys.platform, 'args': " ".join(sys.argv), 'wafver': Context.WAFVERSION, 'abi': Context.ABI, 'app': app}
self.to_log(conf_template % params)
self.msg('Setting top to', self.srcnode.abspath())
self.msg('Setting out to', self.bldnode.abspath())

Expand Down Expand Up @@ -208,17 +202,17 @@ def prepare_env(self, env):
"""
if not env.PREFIX:
if Options.options.prefix or Utils.is_win32:
env.PREFIX = os.path.abspath(os.path.expanduser(Options.options.prefix))
env.PREFIX = Utils.sane_path(Options.options.prefix)
else:
env.PREFIX = ''
if not env.BINDIR:
if Options.options.bindir:
env.BINDIR = os.path.abspath(os.path.expanduser(Options.options.bindir))
env.BINDIR = Utils.sane_path(Options.options.bindir)
else:
env.BINDIR = Utils.subst_vars('${PREFIX}/bin', env)
if not env.LIBDIR:
if Options.options.libdir:
env.LIBDIR = os.path.abspath(os.path.expanduser(Options.options.libdir))
env.LIBDIR = Utils.sane_path(Options.options.libdir)
else:
env.LIBDIR = Utils.subst_vars('${PREFIX}/lib%s' % Utils.lib64(), env)

Expand Down Expand Up @@ -347,6 +341,7 @@ def fun(*k, **kw):
if mandatory:
raise

fun.__name__ = f.__name__
setattr(ConfigurationContext, f.__name__, fun)
setattr(Build.BuildContext, f.__name__, fun)
return f
Expand Down Expand Up @@ -422,7 +417,7 @@ def find_file(self, filename, path_list=[]):
"""
for n in Utils.to_list(filename):
for d in Utils.to_list(path_list):
p = os.path.join(d, n)
p = os.path.expanduser(os.path.join(d, n))
if os.path.exists(p):
return p
self.fatal('Could not find %r' % filename)
Expand Down Expand Up @@ -529,7 +524,6 @@ def find_binary(self, filenames, exts, paths):
return x
return None


@conf
def run_build(self, *k, **kw):
"""
Expand Down
12 changes: 8 additions & 4 deletions waflib/Context.py
Expand Up @@ -11,13 +11,13 @@
import waflib.Node

# the following 3 constants are updated on each new release (do not touch)
HEXVERSION=0x1080e00
HEXVERSION=0x1081100
"""Constant updated on new releases"""

WAFVERSION="1.8.14"
WAFVERSION="1.8.17"
"""Constant updated on new releases"""

WAFREVISION="ce8234c396bb246a20ea9f51594ee051d5b378e7"
WAFREVISION="cd7579a727d1b390bf9cbf111c1b20e811370bc0"
"""Git revision when the waf version is updated"""

ABI = 98
Expand Down Expand Up @@ -307,6 +307,10 @@ def recurse(self, dirs, name=None, mandatory=True, once=True, encoding=None):
elif not node:
if not mandatory:
continue
try:
os.listdir(d)
except OSError:
raise Errors.WafError('Cannot read the folder %r' % d)
raise Errors.WafError('No wscript file in directory %s' % d)

def exec_command(self, cmd, **kw):
Expand Down Expand Up @@ -610,7 +614,7 @@ def load_special_tools(self, var, ban=[]):
doban = False
for b in ban:
r = b.replace("*", ".*")
if re.match(b, f):
if re.match(r, f):
doban = True
if not doban:
f = f.replace('.py', '')
Expand Down
11 changes: 8 additions & 3 deletions waflib/Logs.py
Expand Up @@ -6,7 +6,7 @@
logging, colors, terminal width and pretty-print
"""

import os, re, traceback, sys, types
import os, re, traceback, sys
from waflib import Utils, ansiterm

if not os.environ.get('NOSYNC', False):
Expand Down Expand Up @@ -43,6 +43,11 @@

indicator = '\r\x1b[K%s%s%s'

try:
unicode
except NameError:
unicode = None

def enable_colors(use):
if use == 1:
if not (sys.stderr.isatty() or sys.stdout.isatty()):
Expand Down Expand Up @@ -150,7 +155,7 @@ def emit(self, record):
def emit_override(self, record, **kw):
self.terminator = getattr(record, 'terminator', '\n')
stream = self.stream
if hasattr(types, "UnicodeType"):
if unicode:
# python2
msg = self.formatter.format(record)
fs = '%s' + self.terminator
Expand Down Expand Up @@ -316,7 +321,7 @@ def free_logger(logger):
for x in logger.handlers:
x.close()
logger.removeHandler(x)
except Exception as e:
except Exception:
pass

def pprint(col, msg, label='', sep='\n'):
Expand Down
74 changes: 67 additions & 7 deletions waflib/Node.py
Expand Up @@ -59,14 +59,11 @@
recursive traversal in :py:meth:`waflib.Node.Node.ant_glob`
"""

# TODO waf 1.9
split_path = Utils.split_path_unix
# TODO remove in waf 1.9
split_path = Utils.split_path
split_path_unix = Utils.split_path_unix
split_path_cygwin = Utils.split_path_cygwin
split_path_win32 = Utils.split_path_win32
if sys.platform == 'cygwin':
split_path = split_path_cygwin
elif Utils.is_win32:
split_path = split_path_win32

class Node(object):
"""
Expand Down Expand Up @@ -152,6 +149,69 @@ def build(bld):
"""
Utils.writef(self.abspath(), data, flags, encoding)

def read_json(self, convert=True, encoding='utf-8'):
"""
Read and parse the contents of this node as JSON::
def build(bld):
bld.path.find_node('abc.json').read_json()
Note that this by default automatically decodes unicode strings on Python2, unlike what the Python JSON module does.
:type convert: boolean
:param convert: Prevents decoding of unicode strings on Python2
:type encoding: string
:param encoding: The encoding of the file to read. This default to UTF8 as per the JSON standard
:rtype: object
:return: Parsed file contents
"""
import json # Python 2.6 and up
object_pairs_hook = None
if convert and sys.hexversion < 0x3000000:
try:
_type = unicode
except NameError:
_type = str

def convert(value):
if isinstance(value, list):
return [convert(element) for element in value]
elif isinstance(value, _type):
return str(value)
else:
return value

def object_pairs(pairs):
return dict((str(pair[0]), convert(pair[1])) for pair in pairs)

object_pairs_hook = object_pairs

return json.loads(self.read(encoding=encoding), object_pairs_hook=object_pairs_hook)

def write_json(self, data, pretty=True):
"""
Writes a python object as JSON to disk. Files are always written as UTF8 as per the JSON standard::
def build(bld):
bld.path.find_node('xyz.json').write_json(199)
:type data: object
:param data: The data to write to disk
:type pretty: boolean
:param pretty: Determines if the JSON will be nicely space separated
"""
import json # Python 2.6 and up
indent = 2
separators = (',', ': ')
sort_keys = pretty
newline = os.linesep
if not pretty:
indent = None
separators = (',', ':')
newline = ''
output = json.dumps(data, indent=indent, separators=separators, sort_keys=sort_keys) + newline
self.write(output, encoding='utf-8')

def chmod(self, val):
"""
Change file/dir permissions::
Expand Down Expand Up @@ -251,7 +311,7 @@ def find_node(self, lst):
cur.children = self.dict_class()
else:
try:
cur = cur.children[x]
cur = ch[x]
continue
except KeyError:
pass
Expand Down
2 changes: 1 addition & 1 deletion waflib/Options.py
Expand Up @@ -256,7 +256,7 @@ def parse_args(self, _args=None):
commands.append(arg)

if options.destdir:
options.destdir = os.path.abspath(os.path.expanduser(options.destdir))
options.destdir = Utils.sane_path(options.destdir)

if options.verbose >= 1:
self.load('errcheck')
Expand Down
7 changes: 7 additions & 0 deletions waflib/Runner.py
Expand Up @@ -278,6 +278,13 @@ def error_handler(self, tsk):
:param tsk: task
:type tsk: :py:attr:`waflib.Task.TaskBase`
"""
if hasattr(tsk, 'scan') and hasattr(tsk, 'uid'):
# TODO waf 1.9 - this breaks encapsulation
key = (tsk.uid(), 'imp')
try:
del self.bld.task_sigs[key]
except KeyError:
pass
if not self.bld.keep:
self.stop = True
self.error.append(tsk)
Expand Down
12 changes: 8 additions & 4 deletions waflib/Scripting.py
Expand Up @@ -46,6 +46,7 @@ def waf_entry_point(current_directory, version, wafdir):
# perhaps extract 'wscript' as a constant
if os.path.basename(potential_wscript) == 'wscript' and os.path.isfile(potential_wscript):
# need to explicitly normalize the path, as it may contain extra '/.'
# TODO abspath?
current_directory = os.path.normpath(os.path.dirname(potential_wscript))
sys.argv.pop(1)

Expand All @@ -62,11 +63,14 @@ def waf_entry_point(current_directory, version, wafdir):
break

# if --top is provided assume the build started in the top directory
for x in sys.argv:
for i, x in enumerate(sys.argv):
# WARNING: this modifies sys.argv
if x.startswith('--top='):
Context.run_dir = Context.top_dir = x[6:]
Context.run_dir = Context.top_dir = Utils.sane_path(x[6:])
sys.argv[i] = '--top=' + Context.run_dir
if x.startswith('--out='):
Context.out_dir = x[6:]
Context.out_dir = Utils.sane_path(x[6:])
sys.argv[i] = '--out=' + Context.out_dir

# try to find a lock file (if the project was configured)
# at the same time, store the first wscript file seen
Expand Down Expand Up @@ -137,7 +141,7 @@ def waf_entry_point(current_directory, version, wafdir):
sys.exit(1)

try:
set_main_module(os.path.join(Context.run_dir, Context.WSCRIPT_FILE))
set_main_module(os.path.normpath(os.path.join(Context.run_dir, Context.WSCRIPT_FILE)))
except Errors.WafError as e:
Logs.pprint('RED', e.verbose_msg)
Logs.error(str(e))
Expand Down

0 comments on commit bb8e749

Please sign in to comment.