Source release v3.1.0
This commit is contained in:
125
third_party/gyp/generator/xcode.py
vendored
125
third_party/gyp/generator/xcode.py
vendored
@@ -5,6 +5,7 @@
|
||||
import filecmp
|
||||
import gyp.common
|
||||
import gyp.xcodeproj_file
|
||||
import gyp.xcode_ninja
|
||||
import errno
|
||||
import os
|
||||
import sys
|
||||
@@ -68,11 +69,15 @@ generator_additional_path_sections = [
|
||||
# The Xcode-specific keys that exist on targets and aren't moved down to
|
||||
# configurations.
|
||||
generator_additional_non_configuration_keys = [
|
||||
'ios_app_extension',
|
||||
'ios_watch_app',
|
||||
'ios_watchkit_extension',
|
||||
'mac_bundle',
|
||||
'mac_bundle_resources',
|
||||
'mac_framework_headers',
|
||||
'mac_framework_private_headers',
|
||||
'mac_xctest_bundle',
|
||||
'mac_xcuitest_bundle',
|
||||
'xcode_create_dependents_test_runner',
|
||||
]
|
||||
|
||||
@@ -83,6 +88,8 @@ generator_extra_sources_for_rules = [
|
||||
'mac_framework_private_headers',
|
||||
]
|
||||
|
||||
generator_filelist_paths = None
|
||||
|
||||
# Xcode's standard set of library directories, which don't need to be duplicated
|
||||
# in LIBRARY_SEARCH_PATHS. This list is not exhaustive, but that's okay.
|
||||
xcode_standard_library_dirs = frozenset([
|
||||
@@ -484,7 +491,7 @@ sys.exit(subprocess.call(sys.argv[1:]))" """
|
||||
def AddSourceToTarget(source, type, pbxp, xct):
|
||||
# TODO(mark): Perhaps source_extensions and library_extensions can be made a
|
||||
# little bit fancier.
|
||||
source_extensions = ['c', 'cc', 'cpp', 'cxx', 'm', 'mm', 's']
|
||||
source_extensions = ['c', 'cc', 'cpp', 'cxx', 'm', 'mm', 's', 'swift']
|
||||
|
||||
# .o is conceptually more of a "source" than a "library," but Xcode thinks
|
||||
# of "sources" as things to compile and "libraries" (or "frameworks") as
|
||||
@@ -520,7 +527,7 @@ def AddHeaderToTarget(header, pbxp, xct, is_public):
|
||||
xct.HeadersPhase().AddFile(header, settings)
|
||||
|
||||
|
||||
_xcode_variable_re = re.compile('(\$\((.*?)\))')
|
||||
_xcode_variable_re = re.compile(r'(\$\((.*?)\))')
|
||||
def ExpandXcodeVariables(string, expansions):
|
||||
"""Expands Xcode-style $(VARIABLES) in string per the expansions dict.
|
||||
|
||||
@@ -574,13 +581,47 @@ def PerformBuild(data, configurations, params):
|
||||
subprocess.check_call(arguments)
|
||||
|
||||
|
||||
def CalculateGeneratorInputInfo(params):
|
||||
toplevel = params['options'].toplevel_dir
|
||||
if params.get('flavor') == 'ninja':
|
||||
generator_dir = os.path.relpath(params['options'].generator_output or '.')
|
||||
output_dir = params.get('generator_flags', {}).get('output_dir', 'out')
|
||||
output_dir = os.path.normpath(os.path.join(generator_dir, output_dir))
|
||||
qualified_out_dir = os.path.normpath(os.path.join(
|
||||
toplevel, output_dir, 'gypfiles-xcode-ninja'))
|
||||
else:
|
||||
output_dir = os.path.normpath(os.path.join(toplevel, 'xcodebuild'))
|
||||
qualified_out_dir = os.path.normpath(os.path.join(
|
||||
toplevel, output_dir, 'gypfiles'))
|
||||
|
||||
global generator_filelist_paths
|
||||
generator_filelist_paths = {
|
||||
'toplevel': toplevel,
|
||||
'qualified_out_dir': qualified_out_dir,
|
||||
}
|
||||
|
||||
|
||||
def GenerateOutput(target_list, target_dicts, data, params):
|
||||
# Optionally configure each spec to use ninja as the external builder.
|
||||
ninja_wrapper = params.get('flavor') == 'ninja'
|
||||
if ninja_wrapper:
|
||||
(target_list, target_dicts, data) = \
|
||||
gyp.xcode_ninja.CreateWrapper(target_list, target_dicts, data, params)
|
||||
|
||||
options = params['options']
|
||||
generator_flags = params.get('generator_flags', {})
|
||||
parallel_builds = generator_flags.get('xcode_parallel_builds', True)
|
||||
serialize_all_tests = \
|
||||
generator_flags.get('xcode_serialize_all_test_runs', True)
|
||||
project_version = generator_flags.get('xcode_project_version', None)
|
||||
upgrade_check_project_version = \
|
||||
generator_flags.get('xcode_upgrade_check_project_version', None)
|
||||
|
||||
# Format upgrade_check_project_version with leading zeros as needed.
|
||||
if upgrade_check_project_version:
|
||||
upgrade_check_project_version = str(upgrade_check_project_version)
|
||||
while len(upgrade_check_project_version) < 4:
|
||||
upgrade_check_project_version = '0' + upgrade_check_project_version
|
||||
|
||||
skip_excluded_files = \
|
||||
not generator_flags.get('xcode_list_excluded_files', True)
|
||||
xcode_projects = {}
|
||||
@@ -595,11 +636,17 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
||||
xcode_projects[build_file] = xcp
|
||||
pbxp = xcp.project
|
||||
|
||||
# Set project-level attributes from multiple options
|
||||
project_attributes = {};
|
||||
if parallel_builds:
|
||||
pbxp.SetProperty('attributes',
|
||||
{'BuildIndependentTargetsInParallel': 'YES'})
|
||||
if project_version:
|
||||
xcp.project_file.SetXcodeVersion(project_version)
|
||||
project_attributes['BuildIndependentTargetsInParallel'] = 'YES'
|
||||
if upgrade_check_project_version:
|
||||
project_attributes['LastUpgradeCheck'] = upgrade_check_project_version
|
||||
project_attributes['LastTestingUpgradeCheck'] = \
|
||||
upgrade_check_project_version
|
||||
project_attributes['LastSwiftUpdateCheck'] = \
|
||||
upgrade_check_project_version
|
||||
pbxp.SetProperty('attributes', project_attributes)
|
||||
|
||||
# Add gyp/gypi files to project
|
||||
if not generator_flags.get('standalone'):
|
||||
@@ -637,14 +684,22 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
||||
# com.googlecode.gyp.xcode.bundle, a pseudo-type that xcode.py interprets
|
||||
# to create a single-file mh_bundle.
|
||||
_types = {
|
||||
'executable': 'com.apple.product-type.tool',
|
||||
'loadable_module': 'com.googlecode.gyp.xcode.bundle',
|
||||
'shared_library': 'com.apple.product-type.library.dynamic',
|
||||
'static_library': 'com.apple.product-type.library.static',
|
||||
'executable+bundle': 'com.apple.product-type.application',
|
||||
'loadable_module+bundle': 'com.apple.product-type.bundle',
|
||||
'loadable_module+xctest': 'com.apple.product-type.bundle.unit-test',
|
||||
'shared_library+bundle': 'com.apple.product-type.framework',
|
||||
'executable': 'com.apple.product-type.tool',
|
||||
'loadable_module': 'com.googlecode.gyp.xcode.bundle',
|
||||
'shared_library': 'com.apple.product-type.library.dynamic',
|
||||
'static_library': 'com.apple.product-type.library.static',
|
||||
'mac_kernel_extension': 'com.apple.product-type.kernel-extension',
|
||||
'executable+bundle': 'com.apple.product-type.application',
|
||||
'loadable_module+bundle': 'com.apple.product-type.bundle',
|
||||
'loadable_module+xctest': 'com.apple.product-type.bundle.unit-test',
|
||||
'loadable_module+xcuitest': 'com.apple.product-type.bundle.ui-testing',
|
||||
'shared_library+bundle': 'com.apple.product-type.framework',
|
||||
'executable+extension+bundle': 'com.apple.product-type.app-extension',
|
||||
'executable+watch+extension+bundle':
|
||||
'com.apple.product-type.watchkit-extension',
|
||||
'executable+watch+bundle':
|
||||
'com.apple.product-type.application.watchapp',
|
||||
'mac_kernel_extension+bundle': 'com.apple.product-type.kernel-extension',
|
||||
}
|
||||
|
||||
target_properties = {
|
||||
@@ -654,14 +709,35 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
||||
|
||||
type = spec['type']
|
||||
is_xctest = int(spec.get('mac_xctest_bundle', 0))
|
||||
is_xcuitest = int(spec.get('mac_xcuitest_bundle', 0))
|
||||
is_bundle = int(spec.get('mac_bundle', 0)) or is_xctest
|
||||
is_app_extension = int(spec.get('ios_app_extension', 0))
|
||||
is_watchkit_extension = int(spec.get('ios_watchkit_extension', 0))
|
||||
is_watch_app = int(spec.get('ios_watch_app', 0))
|
||||
if type != 'none':
|
||||
type_bundle_key = type
|
||||
if is_xctest:
|
||||
if is_xcuitest:
|
||||
type_bundle_key += '+xcuitest'
|
||||
assert type == 'loadable_module', (
|
||||
'mac_xcuitest_bundle targets must have type loadable_module '
|
||||
'(target %s)' % target_name)
|
||||
elif is_xctest:
|
||||
type_bundle_key += '+xctest'
|
||||
assert type == 'loadable_module', (
|
||||
'mac_xctest_bundle targets must have type loadable_module '
|
||||
'(target %s)' % target_name)
|
||||
elif is_app_extension:
|
||||
assert is_bundle, ('ios_app_extension flag requires mac_bundle '
|
||||
'(target %s)' % target_name)
|
||||
type_bundle_key += '+extension+bundle'
|
||||
elif is_watchkit_extension:
|
||||
assert is_bundle, ('ios_watchkit_extension flag requires mac_bundle '
|
||||
'(target %s)' % target_name)
|
||||
type_bundle_key += '+watch+extension+bundle'
|
||||
elif is_watch_app:
|
||||
assert is_bundle, ('ios_watch_app flag requires mac_bundle '
|
||||
'(target %s)' % target_name)
|
||||
type_bundle_key += '+watch+bundle'
|
||||
elif is_bundle:
|
||||
type_bundle_key += '+bundle'
|
||||
|
||||
@@ -677,6 +753,9 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
||||
assert not is_bundle, (
|
||||
'mac_bundle targets cannot have type none (target "%s")' %
|
||||
target_name)
|
||||
assert not is_xcuitest, (
|
||||
'mac_xcuitest_bundle targets cannot have type none (target "%s")' %
|
||||
target_name)
|
||||
assert not is_xctest, (
|
||||
'mac_xctest_bundle targets cannot have type none (target "%s")' %
|
||||
target_name)
|
||||
@@ -703,11 +782,16 @@ def GenerateOutput(target_list, target_dicts, data, params):
|
||||
# and is made a dependency of this target. This way the work is done
|
||||
# before the dependency checks for what should be recompiled.
|
||||
support_xct = None
|
||||
if type != 'none' and (spec_actions or spec_rules):
|
||||
# The Xcode "issues" don't affect xcode-ninja builds, since the dependency
|
||||
# logic all happens in ninja. Don't bother creating the extra targets in
|
||||
# that case.
|
||||
if type != 'none' and (spec_actions or spec_rules) and not ninja_wrapper:
|
||||
support_xccl = CreateXCConfigurationList(configuration_names);
|
||||
support_target_suffix = generator_flags.get(
|
||||
'support_target_suffix', ' Support')
|
||||
support_target_properties = {
|
||||
'buildConfigurationList': support_xccl,
|
||||
'name': target_name + ' Support',
|
||||
'name': target_name + support_target_suffix,
|
||||
}
|
||||
if target_product_name:
|
||||
support_target_properties['productName'] = \
|
||||
@@ -1096,6 +1180,9 @@ exit 1
|
||||
# Relative paths are relative to $(SRCROOT).
|
||||
dest = '$(SRCROOT)/' + dest
|
||||
|
||||
code_sign = int(copy_group.get('xcode_code_sign', 0))
|
||||
settings = (None, '{ATTRIBUTES = (CodeSignOnCopy, ); }')[code_sign];
|
||||
|
||||
# Coalesce multiple "copies" sections in the same target with the same
|
||||
# "destination" property into the same PBXCopyFilesBuildPhase, otherwise
|
||||
# they'll wind up with ID collisions.
|
||||
@@ -1114,7 +1201,7 @@ exit 1
|
||||
pbxcp_dict[dest] = pbxcp
|
||||
|
||||
for file in copy_group['files']:
|
||||
pbxcp.AddFile(file)
|
||||
pbxcp.AddFile(file, settings)
|
||||
|
||||
# Excluded files can also go into the project file.
|
||||
if not skip_excluded_files:
|
||||
|
||||
Reference in New Issue
Block a user