Skip to content

Commit ee2f2f1

Browse files
committed
Add more support for building on Windows using SwiftPM
This continues from the support added in #7866. While we can't build on Windows as-is due to exceeding the 65k exported symbol limit, in turn due to limitations in the build system, we can apply -static to all of the library targets which are known to be linked statically, in order to get that symbol count down. Note that this uses unsafeFlags, which is normally not recommended, however given that we are already using unsafeFlags elsewhere in the manifest, this seems reasonable enough for now until we can improve support for static linking on Windows. Building the test targets still exceeds the symbol count though.
1 parent 17f7d63 commit ee2f2f1

File tree

1 file changed

+108
-21
lines changed

1 file changed

+108
-21
lines changed

Package.swift

Lines changed: 108 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,10 @@ let swiftPMProduct = (
7272
)
7373

7474
#if os(Windows)
75+
let includeDynamicLibrary: Bool = false
7576
let systemSQLitePkgConfig: String? = nil
7677
#else
78+
let includeDynamicLibrary: Bool = true
7779
let systemSQLitePkgConfig: String? = "sqlite3"
7880
#endif
7981

@@ -90,12 +92,15 @@ let package = Package(
9092
],
9193
products:
9294
autoProducts.flatMap {
93-
[
95+
(includeDynamicLibrary ? [
9496
.library(
9597
name: $0.name,
9698
type: .dynamic,
9799
targets: $0.targets
98100
),
101+
] : [])
102+
+
103+
[
99104
.library(
100105
name: "\($0.name)-auto",
101106
targets: $0.targets
@@ -167,6 +172,7 @@ let package = Package(
167172
exclude: ["CMakeLists.txt"],
168173
swiftSettings: [
169174
.enableExperimentalFeature("AccessLevelOnImport"),
175+
.unsafeFlags(["-static"]),
170176
]
171177
),
172178

@@ -183,7 +189,8 @@ let package = Package(
183189
swiftSettings: [
184190
.enableExperimentalFeature("StrictConcurrency"),
185191
.enableExperimentalFeature("AccessLevelOnImport"),
186-
.enableExperimentalFeature("InternalImportsByDefault")
192+
.enableExperimentalFeature("InternalImportsByDefault"),
193+
.unsafeFlags(["-static"]),
187194
]
188195
),
189196

@@ -202,14 +209,18 @@ let package = Package(
202209
swiftSettings: [
203210
.enableExperimentalFeature("StrictConcurrency"),
204211
.enableExperimentalFeature("AccessLevelOnImport"),
212+
.unsafeFlags(["-static"]),
205213
]
206214
),
207215

208216
.target(
209217
/** The llbuild manifest model */
210218
name: "LLBuildManifest",
211219
dependencies: ["Basics"],
212-
exclude: ["CMakeLists.txt"]
220+
exclude: ["CMakeLists.txt"],
221+
swiftSettings: [
222+
.unsafeFlags(["-static"]),
223+
]
213224
),
214225

215226
.target(
@@ -222,7 +233,10 @@ let package = Package(
222233
"PackageModel",
223234
"PackageSigning",
224235
],
225-
exclude: ["CMakeLists.txt"]
236+
exclude: ["CMakeLists.txt"],
237+
swiftSettings: [
238+
.unsafeFlags(["-static"]),
239+
]
226240
),
227241

228242
.target(
@@ -232,14 +246,20 @@ let package = Package(
232246
"Basics",
233247
"PackageModel",
234248
],
235-
exclude: ["CMakeLists.txt"]
249+
exclude: ["CMakeLists.txt"],
250+
swiftSettings: [
251+
.unsafeFlags(["-static"]),
252+
]
236253
),
237254

238255
.target(
239256
/** Shim for llbuild library */
240257
name: "SPMLLBuild",
241258
dependencies: ["Basics"],
242-
exclude: ["CMakeLists.txt"]
259+
exclude: ["CMakeLists.txt"],
260+
swiftSettings: [
261+
.unsafeFlags(["-static"]),
262+
]
243263
),
244264

245265
// MARK: Project Model
@@ -248,7 +268,10 @@ let package = Package(
248268
/** Primitive Package model objects */
249269
name: "PackageModel",
250270
dependencies: ["Basics"],
251-
exclude: ["CMakeLists.txt", "README.md"]
271+
exclude: ["CMakeLists.txt", "README.md"],
272+
swiftSettings: [
273+
.unsafeFlags(["-static"]),
274+
]
252275
),
253276

254277
.target(
@@ -265,7 +288,10 @@ let package = Package(
265288
.product(name: "SwiftSyntax", package: "swift-syntax"),
266289
.product(name: "SwiftSyntaxBuilder", package: "swift-syntax"),
267290
],
268-
exclude: ["CMakeLists.txt"]
291+
exclude: ["CMakeLists.txt"],
292+
swiftSettings: [
293+
.unsafeFlags(["-static"]),
294+
]
269295
),
270296

271297
.target(
@@ -276,7 +302,10 @@ let package = Package(
276302
"PackageModel",
277303
"SourceControl",
278304
],
279-
exclude: ["CMakeLists.txt", "README.md"]
305+
exclude: ["CMakeLists.txt", "README.md"],
306+
swiftSettings: [
307+
.unsafeFlags(["-static"]),
308+
]
280309
),
281310

282311
// MARK: Package Dependency Resolution
@@ -289,7 +318,10 @@ let package = Package(
289318
"PackageLoading",
290319
"PackageModel",
291320
],
292-
exclude: ["CMakeLists.txt", "README.md"]
321+
exclude: ["CMakeLists.txt", "README.md"],
322+
swiftSettings: [
323+
.unsafeFlags(["-static"]),
324+
]
293325
),
294326

295327
// MARK: Package Collections
@@ -300,6 +332,9 @@ let package = Package(
300332
dependencies: [],
301333
exclude: [
302334
"Formats/v1.md",
335+
],
336+
swiftSettings: [
337+
.unsafeFlags(["-static"]),
303338
]
304339
),
305340

@@ -312,6 +347,9 @@ let package = Package(
312347
"PackageCollectionsSigning",
313348
"PackageModel",
314349
"SourceControl",
350+
],
351+
swiftSettings: [
352+
.unsafeFlags(["-static"]),
315353
]
316354
),
317355

@@ -322,6 +360,9 @@ let package = Package(
322360
.product(name: "X509", package: "swift-certificates"),
323361
"Basics",
324362
"PackageCollectionsModel",
363+
],
364+
swiftSettings: [
365+
.unsafeFlags(["-static"]),
325366
]
326367
),
327368

@@ -331,7 +372,10 @@ let package = Package(
331372
"Basics",
332373
"PackageModel",
333374
],
334-
exclude: ["CMakeLists.txt"]
375+
exclude: ["CMakeLists.txt"],
376+
swiftSettings: [
377+
.unsafeFlags(["-static"]),
378+
]
335379
),
336380

