diff options
author | Timothy J Fontaine <tjfontaine@gmail.com> | 2013-11-10 15:15:34 -0800 |
---|---|---|
committer | Timothy J Fontaine <tjfontaine@gmail.com> | 2013-11-10 15:15:34 -0800 |
commit | 201098535443ef6588b0fd176a425fdf3213ee70 (patch) | |
tree | 3259766e34c4a70f087c0ea52c16e0bc74eb11a7 /tools/gyp/pylib/gyp/mac_tool.py | |
parent | 3dcc9b93e1e4d80aa15a40a9d82a6b9f0bef0ec0 (diff) | |
download | android-node-v8-201098535443ef6588b0fd176a425fdf3213ee70.tar.gz android-node-v8-201098535443ef6588b0fd176a425fdf3213ee70.tar.bz2 android-node-v8-201098535443ef6588b0fd176a425fdf3213ee70.zip |
gyp: update to bebdcea
Diffstat (limited to 'tools/gyp/pylib/gyp/mac_tool.py')
-rwxr-xr-x | tools/gyp/pylib/gyp/mac_tool.py | 73 |
1 files changed, 57 insertions, 16 deletions
diff --git a/tools/gyp/pylib/gyp/mac_tool.py b/tools/gyp/pylib/gyp/mac_tool.py index c06e3bebbf..20b3a4865f 100755 --- a/tools/gyp/pylib/gyp/mac_tool.py +++ b/tools/gyp/pylib/gyp/mac_tool.py @@ -9,6 +9,7 @@ These functions are executed via gyp-mac-tool when using the Makefile generator. """ import fcntl +import json import os import plistlib import re @@ -47,22 +48,33 @@ class MacTool(object): extension = os.path.splitext(source)[1].lower() if os.path.isdir(source): # Copy tree. + # TODO(thakis): This copies file attributes like mtime, while the + # single-file branch below doesn't. This should probably be changed to + # be consistent with the single-file branch. if os.path.exists(dest): shutil.rmtree(dest) shutil.copytree(source, dest) elif extension == '.xib': return self._CopyXIBFile(source, dest) + elif extension == '.storyboard': + return self._CopyXIBFile(source, dest) elif extension == '.strings': self._CopyStringsFile(source, dest) else: - shutil.copyfile(source, dest) + shutil.copy(source, dest) def _CopyXIBFile(self, source, dest): """Compiles a XIB file with ibtool into a binary plist in the bundle.""" - tools_dir = os.environ.get('DEVELOPER_BIN_DIR', '/usr/bin') - args = [os.path.join(tools_dir, 'ibtool'), '--errors', '--warnings', - '--notices', '--output-format', 'human-readable-text', '--compile', - dest, source] + + # ibtool sometimes crashes with relative paths. See crbug.com/314728. + base = os.path.dirname(os.path.realpath(__file__)) + if os.path.relpath(source): + source = os.path.join(base, source) + if os.path.relpath(dest): + dest = os.path.join(base, dest) + + args = ['xcrun', 'ibtool', '--errors', '--warnings', '--notices', + '--output-format', 'human-readable-text', '--compile', dest, source] ibtool_section_re = re.compile(r'/\*.*\*/') ibtool_re = re.compile(r'.*note:.*is clipping its content') ibtoolout = subprocess.Popen(args, stdout=subprocess.PIPE) @@ -87,16 +99,14 @@ class MacTool(object): # semicolon in dictionary. # on invalid files. Do the same kind of validation. import CoreFoundation - s = open(source).read() + s = open(source, 'rb').read() d = CoreFoundation.CFDataCreate(None, s, len(s)) _, error = CoreFoundation.CFPropertyListCreateFromXMLData(None, d, 0, None) if error: return - fp = open(dest, 'w') - args = ['/usr/bin/iconv', '--from-code', input_code, '--to-code', - 'UTF-16', source] - subprocess.call(args, stdout=fp) + fp = open(dest, 'wb') + fp.write(s.decode(input_code).encode('UTF-16')) fp.close() def _DetectInputEncoding(self, file_name): @@ -110,28 +120,58 @@ class MacTool(object): return None fp.close() if header.startswith("\xFE\xFF"): - return "UTF-16BE" + return "UTF-16" elif header.startswith("\xFF\xFE"): - return "UTF-16LE" + return "UTF-16" elif header.startswith("\xEF\xBB\xBF"): return "UTF-8" else: return None - def ExecCopyInfoPlist(self, source, dest): + def ExecCopyInfoPlist(self, source, dest, *keys): """Copies the |source| Info.plist to the destination directory |dest|.""" # Read the source Info.plist into memory. fd = open(source, 'r') lines = fd.read() fd.close() + # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). + plist = plistlib.readPlistFromString(lines) + if keys: + plist = dict(plist.items() + json.loads(keys[0]).items()) + lines = plistlib.writePlistToString(plist) + # Go through all the environment variables and replace them as variables in # the file. + IDENT_RE = re.compile('[/\s]') for key in os.environ: if key.startswith('_'): continue evar = '${%s}' % key - lines = string.replace(lines, evar, os.environ[key]) + evalue = os.environ[key] + lines = string.replace(lines, evar, evalue) + + # Xcode supports various suffices on environment variables, which are + # all undocumented. :rfc1034identifier is used in the standard project + # template these days, and :identifier was used earlier. They are used to + # convert non-url characters into things that look like valid urls -- + # except that the replacement character for :identifier, '_' isn't valid + # in a URL either -- oops, hence :rfc1034identifier was born. + evar = '${%s:identifier}' % key + evalue = IDENT_RE.sub('_', os.environ[key]) + lines = string.replace(lines, evar, evalue) + + evar = '${%s:rfc1034identifier}' % key + evalue = IDENT_RE.sub('-', os.environ[key]) + lines = string.replace(lines, evar, evalue) + + # Remove any keys with values that haven't been replaced. + lines = lines.split('\n') + for i in range(len(lines)): + if lines[i].strip().startswith("<string>${"): + lines[i] = None + lines[i - 1] = None + lines = '\n'.join(filter(lambda x: x is not None, lines)) # Write out the file with variables replaced. fd = open(dest, 'w') @@ -173,8 +213,9 @@ class MacTool(object): return subprocess.call(cmd_list) def ExecFilterLibtool(self, *cmd_list): - """Calls libtool and filters out 'libtool: file: foo.o has no symbols'.""" - libtool_re = re.compile(r'^libtool: file: .* has no symbols$') + """Calls libtool and filters out '/path/to/libtool: file: foo.o has no + symbols'.""" + libtool_re = re.compile(r'^.*libtool: file: .* has no symbols$') libtoolout = subprocess.Popen(cmd_list, stderr=subprocess.PIPE) _, err = libtoolout.communicate() for line in err.splitlines(): |