Skip to content

[Build System: build-script] Update the migration logic for the preset-only option '--swift-sdks' to execute in-place and support empty SDK lists. #25520

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 17, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions utils/build-script
Original file line number Diff line number Diff line change
Expand Up @@ -485,8 +485,8 @@ class BuildScriptInvocation(object):
"--build-dir", self.workspace.build_root,
"--install-prefix", args.install_prefix,
"--host-target", args.host_target,
"--stdlib-deployment-targets",
" ".join(args.stdlib_deployment_targets),
"--stdlib-deployment-targets={}".format(
" ".join(args.stdlib_deployment_targets)),
"--host-cc", toolchain.cc,
"--host-cxx", toolchain.cxx,
"--darwin-xcrun-toolchain", args.darwin_xcrun_toolchain,
Expand Down
56 changes: 31 additions & 25 deletions utils/build_swift/migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,19 @@

from __future__ import absolute_import, unicode_literals

import itertools

from swift_build_support.swift_build_support.targets import \
StdlibDeploymentTarget


try:
# Python 2
from itertools import imap
except ImportError:
imap = map


__all__ = [
'UnknownSDKError',
'migrate_swift_sdks',
Expand All @@ -41,44 +50,41 @@ class UnknownSDKError(Exception):
triples.
"""

pass

def __init__(self, sdk):
self.sdk = sdk

def _swift_sdks_to_stdlib_targets(swift_sdks):
stdlib_targets = []
for sdk in swift_sdks:
sdk_targets = _SDK_TARGETS.get(sdk, None)
if sdk_targets is None:
raise UnknownSDKError(sdk)
stdlib_targets += sdk_targets

return stdlib_targets
super(UnknownSDKError, self).__init__(
'Unknown SDK: {}'.format(self.sdk))


def migrate_swift_sdks(args):
"""Migrate usages of the now deprecated `--swift-sdks` option to the new
`--stdlib-deployment-targets` option, converting Swift SDKs to the
corresponding targets. Since argument parsing is a last-wins scenario, only
the last `--swift-sdks` option is migrated, all others are removed.
corresponding targets.

This function is a stop-gap to replacing all instances of `--swift-sdks`.
"""

swift_sdks_args = [arg for arg in args if arg.startswith('--swift-sdks')]
def _flatten(iterable):
return itertools.chain.from_iterable(iterable)

def _swift_sdk_to_stdlib_targets(sdk):
targets = _SDK_TARGETS.get(sdk, None)
if targets is None:
raise UnknownSDKError(sdk)

if len(swift_sdks_args) < 1:
return args
return targets

# Only get the last --swift-sdks arg since last-wins
swift_sdks_arg = swift_sdks_args[-1]
def _migrate_swift_sdks_arg(arg):
if not arg.startswith('--swift-sdks'):
return arg

sdk_list = swift_sdks_arg.split('=')[1].split(';')
stdlib_targets = _swift_sdks_to_stdlib_targets(sdk_list)
sdks = arg.split('=')[1]
sdk_list = [] if sdks == '' else sdks.split(';')

target_names = ' '.join([target.name for target in stdlib_targets])
stdlib_targets_arg = '--stdlib-deployment-targets=' + target_names
targets = _flatten(imap(_swift_sdk_to_stdlib_targets, sdk_list))
target_names = [target.name for target in targets]

args = [arg for arg in args if not arg.startswith('--swift-sdks')]
args.append(stdlib_targets_arg)
return '--stdlib-deployment-targets={}'.format(' '.join(target_names))

return args
return list(imap(_migrate_swift_sdks_arg, args))
13 changes: 10 additions & 3 deletions utils/build_swift/tests/test_migration.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,22 @@ def test(self):
@add_metaclass(TestMigrateSwiftSDKsMeta)
class TestMigrateSwiftSDKs(TestCase):

def test_empty_swift_sdks(self):
args = migration.migrate_swift_sdks(['--swift-sdks='])
self.assertListEqual(args, ['--stdlib-deployment-targets='])

def test_multiple_swift_sdk_flags(self):
sdks = ['OSX', 'IOS', 'IOS_SIMULATOR']

args = [
'--swift-sdks=OSX',
'--swift-sdks=OSX;IOS;IOS_SIMULATOR'
'--swift-sdks=',
'--swift-sdks={}'.format(';'.join(sdks))
]

args = migration.migrate_swift_sdks(args)
target_names = _get_sdk_target_names(['OSX', 'IOS', 'IOS_SIMULATOR'])
target_names = _get_sdk_target_names(sdks)

self.assertListEqual(args, [
'--stdlib-deployment-targets=',
'--stdlib-deployment-targets={}'.format(' '.join(target_names))
])