1414import Foundation
1515import PackageDescription
1616
17+ var products : [ Product ] = [
18+ . executable(
19+ name: " swift-format " ,
20+ targets: [ " swift-format " ]
21+ ) ,
22+ . library(
23+ name: " SwiftFormat " ,
24+ targets: [ " SwiftFormat " ]
25+ ) ,
26+ . plugin(
27+ name: " FormatPlugin " ,
28+ targets: [ " Format Source Code " ]
29+ ) ,
30+ . plugin(
31+ name: " LintPlugin " ,
32+ targets: [ " Lint Source Code " ]
33+ ) ,
34+ ]
35+
36+ var targets : [ Target ] = [
37+ . target(
38+ name: " _SwiftFormatInstructionCounter " ,
39+ exclude: [ " CMakeLists.txt " ]
40+ ) ,
41+
42+ . target(
43+ name: " SwiftFormat " ,
44+ dependencies: [
45+ . product( name: " Markdown " , package : " swift-markdown " ) ,
46+ . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
47+ . product( name: " SwiftSyntaxBuilder " , package : " swift-syntax " ) ,
48+ . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
49+ . product( name: " SwiftParser " , package : " swift-syntax " ) ,
50+ . product( name: " SwiftParserDiagnostics " , package : " swift-syntax " ) ,
51+ ] ,
52+ exclude: [ " CMakeLists.txt " ]
53+ ) ,
54+ . target(
55+ name: " _SwiftFormatTestSupport " ,
56+ dependencies: [
57+ " SwiftFormat " ,
58+ . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
59+ ]
60+ ) ,
61+ . plugin(
62+ name: " Format Source Code " ,
63+ capability: . command(
64+ intent: . sourceCodeFormatting( ) ,
65+ permissions: [
66+ . writeToPackageDirectory( reason: " This command formats the Swift source files " )
67+ ]
68+ ) ,
69+ dependencies: [
70+ . target( name: " swift-format " )
71+ ] ,
72+ path: " Plugins/FormatPlugin "
73+ ) ,
74+ . plugin(
75+ name: " Lint Source Code " ,
76+ capability: . command(
77+ intent: . custom(
78+ verb: " lint-source-code " ,
79+ description: " Lint source code for a specified target. "
80+ )
81+ ) ,
82+ dependencies: [
83+ . target( name: " swift-format " )
84+ ] ,
85+ path: " Plugins/LintPlugin "
86+ ) ,
87+ . executableTarget(
88+ name: " generate-swift-format " ,
89+ dependencies: [
90+ " SwiftFormat "
91+ ]
92+ ) ,
93+ . executableTarget(
94+ name: " swift-format " ,
95+ dependencies: [
96+ " _SwiftFormatInstructionCounter " ,
97+ " SwiftFormat " ,
98+ . product( name: " ArgumentParser " , package : " swift-argument-parser " ) ,
99+ . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
100+ . product( name: " SwiftParser " , package : " swift-syntax " ) ,
101+ ] ,
102+ exclude: [ " CMakeLists.txt " ] ,
103+ linkerSettings: swiftformatLinkSettings
104+ ) ,
105+
106+ . testTarget(
107+ name: " SwiftFormatPerformanceTests " ,
108+ dependencies: [
109+ " SwiftFormat " ,
110+ " _SwiftFormatTestSupport " ,
111+ . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
112+ . product( name: " SwiftParser " , package : " swift-syntax " ) ,
113+ ]
114+ ) ,
115+ . testTarget(
116+ name: " SwiftFormatTests " ,
117+ dependencies: [
118+ " SwiftFormat " ,
119+ " _SwiftFormatTestSupport " ,
120+ . product( name: " Markdown " , package : " swift-markdown " ) ,
121+ . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
122+ . product( name: " SwiftParser " , package : " swift-syntax " ) ,
123+ . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
124+ . product( name: " SwiftSyntaxBuilder " , package : " swift-syntax " ) ,
125+ ]
126+ ) ,
127+ ]
128+
129+ if buildOnlyTests {
130+ products = [ ]
131+ targets = targets. compactMap { target in
132+ guard target. isTest || target. name == " _SwiftFormatTestSupport " else {
133+ return nil
134+ }
135+ target. dependencies = target. dependencies. filter { dependency in
136+ if case . byNameItem( name: " _SwiftFormatTestSupport " , _) = dependency {
137+ return true
138+ }
139+ return false
140+ }
141+ return target
142+ }
143+ }
144+
17145let package = Package (
18146 name: " swift-format " ,
19147 platforms: [
20148 . macOS( " 12.0 " ) ,
21149 . iOS( " 13.0 " ) ,
22150 ] ,
23- products: [
24- . executable(
25- name: " swift-format " ,
26- targets: [ " swift-format " ]
27- ) ,
28- . library(
29- name: " SwiftFormat " ,
30- targets: [ " SwiftFormat " ]
31- ) ,
32- . plugin(
33- name: " FormatPlugin " ,
34- targets: [ " Format Source Code " ]
35- ) ,
36- . plugin(
37- name: " LintPlugin " ,
38- targets: [ " Lint Source Code " ]
39- ) ,
40- ] ,
151+ products: products,
41152 dependencies: dependencies,
42- targets: [
43- . target(
44- name: " _SwiftFormatInstructionCounter " ,
45- exclude: [ " CMakeLists.txt " ]
46- ) ,
47-
48- . target(
49- name: " SwiftFormat " ,
50- dependencies: omittingExternalDependenciesIfNecessary ( [
51- . product( name: " Markdown " , package : " swift-markdown " ) ,
52- . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
53- . product( name: " SwiftSyntaxBuilder " , package : " swift-syntax " ) ,
54- . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
55- . product( name: " SwiftParser " , package : " swift-syntax " ) ,
56- . product( name: " SwiftParserDiagnostics " , package : " swift-syntax " ) ,
57- ] ) ,
58- exclude: [ " CMakeLists.txt " ]
59- ) ,
60- . target(
61- name: " _SwiftFormatTestSupport " ,
62- dependencies: omittingExternalDependenciesIfNecessary ( [
63- " SwiftFormat " ,
64- . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
65- ] )
66- ) ,
67- . plugin(
68- name: " Format Source Code " ,
69- capability: . command(
70- intent: . sourceCodeFormatting( ) ,
71- permissions: [
72- . writeToPackageDirectory( reason: " This command formats the Swift source files " )
73- ]
74- ) ,
75- dependencies: [
76- . target( name: " swift-format " )
77- ] ,
78- path: " Plugins/FormatPlugin "
79- ) ,
80- . plugin(
81- name: " Lint Source Code " ,
82- capability: . command(
83- intent: . custom(
84- verb: " lint-source-code " ,
85- description: " Lint source code for a specified target. "
86- )
87- ) ,
88- dependencies: [
89- . target( name: " swift-format " )
90- ] ,
91- path: " Plugins/LintPlugin "
92- ) ,
93- . executableTarget(
94- name: " generate-swift-format " ,
95- dependencies: [
96- " SwiftFormat "
97- ]
98- ) ,
99- . executableTarget(
100- name: " swift-format " ,
101- dependencies: omittingExternalDependenciesIfNecessary ( [
102- " _SwiftFormatInstructionCounter " ,
103- " SwiftFormat " ,
104- . product( name: " ArgumentParser " , package : " swift-argument-parser " ) ,
105- . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
106- . product( name: " SwiftParser " , package : " swift-syntax " ) ,
107- ] ) ,
108- exclude: [ " CMakeLists.txt " ] ,
109- linkerSettings: swiftformatLinkSettings
110- ) ,
111-
112- . testTarget(
113- name: " SwiftFormatPerformanceTests " ,
114- dependencies: omittingExternalDependenciesIfNecessary ( [
115- " SwiftFormat " ,
116- " _SwiftFormatTestSupport " ,
117- . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
118- . product( name: " SwiftParser " , package : " swift-syntax " ) ,
119- ] )
120- ) ,
121- . testTarget(
122- name: " SwiftFormatTests " ,
123- dependencies: omittingExternalDependenciesIfNecessary ( [
124- " SwiftFormat " ,
125- " _SwiftFormatTestSupport " ,
126- . product( name: " Markdown " , package : " swift-markdown " ) ,
127- . product( name: " SwiftOperators " , package : " swift-syntax " ) ,
128- . product( name: " SwiftParser " , package : " swift-syntax " ) ,
129- . product( name: " SwiftSyntax " , package : " swift-syntax " ) ,
130- . product( name: " SwiftSyntaxBuilder " , package : " swift-syntax " ) ,
131- ] )
132- ) ,
133- ]
153+ targets: targets
134154)
135155
136156// MARK: - Parse build arguments
@@ -147,26 +167,17 @@ var installAction: Bool { hasEnvironmentVariable("SWIFTFORMAT_CI_INSTALL") }
147167/// remote dependency.
148168var useLocalDependencies : Bool { hasEnvironmentVariable ( " SWIFTCI_USE_LOCAL_DEPS " ) }
149169
150- var omitExternalDependencies : Bool { hasEnvironmentVariable ( " SWIFTFORMAT_OMIT_EXTERNAL_DEPENDENCIES " ) }
151-
152- func omittingExternalDependenciesIfNecessary(
153- _ dependencies: [ Target . Dependency ]
154- ) -> [ Target . Dependency ] {
155- guard omitExternalDependencies else {
156- return dependencies
157- }
158- return dependencies. filter { dependency in
159- if case . productItem( _, let package , _, _) = dependency {
160- return package == nil
161- }
162- return true
163- }
164- }
170+ /// Build only tests targets and test support modules.
171+ ///
172+ /// This is used to test swift-format on Windows, where the modules required for the `swift-format` executable are
173+ /// built using CMake. When using this setting, the caller is responsible for passing the required search paths to
174+ /// the `swift test` invocation so that all pre-built modules can be found.
175+ var buildOnlyTests : Bool { hasEnvironmentVariable ( " SWIFTFORMAT_BUILD_ONLY_TESTS " ) }
165176
166177// MARK: - Dependencies
167178
168179var dependencies : [ Package . Dependency ] {
169- if omitExternalDependencies {
180+ if buildOnlyTests {
170181 return [ ]
171182 } else if useLocalDependencies {
172183 return [
0 commit comments