337381
.target(
@@ -342,7 +386,10 @@ let package = Package(
342386
"Basics",
343387
"PackageModel",
344388
],
345-
exclude: ["CMakeLists.txt"]
389+
exclude: ["CMakeLists.txt"],
390+
swiftSettings: [
391+
.unsafeFlags(["-static"]),
392+
]
346393
),
347394

348395
// MARK: Package Manager Functionality
@@ -354,7 +401,10 @@ let package = Package(
354401
"Basics",
355402
"PackageGraph",
356403
],
357-
exclude: ["CMakeLists.txt"]
404+
exclude: ["CMakeLists.txt"],
405+
swiftSettings: [
406+
.unsafeFlags(["-static"]),
407+
]
358408
),
359409
.target(
360410
/** Builds Modules and Products */
@@ -368,7 +418,10 @@ let package = Package(
368418
.product(name: "SwiftDriver", package: "swift-driver"),
369419
"DriverSupport",
370420
],
371-
exclude: ["CMakeLists.txt"]
421+
exclude: ["CMakeLists.txt"],
422+
swiftSettings: [
423+
.unsafeFlags(["-static"]),
424+
]
372425
),
373426
.target(
374427
name: "DriverSupport",
@@ -377,13 +430,19 @@ let package = Package(
377430
"PackageModel",
378431
.product(name: "SwiftDriver", package: "swift-driver"),
379432
],
380-
exclude: ["CMakeLists.txt"]
433+
exclude: ["CMakeLists.txt"],
434+
swiftSettings: [
435+
.unsafeFlags(["-static"]),
436+
]
381437
),
382438
.target(
383439
/** Support for building using Xcode's build system */
384440
name: "XCBuildSupport",
385441
dependencies: ["DriverSupport", "SPMBuildCore", "PackageGraph"],
386-
exclude: ["CMakeLists.txt"]
442+
exclude: ["CMakeLists.txt"],
443+
swiftSettings: [
444+
.unsafeFlags(["-static"]),
445+
]
387446
),
388447
.target(
389448
/** High level functionality */
@@ -398,7 +457,10 @@ let package = Package(
398457
"SourceControl",
399458
"SPMBuildCore",
400459
],
401-
exclude: ["CMakeLists.txt"]
460+
exclude: ["CMakeLists.txt"],
461+
swiftSettings: [
462+
.unsafeFlags(["-static"]),
463+
]
402464
),
403465
.target(
404466
// ** High level interface for package discovery */
@@ -409,6 +471,9 @@ let package = Package(
409471
"PackageModel",
410472
"PackageRegistry",
411473
"PackageSigning",
474+
],
475+
swiftSettings: [
476+
.unsafeFlags(["-static"]),
412477
]
413478
),
414479

