@@ -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 {
5556fileprivate 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