Skip to content

Commit ef0b49d

Browse files
committed
[Build System: build-script] Update the migration logic for the preset-only option '--swift-sdks' to execute in-place and support empty SDK lists.
1 parent 5a648ed commit ef0b49d

File tree

3 files changed

+43
-30
lines changed

3 files changed

+43
-30
lines changed

utils/build-script

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,8 +485,8 @@ class BuildScriptInvocation(object):
485485
"--build-dir", self.workspace.build_root,
486486
"--install-prefix", args.install_prefix,
487487
"--host-target", args.host_target,
488-
"--stdlib-deployment-targets",
489-
" ".join(args.stdlib_deployment_targets),
488+
"--stdlib-deployment-targets={}".format(
489+
" ".join(args.stdlib_deployment_targets)),
490490
"--host-cc", toolchain.cc,
491491
"--host-cxx", toolchain.cxx,
492492
"--darwin-xcrun-toolchain", args.darwin_xcrun_toolchain,

utils/build_swift/migration.py

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,19 @@
1313

1414
from __future__ import absolute_import, unicode_literals
1515

16+
import itertools
17+
1618
from swift_build_support.swift_build_support.targets import \
1719
StdlibDeploymentTarget
1820

1921

22+
try:
23+
# Python 2
24+
from itertools import imap
25+
except ImportError:
26+
imap = map
27+
28+
2029
__all__ = [
2130
'UnknownSDKError',
2231
'migrate_swift_sdks',
@@ -41,44 +50,41 @@ class UnknownSDKError(Exception):
4150
triples.
4251
"""
4352

44-
pass
45-
53+
def __init__(self, sdk):
54+
self.sdk = sdk
4655

47-
def _swift_sdks_to_stdlib_targets(swift_sdks):
48-
stdlib_targets = []
49-
for sdk in swift_sdks:
50-
sdk_targets = _SDK_TARGETS.get(sdk, None)
51-
if sdk_targets is None:
52-
raise UnknownSDKError(sdk)
53-
stdlib_targets += sdk_targets
54-
55-
return stdlib_targets
56+
super(UnknownSDKError, self).__init__(
57+
'Unknown SDK: {}'.format(self.sdk))
5658

5759

5860
def migrate_swift_sdks(args):
5961
"""Migrate usages of the now deprecated `--swift-sdks` option to the new
6062
`--stdlib-deployment-targets` option, converting Swift SDKs to the
61-
corresponding targets. Since argument parsing is a last-wins scenario, only
62-
the last `--swift-sdks` option is migrated, all others are removed.
63+
corresponding targets.
6364
6465
This function is a stop-gap to replacing all instances of `--swift-sdks`.
6566
"""
6667

67-
swift_sdks_args = [arg for arg in args if arg.startswith('--swift-sdks')]
68+
def _flatten(iterable):
69+
return itertools.chain.from_iterable(iterable)
70+
71+
def _swift_sdk_to_stdlib_targets(sdk):
72+
targets = _SDK_TARGETS.get(sdk, None)
73+
if targets is None:
74+
raise UnknownSDKError(sdk)
6875

69-
if len(swift_sdks_args) < 1:
70-
return args
76+
return targets
7177

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

75-
sdk_list = swift_sdks_arg.split('=')[1].split(';')
76-
stdlib_targets = _swift_sdks_to_stdlib_targets(sdk_list)
82+
sdks = arg.split('=')[1]
83+
sdk_list = [] if sdks == '' else sdks.split(';')
7784

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

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

84-
return args
90+
return list(imap(_migrate_swift_sdks_arg, args))

utils/build_swift/tests/test_migration.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,22 @@ def test(self):
5757
@add_metaclass(TestMigrateSwiftSDKsMeta)
5858
class TestMigrateSwiftSDKs(TestCase):
5959

60+
def test_empty_swift_sdks(self):
61+
args = migration.migrate_swift_sdks(['--swift-sdks='])
62+
self.assertListEqual(args, ['--stdlib-deployment-targets='])
63+
6064
def test_multiple_swift_sdk_flags(self):
65+
sdks = ['OSX', 'IOS', 'IOS_SIMULATOR']
66+
6167
args = [
62-
'--swift-sdks=OSX',
63-
'--swift-sdks=OSX;IOS;IOS_SIMULATOR'
68+
'--swift-sdks=',
69+
'--swift-sdks={}'.format(';'.join(sdks))
6470
]
6571

6672
args = migration.migrate_swift_sdks(args)
67-
target_names = _get_sdk_target_names(['OSX', 'IOS', 'IOS_SIMULATOR'])
73+
target_names = _get_sdk_target_names(sdks)
6874

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

0 commit comments

Comments
 (0)