Skip to content

Commit a112ab8

Browse files
authored
Updates to get executables building and running on windows (#9130)
- the also changes the source modules on Windows to be a static lib since pre-linked .o is not supported. depends on: swiftlang/swift-build#795
1 parent 18bc480 commit a112ab8

File tree

8 files changed

+92
-148
lines changed

8 files changed

+92
-148
lines changed

Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,18 +1001,16 @@ extension ProjectModel.BuildSettings {
10011001
mutating func configureDynamicSettings(
10021002
productName: String,
10031003
targetName: String,
1004-
executableName: String,
10051004
packageIdentity: PackageIdentity,
10061005
packageName: String?,
10071006
createDylibForDynamicProducts: Bool,
10081007
installPath: String,
1009-
delegate: PackagePIFBuilder.BuildDelegate
1008+
delegate: PackagePIFBuilder.BuildDelegate,
10101009
) {
10111010
self[.TARGET_NAME] = targetName
1012-
self[.PRODUCT_NAME] = createDylibForDynamicProducts ? productName : executableName
1011+
self[.PRODUCT_NAME] = productName
10131012
self[.PRODUCT_MODULE_NAME] = productName
10141013
self[.PRODUCT_BUNDLE_IDENTIFIER] = "\(packageIdentity).\(productName)".spm_mangledToBundleIdentifier()
1015-
self[.EXECUTABLE_NAME] = executableName
10161014
self[.CLANG_ENABLE_MODULES] = "YES"
10171015
self[.SWIFT_PACKAGE_NAME] = packageName ?? nil
10181016

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Modules.swift

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -237,31 +237,25 @@ extension PackagePIFProjectBuilder {
237237
) throws -> (PackagePIFBuilder.ModuleOrProduct, resourceBundleName: String?) {
238238
precondition(sourceModule.isSourceModule)
239239

240-
let pifProductName: String
241-
let executableName: String
242240
let productType: ProjectModel.Target.ProductType
243241

244242
switch desiredModuleType {
245243
case .dynamicLibrary:
246244
// We are re-using this default for dynamic targets as well.
247245
if pifBuilder.createDylibForDynamicProducts {
248-
pifProductName = "lib\(sourceModule.name).dylib"
249-
executableName = pifProductName
250246
productType = .dynamicLibrary
251247
} else {
252-
pifProductName = sourceModule.name + ".framework"
253-
executableName = sourceModule.name
254248
productType = .framework
255249
}
256250

257251
case .staticLibrary, .executable:
258-
pifProductName = "\(sourceModule.name).o"
259-
executableName = pifProductName
252+
#if os(Windows) // Temporary until we get a new productType in swift-build
253+
productType = .staticArchive
254+
#else
260255
productType = .objectFile
256+
#endif
261257

262258
case .macro:
263-
pifProductName = sourceModule.name
264-
executableName = pifProductName
265259
productType = .hostBuildTool
266260
}
267261

@@ -280,8 +274,8 @@ extension PackagePIFProjectBuilder {
280274
ProjectModel.Target(
281275
id: sourceModule.pifTargetGUID(suffix: targetSuffix),
282276
productType: productType,
283-
name: "\(sourceModule.name)",
284-
productName: pifProductName,
277+
name: sourceModule.name,
278+
productName: "$(EXECUTABLE_NAME)",
285279
approvedByUser: approvedByUser
286280
)
287281
}
@@ -407,35 +401,22 @@ extension PackagePIFProjectBuilder {
407401
settings.configureDynamicSettings(
408402
productName: sourceModule.name,
409403
targetName: sourceModule.name,
410-
executableName: executableName,
411404
packageIdentity: package.identity,
412405
packageName: sourceModule.packageName,
413406
createDylibForDynamicProducts: pifBuilder.createDylibForDynamicProducts,
414407
installPath: "/usr/local/lib",
415-
delegate: pifBuilder.delegate
408+
delegate: pifBuilder.delegate,
416409
)
417410
} else {
418411
settings[.TARGET_NAME] = sourceModule.name
419412
settings[.PRODUCT_NAME] = "$(TARGET_NAME)"
420413
settings[.PRODUCT_MODULE_NAME] = sourceModule.c99name
421414
settings[.PRODUCT_BUNDLE_IDENTIFIER] = "\(self.package.identity).\(sourceModule.name)"
422415
.spm_mangledToBundleIdentifier()
423-
settings[.EXECUTABLE_NAME] = executableName
424416
settings[.CLANG_ENABLE_MODULES] = "YES"
425417
settings[.GENERATE_PRELINK_OBJECT_FILE] = "NO"
426418
settings[.STRIP_INSTALLED_PRODUCT] = "NO"
427419

428-
// Macros build as executables, so they need slightly different
429-
// build settings from other module types which build a "*.o".
430-
if desiredModuleType == .macro {
431-
settings[.MACH_O_TYPE] = "mh_execute"
432-
} else {
433-
settings[.MACH_O_TYPE] = "mh_object"
434-
// Disable code coverage linker flags since we're producing .o files.
435-
// Otherwise, we will run into duplicated symbols when there are more than one targets that produce .o
436-
// as their product.
437-
settings[.CLANG_COVERAGE_MAPPING_LINKER_ARGS] = "NO"
438-
}
439420
settings[.SWIFT_PACKAGE_NAME] = sourceModule.packageName
440421

441422
if desiredModuleType == .executable {

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Products.swift

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ extension PackagePIFProjectBuilder {
7878
id: product.pifTargetGUID,
7979
productType: pifProductType,
8080
name: product.targetName(),
81-
productName: product.name
81+
productName: "$(EXECUTABLE_NAME)"
8282
)
8383
}
8484
do {
@@ -116,7 +116,6 @@ extension PackagePIFProjectBuilder {
116116
settings[.PRODUCT_MODULE_NAME] = product.c99name
117117
settings[.PRODUCT_BUNDLE_IDENTIFIER] = "\(self.package.identity).\(product.name)"
118118
.spm_mangledToBundleIdentifier()
119-
settings[.EXECUTABLE_NAME] = product.name
120119
settings[.CLANG_ENABLE_MODULES] = "YES"
121120
settings[.SWIFT_PACKAGE_NAME] = mainModule.packageName
122121

@@ -608,35 +607,15 @@ extension PackagePIFProjectBuilder {
608607

609608
// FIXME: Cleanup this mess with <rdar://56889224>
610609

611-
let pifProductName: String
612-
let executableName: String
613610
let productType: ProjectModel.Target.ProductType
614611

615612
if desiredProductType == .dynamic {
616613
if pifBuilder.createDylibForDynamicProducts {
617-
pifProductName = "lib\(product.name).dylib"
618-
executableName = pifProductName
619614
productType = .dynamicLibrary
620615
} else {
621-
// If a product is explicitly declared dynamic, we preserve its name,
622-
// otherwise we will compute an automatic one.
623-
if product.libraryType == .dynamic {
624-
if let customExecutableName = pifBuilder.delegate
625-
.customExecutableName(product: product.underlying)
626-
{
627-
executableName = customExecutableName
628-
} else {
629-
executableName = product.name
630-
}
631-
} else {
632-
executableName = PackagePIFBuilder.computePackageProductFrameworkName(productName: product.name)
633-
}
634-
pifProductName = "\(executableName).framework"
635616
productType = .framework
636617
}
637618
} else {
638-
pifProductName = "lib\(product.name).a"
639-
executableName = pifProductName
640619
productType = .packageProduct
641620
}
642621

@@ -649,7 +628,7 @@ extension PackagePIFProjectBuilder {
649628
id: product.pifTargetGUID(suffix: targetSuffix),
650629
productType: productType,
651630
name: product.targetName(suffix: targetSuffix),
652-
productName: pifProductName
631+
productName: product.name
653632
)
654633
}
655634
do {
@@ -718,7 +697,6 @@ extension PackagePIFProjectBuilder {
718697
settings.configureDynamicSettings(
719698
productName: product.name,
720699
targetName: product.targetName(),
721-
executableName: executableName,
722700
packageIdentity: package.identity,
723701
packageName: package.identity.c99name,
724702
createDylibForDynamicProducts: pifBuilder.createDylibForDynamicProducts,
@@ -1049,7 +1027,6 @@ extension PackagePIFProjectBuilder {
10491027
settings[.PRODUCT_MODULE_NAME] = moduleName
10501028
settings[.PRODUCT_BUNDLE_IDENTIFIER] = "\(self.package.identity).\(name)"
10511029
.spm_mangledToBundleIdentifier()
1052-
settings[.EXECUTABLE_NAME] = name
10531030
settings[.SKIP_INSTALL] = "NO"
10541031
settings[.SWIFT_VERSION] = "5.0"
10551032
// This should eventually be set universally for all package targets/products.

Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ struct PackagePIFProjectBuilder {
211211
settings[.PRODUCT_MODULE_NAME] = bundleName
212212
settings[.PRODUCT_BUNDLE_IDENTIFIER] = "\(self.package.identity).\(module.name).resources"
213213
.spm_mangledToBundleIdentifier()
214-
settings[.EXECUTABLE_NAME] = ""
215214
settings[.GENERATE_INFOPLIST_FILE] = "YES"
216215
settings[.PACKAGE_RESOURCE_TARGET_KIND] = "resource"
217216

Sources/SwiftBuildSupport/SwiftBuildSystem.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,16 +727,19 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
727727

728728
settings["LIBRARY_SEARCH_PATHS"] = try "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)"
729729
settings["OTHER_CFLAGS"] = (
730+
verboseFlag +
730731
["$(inherited)"]
731732
+ buildParameters.toolchain.extraFlags.cCompilerFlags.map { $0.shellEscaped() }
732733
+ buildParameters.flags.cCompilerFlags.map { $0.shellEscaped() }
733734
).joined(separator: " ")
734735
settings["OTHER_CPLUSPLUSFLAGS"] = (
736+
verboseFlag +
735737
["$(inherited)"]
736738
+ buildParameters.toolchain.extraFlags.cxxCompilerFlags.map { $0.shellEscaped() }
737739
+ buildParameters.flags.cxxCompilerFlags.map { $0.shellEscaped() }
738740
).joined(separator: " ")
739741
settings["OTHER_SWIFT_FLAGS"] = (
742+
verboseFlag +
740743
["$(inherited)"]
741744
+ buildParameters.toolchain.extraFlags.swiftCompilerFlags.map { $0.shellEscaped() }
742745
+ buildParameters.flags.swiftCompilerFlags.map { $0.shellEscaped() }

Tests/CommandsTests/BuildCommandTests.swift

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -554,19 +554,14 @@ struct BuildCommandTestCases {
554554
func nonReachableProductsAndTargetsFunctional(
555555
buildSystem: BuildSystemProvider.Kind,
556556
) async throws {
557-
// skipped on Xcode
558-
try await withKnownIssue {
559-
try await fixture(name: "Miscellaneous/UnreachableTargets") { fixturePath in
560-
let aPath = fixturePath.appending("A")
561-
562-
let result = try await build([], packagePath: aPath, buildSystem: buildSystem)
563-
#expect(!result.binContents.contains("bexec"))
564-
#expect(!result.binContents.contains("BTarget2.build"))
565-
#expect(!result.binContents.contains("cexec"))
566-
#expect(!result.binContents.contains("CTarget.build"))
567-
}
568-
} when: {
569-
buildSystem == .swiftbuild && ProcessInfo.hostOperatingSystem == .windows
557+
try await fixture(name: "Miscellaneous/UnreachableTargets") { fixturePath in
558+
let aPath = fixturePath.appending("A")
559+
560+
let result = try await build([], packagePath: aPath, buildSystem: buildSystem)
561+
#expect(!result.binContents.contains("bexec"))
562+
#expect(!result.binContents.contains("BTarget2.build"))
563+
#expect(!result.binContents.contains("cexec"))
564+
#expect(!result.binContents.contains("CTarget.build"))
570565
}
571566
}
572567

0 commit comments

Comments
 (0)