2016-03-11 12:54:42 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# Copyright 2016 Google Inc.
|
|
|
|
#
|
|
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
|
|
# found in the LICENSE file.
|
|
|
|
|
|
|
|
|
|
|
|
"""Utilities for manipulating the win_toolchain.json file."""
|
|
|
|
|
|
|
|
|
|
|
|
import json
|
2016-03-17 16:01:33 +00:00
|
|
|
import os
|
|
|
|
import stat
|
2016-03-11 12:54:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
PLACEHOLDER = '<(TOOLCHAIN_BASE_DIR)'
|
|
|
|
|
|
|
|
|
|
|
|
def _replace_prefix(val, before, after):
|
|
|
|
"""Replace the given prefix with the given string."""
|
|
|
|
if val.startswith(before):
|
|
|
|
return val.replace(before, after, 1)
|
|
|
|
return val
|
|
|
|
|
|
|
|
|
|
|
|
def _replace(val, before, after):
|
|
|
|
"""Replace occurrences of one string with another within the data."""
|
|
|
|
if isinstance(val, basestring):
|
|
|
|
return _replace_prefix(val, before, after)
|
|
|
|
elif isinstance(val, (list, tuple)):
|
|
|
|
return [_replace(elem, before, after) for elem in val]
|
|
|
|
elif isinstance(val, dict):
|
|
|
|
return {_replace(k, before, after):
|
|
|
|
_replace(v, before, after) for k, v in val.iteritems()}
|
|
|
|
raise Exception('Cannot replace variable: %s' % val)
|
|
|
|
|
|
|
|
|
|
|
|
def _replace_in_file(filename, before, after):
|
|
|
|
"""Replace occurrences of one string with another within the file."""
|
2016-03-17 16:01:33 +00:00
|
|
|
# Make the file writeable, or the below won't work.
|
|
|
|
os.chmod(filename, stat.S_IWRITE)
|
|
|
|
|
2016-03-11 12:54:42 +00:00
|
|
|
with open(filename) as f:
|
|
|
|
contents = json.load(f)
|
|
|
|
new_contents = _replace(contents, before, after)
|
|
|
|
with open(filename, 'w') as f:
|
|
|
|
json.dump(new_contents, f)
|
|
|
|
|
|
|
|
|
|
|
|
def abstract(win_toolchain_json, old_path):
|
|
|
|
"""Replace absolute paths in win_toolchain.json with placeholders."""
|
|
|
|
_replace_in_file(win_toolchain_json, old_path, PLACEHOLDER)
|
|
|
|
|
|
|
|
|
|
|
|
def resolve(win_toolchain_json, new_path):
|
|
|
|
"""Replace placeholders in win_toolchain.json with absolute paths."""
|
|
|
|
_replace_in_file(win_toolchain_json, PLACEHOLDER, new_path)
|