From e225bfb332bde41ff840c46214e2e8776f77334d Mon Sep 17 00:00:00 2001 From: Dylan Sturgeon Date: Mon, 22 Jun 2020 10:55:38 -0700 Subject: [PATCH 1/3] Add a build prodct for swift-format. This product supports building and testing swift-format, forwarding the commands to a build script inside of swift-format's repo to handle actually invoking Swift PM. There are new command line options to support the swift-format product: `--swiftformat`: Enables building swift-format. `--skip-test-swiftformat': Disables running tests for swift-format after building. Installing is intentionally not implemented because swift-format isn't ready to be installed as part of the Swift toolchain. --- utils/build-presets.ini | 20 ++++ utils/build-script | 2 + .../build_swift/driver_arguments.py | 6 + .../contents.xcworkspacedata | 3 + utils/build_swift/tests/expected_options.py | 4 + .../swift_build_support/products/__init__.py | 2 + .../products/swiftformat.py | 104 ++++++++++++++++++ 7 files changed, 141 insertions(+) create mode 100644 utils/swift_build_support/swift_build_support/products/swiftformat.py diff --git a/utils/build-presets.ini b/utils/build-presets.ini index d8f302ffe4cc1..132b8736eab99 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -1701,6 +1701,26 @@ assertions swiftsyntax swiftsyntax-verify-generated-files +#===------------------------------------------------------------------------===# +# Test Swift Format +#===------------------------------------------------------------------------===# + +[preset: buildbot_swiftformat_macos] +mixin-preset=mixin_swiftpm_package_macos_platform +release +assertions +swiftsyntax +swiftsyntax-verify-generated-files +swiftformat + +[preset: buildbot_swiftformat_linux] +mixin-preset=mixin_swiftpm_package_linux_platform +release +assertions +swiftsyntax +swiftsyntax-verify-generated-files +swiftformat + #===------------------------------------------------------------------------===# # Test Swift Stress Tester #===------------------------------------------------------------------------===# diff --git a/utils/build-script b/utils/build-script index 47ef2165b7766..95f97f8f4ca63 100755 --- a/utils/build-script +++ b/utils/build-script @@ -861,6 +861,8 @@ class BuildScriptInvocation(object): product_classes.append(products.SwiftSyntax) if self.args.build_skstresstester: product_classes.append(products.SKStressTester) + if self.args.build_swiftformat: + product_classes.append(products.SwiftFormat) if self.args.build_swiftevolve: product_classes.append(products.SwiftEvolve) if self.args.build_indexstoredb: diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 04d5eef190834..85058d0893f8f 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -188,6 +188,7 @@ def _apply_default_arguments(args): args.test_indexstoredb = False args.test_sourcekitlsp = False args.test_skstresstester = False + args.test_swiftformat = False args.test_swiftevolve = False args.test_toolchainbenchmarks = False @@ -571,6 +572,9 @@ def create_argument_parser(): option(['--skstresstester'], store_true('build_skstresstester'), help='build the SourceKit stress tester') + option(['--swiftformat '], store_true('build_swiftformat'), + help='build swift-format') + option(['--swiftevolve'], store_true('build_swiftevolve'), help='build the swift-evolve tool') @@ -1020,6 +1024,8 @@ def create_argument_parser(): help='skip testing PlaygroundSupport') option('--skip-test-skstresstester', toggle_false('test_skstresstester'), help='skip testing the SourceKit Stress tester') + option('--skip-test-swiftformat', toggle_false('test_swiftformat'), + help='skip testing swift-format') option('--skip-test-swiftevolve', toggle_false('test_swiftevolve'), help='skip testing SwiftEvolve') option('--skip-test-toolchain-benchmarks', diff --git a/utils/build_swift/resources/SwiftPM-Unified-Build.xcworkspace/contents.xcworkspacedata b/utils/build_swift/resources/SwiftPM-Unified-Build.xcworkspace/contents.xcworkspacedata index ef015dfc533d6..92ad6dd28df5b 100644 --- a/utils/build_swift/resources/SwiftPM-Unified-Build.xcworkspace/contents.xcworkspacedata +++ b/utils/build_swift/resources/SwiftPM-Unified-Build.xcworkspace/contents.xcworkspacedata @@ -7,6 +7,9 @@ + + diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index 160fdcd8e2fe5..7681cf3b6a1da 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -93,6 +93,7 @@ 'build_tensorflow_swift_apis': False, 'build_libparser_only': False, 'build_skstresstester': False, + 'build_swiftformat': False, 'build_swiftevolve': False, 'build_indexstoredb': False, 'test_indexstoredb_sanitize_all': False, @@ -234,6 +235,7 @@ 'test_indexstoredb': False, 'test_sourcekitlsp': False, 'test_skstresstester': False, + 'test_swiftformat': False, 'test_swiftevolve': False, 'test_toolchainbenchmarks': False, 'tvos': False, @@ -476,6 +478,7 @@ class BuildScriptImplOption(_BaseOption): SetTrueOption('--swiftsyntax', dest='build_swiftsyntax'), SetTrueOption('--build-libparser-only', dest='build_libparser_only'), SetTrueOption('--skstresstester', dest='build_skstresstester'), + SetTrueOption('--swiftformat', dest='build_swiftformat'), SetTrueOption('--swiftevolve', dest='build_swiftevolve'), SetTrueOption('-B', dest='benchmark'), SetTrueOption('-S', dest='skip_build'), @@ -592,6 +595,7 @@ class BuildScriptImplOption(_BaseOption): DisableOption('--skip-test-indexstore-db', dest='test_indexstoredb'), DisableOption('--skip-test-sourcekit-lsp', dest='test_sourcekitlsp'), DisableOption('--skip-test-skstresstester', dest='test_skstresstester'), + DisableOption('--skip-test-swiftformat', dest='test_swiftformat'), DisableOption('--skip-test-swiftevolve', dest='test_swiftevolve'), DisableOption('--skip-test-toolchain-benchmarks', dest='test_toolchainbenchmarks'), diff --git a/utils/swift_build_support/swift_build_support/products/__init__.py b/utils/swift_build_support/swift_build_support/products/__init__.py index 18bbd2b3fe9bc..670d44db202ee 100644 --- a/utils/swift_build_support/swift_build_support/products/__init__.py +++ b/utils/swift_build_support/swift_build_support/products/__init__.py @@ -28,6 +28,7 @@ from .swift import Swift from .swiftevolve import SwiftEvolve from .swiftinspect import SwiftInspect +from .swiftformat import SwiftFormat from .swiftpm import SwiftPM from .swiftsyntax import SwiftSyntax from .tensorflow import TensorFlowSwiftAPIs @@ -49,6 +50,7 @@ 'PythonKit', 'Swift', 'SwiftInspect', + 'SwiftFormat', 'SwiftPM', 'TensorFlowSwiftAPIs', 'XCTest', diff --git a/utils/swift_build_support/swift_build_support/products/swiftformat.py b/utils/swift_build_support/swift_build_support/products/swiftformat.py new file mode 100644 index 0000000000000..30742401421c4 --- /dev/null +++ b/utils/swift_build_support/swift_build_support/products/swiftformat.py @@ -0,0 +1,104 @@ +# swift_build_support/products/swiftformat.py -----------------*- python -*- +# +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +# +# ---------------------------------------------------------------------------- + +import os +import platform + +from build_swift.build_swift.constants import MULTIROOT_DATA_FILE_PATH + +from . import cmark +from . import foundation +from . import libcxx +from . import libdispatch +from . import libicu +from . import llbuild +from . import llvm +from . import product +from . import swift +from . import swiftpm +from . import swiftsyntax +from . import xctest +from .. import shell + + +class SwiftFormat(product.Product): + @classmethod + def product_source_name(cls): + """product_source_name() -> str + + The name of the source code directory of this product. + """ + return "swift-format" + + @classmethod + def is_build_script_impl_product(cls): + return False + + @classmethod + def is_swiftpm_unified_build_product(cls): + return True + + def package_name(self): + return 'SwiftFormat' + + def run_build_script_helper(self, action, additional_params=[]): + script_path = os.path.join( + self.source_dir, 'build-script-helper.py') + + configuration = 'release' if self.is_release() else 'debug' + + helper_cmd = [ + script_path, + action, + '--toolchain', self.install_toolchain_path(), + '--config', configuration, + '--build-path', self.build_dir, + '--multiroot-data-file', MULTIROOT_DATA_FILE_PATH, + # There might have been a Package.resolved created by other builds + # or by the package being opened using Xcode. Discard that and + # reset the dependencies to be local. + '--update' + ] + if self.args.verbose_build: + helper_cmd.append('--verbose') + helper_cmd.extend(additional_params) + + shell.call(helper_cmd) + + def should_build(self, host_target): + return True + + def build(self, host_target): + self.run_build_script_helper('build') + + def should_test(self, host_target): + return self.args.test_swiftformat + + def test(self, host_target): + self.run_build_script_helper('test') + + def should_install(self, host_target): + return False + + @classmethod + def get_dependencies(cls): + return [cmark.CMark, + llvm.LLVM, + libcxx.LibCXX, + libicu.LibICU, + swift.Swift, + libdispatch.LibDispatch, + foundation.Foundation, + xctest.XCTest, + llbuild.LLBuild, + swiftpm.SwiftPM, + swiftsyntax.SwiftSyntax] From e56ce8a88ca9c53351b18d7d3a1f3d5e58101945 Mon Sep 17 00:00:00 2001 From: Dylan Sturgeon Date: Thu, 25 Jun 2020 14:39:28 -0700 Subject: [PATCH 2/3] Minor review tweaks. - Remove unused `package_name` method. - Disable swift-syntax tests in swift-format builder preset. --- utils/build-presets.ini | 4 ++-- .../swift_build_support/products/swiftformat.py | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/utils/build-presets.ini b/utils/build-presets.ini index 132b8736eab99..db96db7efcf39 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -1710,7 +1710,7 @@ mixin-preset=mixin_swiftpm_package_macos_platform release assertions swiftsyntax -swiftsyntax-verify-generated-files +skip-test-swiftsyntax swiftformat [preset: buildbot_swiftformat_linux] @@ -1718,7 +1718,7 @@ mixin-preset=mixin_swiftpm_package_linux_platform release assertions swiftsyntax -swiftsyntax-verify-generated-files +skip-test-swiftsyntax swiftformat #===------------------------------------------------------------------------===# diff --git a/utils/swift_build_support/swift_build_support/products/swiftformat.py b/utils/swift_build_support/swift_build_support/products/swiftformat.py index 30742401421c4..dec9333183b45 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftformat.py +++ b/utils/swift_build_support/swift_build_support/products/swiftformat.py @@ -47,9 +47,6 @@ def is_build_script_impl_product(cls): def is_swiftpm_unified_build_product(cls): return True - def package_name(self): - return 'SwiftFormat' - def run_build_script_helper(self, action, additional_params=[]): script_path = os.path.join( self.source_dir, 'build-script-helper.py') From 3b168d87fd268ce70640859a7e6a9b675070ef52 Mon Sep 17 00:00:00 2001 From: Dylan Sturgeon Date: Fri, 26 Jun 2020 13:38:07 -0700 Subject: [PATCH 3/3] Changes for review: - Fix extra space in build-script arg to build swift-format. - Fix python lint errors in `swiftformat.py`. - Remove swiftsyntax from swiftformat build preset. --- utils/build-presets.ini | 4 ---- utils/build_swift/build_swift/driver_arguments.py | 2 +- .../swift_build_support/products/__init__.py | 4 ++-- .../swift_build_support/products/swiftformat.py | 3 +-- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/utils/build-presets.ini b/utils/build-presets.ini index db96db7efcf39..3aff743954c4f 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -1709,16 +1709,12 @@ swiftsyntax-verify-generated-files mixin-preset=mixin_swiftpm_package_macos_platform release assertions -swiftsyntax -skip-test-swiftsyntax swiftformat [preset: buildbot_swiftformat_linux] mixin-preset=mixin_swiftpm_package_linux_platform release assertions -swiftsyntax -skip-test-swiftsyntax swiftformat #===------------------------------------------------------------------------===# diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 85058d0893f8f..71733cc817dfd 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -572,7 +572,7 @@ def create_argument_parser(): option(['--skstresstester'], store_true('build_skstresstester'), help='build the SourceKit stress tester') - option(['--swiftformat '], store_true('build_swiftformat'), + option(['--swiftformat'], store_true('build_swiftformat'), help='build swift-format') option(['--swiftevolve'], store_true('build_swiftevolve'), diff --git a/utils/swift_build_support/swift_build_support/products/__init__.py b/utils/swift_build_support/swift_build_support/products/__init__.py index 670d44db202ee..b39d9e5f2cffb 100644 --- a/utils/swift_build_support/swift_build_support/products/__init__.py +++ b/utils/swift_build_support/swift_build_support/products/__init__.py @@ -27,8 +27,8 @@ from .sourcekitlsp import SourceKitLSP from .swift import Swift from .swiftevolve import SwiftEvolve -from .swiftinspect import SwiftInspect from .swiftformat import SwiftFormat +from .swiftinspect import SwiftInspect from .swiftpm import SwiftPM from .swiftsyntax import SwiftSyntax from .tensorflow import TensorFlowSwiftAPIs @@ -49,8 +49,8 @@ 'PlaygroundSupport', 'PythonKit', 'Swift', - 'SwiftInspect', 'SwiftFormat', + 'SwiftInspect', 'SwiftPM', 'TensorFlowSwiftAPIs', 'XCTest', diff --git a/utils/swift_build_support/swift_build_support/products/swiftformat.py b/utils/swift_build_support/swift_build_support/products/swiftformat.py index dec9333183b45..ae6323cddadf8 100644 --- a/utils/swift_build_support/swift_build_support/products/swiftformat.py +++ b/utils/swift_build_support/swift_build_support/products/swiftformat.py @@ -11,7 +11,6 @@ # ---------------------------------------------------------------------------- import os -import platform from build_swift.build_swift.constants import MULTIROOT_DATA_FILE_PATH @@ -57,7 +56,7 @@ def run_build_script_helper(self, action, additional_params=[]): script_path, action, '--toolchain', self.install_toolchain_path(), - '--config', configuration, + '--configuration', configuration, '--build-path', self.build_dir, '--multiroot-data-file', MULTIROOT_DATA_FILE_PATH, # There might have been a Package.resolved created by other builds