Skip to content

Commit 90b2cef

Browse files
committed
Allow building against a single dynamic swift-syntax library
When `SWIFTSYNTAX_BUILD_DYNAMIC_LIBRARY` is specified, change swift-syntax dependencies to depend on a single `_SwiftSyntaxDynamic` product instead of separate products for each module. This allows us to build SourceKit-LSP on Windows using SwiftPM without exceeding the maximum symbol limit and thus run SourceKit-LSP tests on Windows. See swiftlang/sourcekit-lsp#1754 and swiftlang/swift-syntax#2879.
1 parent 9df5622 commit 90b2cef

File tree

1 file changed

+37
-43
lines changed

1 file changed

+37
-43
lines changed

Package.swift

Lines changed: 37 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,22 @@ let package = Package(
4747

4848
.target(
4949
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-
]),
50+
dependencies: [
51+
.product(name: "Markdown", package: "swift-markdown")
52+
]
53+
+ swiftSyntaxDependencies([
54+
"SwiftOperators", "SwiftParser", "SwiftParserDiagnostics", "SwiftSyntax", "SwiftSyntaxBuilder",
55+
]),
5856
exclude: ["CMakeLists.txt"]
5957
),
6058
.target(
6159
name: "_SwiftFormatTestSupport",
62-
dependencies: omittingExternalDependenciesIfNecessary([
63-
"SwiftFormat",
64-
.product(name: "SwiftOperators", package: "swift-syntax"),
65-
])
60+
dependencies: [
61+
"SwiftFormat"
62+
]
63+
+ swiftSyntaxDependencies([
64+
"SwiftOperators", "SwiftParser", "SwiftParserDiagnostics", "SwiftSyntax", "SwiftSyntaxBuilder",
65+
]),
6666
),
6767
.plugin(
6868
name: "Format Source Code",
@@ -98,41 +98,44 @@ let package = Package(
9898
),
9999
.executableTarget(
100100
name: "swift-format",
101-
dependencies: omittingExternalDependenciesIfNecessary([
101+
dependencies: [
102102
"_SwiftFormatInstructionCounter",
103103
"SwiftFormat",
104104
.product(name: "ArgumentParser", package: "swift-argument-parser"),
105-
.product(name: "SwiftSyntax", package: "swift-syntax"),
106-
.product(name: "SwiftParser", package: "swift-syntax"),
107-
]),
105+
] + swiftSyntaxDependencies(["SwiftParser", "SwiftSyntax"]),
108106
exclude: ["CMakeLists.txt"],
109107
linkerSettings: swiftformatLinkSettings
110108
),
111109

112110
.testTarget(
113111
name: "SwiftFormatPerformanceTests",
114-
dependencies: omittingExternalDependenciesIfNecessary([
112+
dependencies: [
115113
"SwiftFormat",
116114
"_SwiftFormatTestSupport",
117-
.product(name: "SwiftSyntax", package: "swift-syntax"),
118-
.product(name: "SwiftParser", package: "swift-syntax"),
119-
])
115+
] + swiftSyntaxDependencies(["SwiftParser", "SwiftSyntax"]),
120116
),
121117
.testTarget(
122118
name: "SwiftFormatTests",
123-
dependencies: omittingExternalDependenciesIfNecessary([
119+
dependencies: [
124120
"SwiftFormat",
125121
"_SwiftFormatTestSupport",
126122
.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-
])
123+
]
124+
+ swiftSyntaxDependencies([
125+
"SwiftOperators", "SwiftParser", "SwiftSyntax", "SwiftSyntaxBuilder",
126+
]),
132127
),
133128
]
134129
)
135130

131+
func swiftSyntaxDependencies(_ names: [String]) -> [Target.Dependency] {
132+
if buildDynamicSwiftSyntaxLibrary {
133+
return [.product(name: "_SwiftSyntaxDynamic", package: "swift-syntax")]
134+
} else {
135+
return names.map { .product(name: $0, package: "swift-syntax") }
136+
}
137+
}
138+
136139
// MARK: - Parse build arguments
137140

138141
func hasEnvironmentVariable(_ name: String) -> Bool {
@@ -147,28 +150,19 @@ var installAction: Bool { hasEnvironmentVariable("SWIFTFORMAT_CI_INSTALL") }
147150
/// remote dependency.
148151
var useLocalDependencies: Bool { hasEnvironmentVariable("SWIFTCI_USE_LOCAL_DEPS") }
149152

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-
}
153+
/// Whether swift-syntax is being built as a single dynamic library instead of as a separate library per module.
154+
///
155+
/// This means that the swift-syntax symbols don't need to be statically linked, which alles us to stay below the
156+
/// maximum number of exported symbols on Windows, in turn allowing us to build sourcekit-lsp using SwiftPM on Windows
157+
/// and run its tests.
158+
var buildDynamicSwiftSyntaxLibrary: Bool {
159+
hasEnvironmentVariable("SWIFTSYNTAX_BUILD_DYNAMIC_LIBRARY")
164160
}
165161

166162
// MARK: - Dependencies
167163

168164
var dependencies: [Package.Dependency] {
169-
if omitExternalDependencies {
170-
return []
171-
} else if useLocalDependencies {
165+
if useLocalDependencies {
172166
return [
173167
.package(path: "../swift-argument-parser"),
174168
.package(path: "../swift-markdown"),

0 commit comments

Comments
 (0)