@@ -427,7 +492,10 @@ let package = Package(
427492
"Workspace",
428493
"XCBuildSupport",
429494
],
430-
exclude: ["CMakeLists.txt"]
495+
exclude: ["CMakeLists.txt"],
496+
swiftSettings: [
497+
.unsafeFlags(["-static"]),
498+
]
431499
),
432500

433501
.target(
@@ -446,7 +514,10 @@ let package = Package(
446514
"Workspace",
447515
"XCBuildSupport",
448516
],
449-
exclude: ["CMakeLists.txt", "README.md"]
517+
exclude: ["CMakeLists.txt", "README.md"],
518+
swiftSettings: [
519+
.unsafeFlags(["-static"]),
520+
]
450521
),
451522

452523
.target(
@@ -459,7 +530,10 @@ let package = Package(
459530
"SPMBuildCore",
460531
"PackageModel",
461532
],
462-
exclude: ["CMakeLists.txt", "README.md"]
533+
exclude: ["CMakeLists.txt", "README.md"],
534+
swiftSettings: [
535+
.unsafeFlags(["-static"]),
536+
]
463537
),
464538

465539
.target(
@@ -472,6 +546,9 @@ let package = Package(
472546
"CoreCommands",
473547
"PackageCollections",
474548
"PackageModel",
549+
],
550+
swiftSettings: [
551+
.unsafeFlags(["-static"]),
475552
]
476553
),
477554

@@ -491,6 +568,9 @@ let package = Package(
491568
"SourceControl",
492569
"SPMBuildCore",
493570
"Workspace",
571+
],
572+
swiftSettings: [
573+
.unsafeFlags(["-static"]),
494574
]
495575
),
496576

@@ -503,6 +583,7 @@ let package = Package(
503583
],
504584
swiftSettings: [
505585
.enableExperimentalFeature("StrictConcurrency=complete"),
586+
.unsafeFlags(["-static"]),
506587
]
507588
),
508589

@@ -608,13 +689,19 @@ let package = Package(
608689
.product(name: "TSCTestSupport", package: "swift-tools-support-core"),
609690
"Workspace",
610691
"XCBuildSupport",
692+
],
693+
swiftSettings: [
694+
.unsafeFlags(["-static"]),
611695
]
612696
),
613697

614698
.target(
615699
/** Test for thread-sanitizer. */
616700
name: "tsan_utils",
617-
dependencies: []
701+
dependencies: [],
702+
swiftSettings: [
703+
.unsafeFlags(["-static"]),
704+
]
618705
),
619706

620707
// MARK: SwiftPM tests

0 commit comments

Comments
 (0)