Skip to content

Commit 2f4a029

Browse files
committed
[Swift Build] Don't set EXECUTABLE_PREFIX when building dylib targets as frameworks
1 parent 66dea20 commit 2f4a029

2 files changed

Lines changed: 55 additions & 7 deletions

File tree

Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,11 +1076,13 @@ extension ProjectModel.BuildSettings {
10761076
self[.PRODUCT_BUNDLE_IDENTIFIER] = "\(packageIdentity).\(productName)".spm_mangledToBundleIdentifier()
10771077
self[.SWIFT_PACKAGE_NAME] = packageName ?? nil
10781078

1079-
// This should really be swift-build defaults set in the .xcspec files, but changing that requires
1080-
// some extensive testing to ensure xcode projects are not affected.
1081-
// So for now lets just force it here.
1082-
self[.EXECUTABLE_PREFIX] = "lib"
1083-
self[.EXECUTABLE_PREFIX, Platform.windows] = ""
1079+
if createDylibForDynamicProducts {
1080+
// This should really be swift-build defaults set in the .xcspec files, but changing that requires
1081+
// some extensive testing to ensure xcode projects are not affected.
1082+
// So for now lets just force it here.
1083+
self[.EXECUTABLE_PREFIX] = "lib"
1084+
self[.EXECUTABLE_PREFIX, Platform.windows] = ""
1085+
}
10841086

10851087
if !createDylibForDynamicProducts {
10861088
self[.GENERATE_INFOPLIST_FILE] = "YES"

Tests/SwiftBuildSupportTests/PIFBuilderTests.swift

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ extension PIFBuilderParameters {
2929
static func constructDefaultParametersForTesting(
3030
temporaryDirectory: Basics.AbsolutePath,
3131
addLocalRpaths: Bool,
32+
shouldCreateDylibForDynamicProducts: Bool = false,
3233
pluginScriptRunner: PluginScriptRunner? = nil
3334
) throws -> Self {
3435
try self.init(
3536
isPackageAccessModifierSupported: true,
3637
enableTestability: false,
37-
shouldCreateDylibForDynamicProducts: false,
38+
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts,
3839
materializeStaticArchiveProductsForRootPackages: true,
3940
toolchainLibDir: temporaryDirectory.appending(component: "toolchain-lib-dir"),
4041
pkgConfigDirectories: [],
@@ -55,6 +56,7 @@ extension PIFBuilderParameters {
5556
fileprivate func withGeneratedPIF(
5657
fromFixture fixtureName: String,
5758
addLocalRpaths: Bool = true,
59+
shouldCreateDylibForDynamicProducts: Bool = true,
5860
buildParameters: BuildParameters? = nil,
5961
do doIt: (SwiftBuildSupport.PIF.TopLevelObject, TestingObservability) async throws -> ()
6062
) async throws {
@@ -84,7 +86,8 @@ fileprivate func withGeneratedPIF(
8486
graph: graph,
8587
parameters: try PIFBuilderParameters.constructDefaultParametersForTesting(
8688
temporaryDirectory: fixturePath,
87-
addLocalRpaths: addLocalRpaths
89+
addLocalRpaths: addLocalRpaths,
90+
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts
8891
),
8992
fileSystem: localFileSystem,
9093
observabilityScope: observabilitySystem.topScope
@@ -292,6 +295,49 @@ struct PIFBuilderTests {
292295
}
293296
}
294297

298+
@Test(
299+
arguments: BuildConfiguration.allCases,
300+
)
301+
func dynamicLibraryProductExecutablePrefix(
302+
configuration: BuildConfiguration,
303+
) async throws {
304+
try await withGeneratedPIF(
305+
fromFixture: "PIFBuilder/Library",
306+
shouldCreateDylibForDynamicProducts: true
307+
) { pif, observabilitySystem in
308+
let errors: [Diagnostic] = observabilitySystem.diagnostics.filter { $0.severity == .error }
309+
#expect(errors.isEmpty, "Expected no errors during PIF generation, but got: \(errors)")
310+
311+
let target = try pif.workspace
312+
.project(named: "Library")
313+
.target(named: "LibraryDynamic-product")
314+
315+
guard case .target(let concreteTarget) = target else {
316+
Issue.record("Expected a regular target, got \(target)")
317+
return
318+
}
319+
#expect(concreteTarget.productType == .dynamicLibrary)
320+
let config = try target.buildConfig(named: configuration)
321+
#expect(config.settings[.EXECUTABLE_PREFIX] == "lib")
322+
#expect(config.settings[.EXECUTABLE_PREFIX, .windows] == "")
323+
}
324+
325+
try await withGeneratedPIF(
326+
fromFixture: "PIFBuilder/Library",
327+
shouldCreateDylibForDynamicProducts: false
328+
) { pif, observabilitySystem in
329+
let errors: [Diagnostic] = observabilitySystem.diagnostics.filter { $0.severity == .error }
330+
#expect(errors.isEmpty, "Expected no errors during PIF generation, but got: \(errors)")
331+
332+
let target = try pif.workspace
333+
.project(named: "Library")
334+
.target(named: "LibraryDynamic-product")
335+
336+
let config = try target.buildConfig(named: configuration)
337+
#expect(config.settings[.EXECUTABLE_PREFIX] == nil)
338+
}
339+
}
340+
295341
@Test(
296342
arguments: BuildConfiguration.allCases,
297343
)

0 commit comments

Comments
 (0)