Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: pylib/gyp/mac_tool.py

Issue 1160773005: Support for Swift language and Clang modules for ninja generator. Base URL: https://chromium.googlesource.com/external/gyp@master
Patch Set: Fixed rare build failure when compiling with modules for multiple archs Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pylib/gyp/generator/ninja.py ('k') | pylib/gyp/xcode_emulation.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 Google Inc. All rights reserved. 2 # Copyright (c) 2012 Google Inc. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Utility functions to perform Xcode-style build steps. 6 """Utility functions to perform Xcode-style build steps.
7 7
8 These functions are executed via gyp-mac-tool when using the Makefile generator. 8 These functions are executed via gyp-mac-tool when using the Makefile generator.
9 """ 9 """
10 10
11 import errno
11 import fcntl 12 import fcntl
12 import fnmatch 13 import fnmatch
13 import glob 14 import glob
14 import json 15 import json
15 import os 16 import os
16 import plistlib 17 import plistlib
17 import re 18 import re
18 import shutil 19 import shutil
19 import string 20 import string
20 import subprocess 21 import subprocess
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 fd.close() 147 fd.close()
147 148
148 # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild). 149 # Insert synthesized key/value pairs (e.g. BuildMachineOSBuild).
149 plist = plistlib.readPlistFromString(lines) 150 plist = plistlib.readPlistFromString(lines)
150 if keys: 151 if keys:
151 plist = dict(plist.items() + json.loads(keys[0]).items()) 152 plist = dict(plist.items() + json.loads(keys[0]).items())
152 lines = plistlib.writePlistToString(plist) 153 lines = plistlib.writePlistToString(plist)
153 154
154 # Go through all the environment variables and replace them as variables in 155 # Go through all the environment variables and replace them as variables in
155 # the file. 156 # the file.
156 IDENT_RE = re.compile(r'[/\s]') 157 IDENT_RE = re.compile(r'[/\s_-]')
157 for key in os.environ: 158 for key in os.environ:
158 if key.startswith('_'): 159 if key.startswith('_'):
159 continue 160 continue
160 evar = '${%s}' % key 161 evar = '${%s}' % key
161 evalue = os.environ[key] 162 evalue = os.environ[key]
162 lines = string.replace(lines, evar, evalue) 163 lines = string.replace(lines, evar, evalue)
163 164
164 # Xcode supports various suffices on environment variables, which are 165 # Xcode supports various suffices on environment variables, which are
165 # all undocumented. :rfc1034identifier is used in the standard project 166 # all undocumented. :rfc1034identifier is used in the standard project
166 # template these days, and :identifier was used earlier. They are used to 167 # template these days, and :identifier was used earlier. They are used to
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 command_line.append(arg_name) 335 command_line.append(arg_name)
335 command_line.append(str(v)) 336 command_line.append(str(v))
336 else: 337 else:
337 command_line.append(arg_name) 338 command_line.append(arg_name)
338 command_line.append(str(value)) 339 command_line.append(str(value))
339 # Note: actool crashes if inputs path are relative, so use os.path.abspath 340 # Note: actool crashes if inputs path are relative, so use os.path.abspath
340 # to get absolute path name for inputs. 341 # to get absolute path name for inputs.
341 command_line.extend(map(os.path.abspath, inputs)) 342 command_line.extend(map(os.path.abspath, inputs))
342 subprocess.check_call(command_line) 343 subprocess.check_call(command_line)
343 344
345 def _EnsureDirExists(self, dir_path):
346 if not os.path.exists(dir_path):
347 try:
348 os.makedirs(dir_path)
349 except OSError as exc:
350 if exc.errno != errno.EEXIST:
351 raise
352
353 def _MakeStamp(self, stamp):
354 self._EnsureDirExists(os.path.dirname(stamp))
355 subprocess.check_call(['touch', stamp])
356
357 def ExecCopySwiftLibs(self, executable_path, platform, dst_path, codesign_key,
358 stamp):
359 args = [
360 'xcrun', 'swift-stdlib-tool', '--copy',
361 '--scan-executable', executable_path,
362 '--platform', platform,
363 '--destination', dst_path,
364 ]
365 if codesign_key:
366 args.extend(['--sign', codesign_key])
367
368 # Using only PATH variable from environment,
369 # to prevent swift-stdlib-tool from using variables like
370 # CODE_SIGNING_REQUIRED which may be set by Xcode
371 env = {'PATH' : os.environ.get('PATH', '')}
372 p = subprocess.Popen(args, env=env)
373 retcode = p.wait()
374 if retcode != 0:
375 raise subprocess.CalledProcessError(retcode, args)
376
377 self._MakeStamp(stamp)
378
379 def ExecBuildModuleMapFile(self, module_name, umbrella_header, map_file,
380 stamp):
381 self._EnsureDirExists(os.path.dirname(map_file))
382 with open(map_file, 'w') as f:
383 f.write(
384 'framework module %s {\n'
385 ' umbrella header \"%s\"\n'
386 ' export *\n'
387 ' module * { export * }\n'
388 '}\n' % (module_name, umbrella_header))
389
390 self._MakeStamp(stamp)
391
392 def ExecAppendSwiftToModuleMapFile(self, module_name, swift_header, map_file,
393 stamp):
394 self._EnsureDirExists(os.path.dirname(map_file))
395 with open(map_file, 'a') as f:
396 f.write(
397 'module %s.Swift {\n'
398 ' header \"%s\"\n'
399 '}\n' % (module_name, swift_header))
400
401 self._MakeStamp(stamp)
402
344 def ExecMergeInfoPlist(self, output, *inputs): 403 def ExecMergeInfoPlist(self, output, *inputs):
345 """Merge multiple .plist files into a single .plist file.""" 404 """Merge multiple .plist files into a single .plist file."""
346 merged_plist = {} 405 merged_plist = {}
347 for path in inputs: 406 for path in inputs:
348 plist = self._LoadPlistMaybeBinary(path) 407 plist = self._LoadPlistMaybeBinary(path)
349 self._MergePlist(merged_plist, plist) 408 self._MergePlist(merged_plist, plist)
350 plistlib.writePlist(merged_plist, output) 409 plistlib.writePlist(merged_plist, output)
351 410
352 def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning): 411 def ExecCodeSignBundle(self, key, resource_rules, entitlements, provisioning):
353 """Code sign a bundle. 412 """Code sign a bundle.
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 data = data.replace('$(%s)' % key, value) 660 data = data.replace('$(%s)' % key, value)
602 return data 661 return data
603 if isinstance(data, list): 662 if isinstance(data, list):
604 return [self._ExpandVariables(v, substitutions) for v in data] 663 return [self._ExpandVariables(v, substitutions) for v in data]
605 if isinstance(data, dict): 664 if isinstance(data, dict):
606 return {k: self._ExpandVariables(data[k], substitutions) for k in data} 665 return {k: self._ExpandVariables(data[k], substitutions) for k in data}
607 return data 666 return data
608 667
609 if __name__ == '__main__': 668 if __name__ == '__main__':
610 sys.exit(main(sys.argv[1:])) 669 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « pylib/gyp/generator/ninja.py ('k') | pylib/gyp/xcode_emulation.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698