Skip to content

Commit

Permalink
Create dylibs by default when using XCBuild (apple#2860)
Browse files Browse the repository at this point in the history
This changes the default to be dylibs when using XCBuild since we only
create frameworks in Xcode for App Store submission. It also fixes an
issue where even when dylib creation was enabled, we weren't producing
dylibs.

rdar://problem/66849186
  • Loading branch information
neonichu committed Aug 11, 2020
1 parent fa7fc0d commit f786bbb
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
2 changes: 1 addition & 1 deletion Sources/SPMBuildCore/BuildParameters.swift
Expand Up @@ -141,7 +141,7 @@ public struct BuildParameters: Encodable {
jobs: UInt32 = UInt32(ProcessInfo.processInfo.activeProcessorCount),
shouldLinkStaticSwiftStdlib: Bool = false,
shouldEnableManifestCaching: Bool = false,
shouldCreateDylibForDynamicProducts: Bool = false,
shouldCreateDylibForDynamicProducts: Bool = true,
sanitizers: EnabledSanitizers = EnabledSanitizers(),
enableCodeCoverage: Bool = false,
indexStoreMode: IndexStoreMode = .auto,
Expand Down
12 changes: 9 additions & 3 deletions Sources/XCBuildSupport/PIFBuilder.swift
Expand Up @@ -450,9 +450,15 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
let executableName: String
let productType: PIF.Target.ProductType
if product.type == .library(.dynamic) {
pifTargetProductName = product.name + ".framework"
executableName = product.name
productType = .framework
if parameters.shouldCreateDylibForDynamicProducts {
pifTargetProductName = "lib\(product.name).dylib"
executableName = pifTargetProductName
productType = .dynamicLibrary
} else {
pifTargetProductName = product.name + ".framework"
executableName = product.name
productType = .framework
}
} else {
pifTargetProductName = "lib\(product.name).a"
executableName = pifTargetProductName
Expand Down
46 changes: 46 additions & 0 deletions Tests/XCBuildSupportTests/PIFBuilderTests.swift
Expand Up @@ -1397,6 +1397,52 @@ class PIFBuilderTests: XCTestCase {
}
}

func testLibraryTargetsAsDylib() {
let fs = InMemoryFileSystem(emptyFiles:
"/Bar/Sources/BarLib/lib.c"
)

let diagnostics = DiagnosticsEngine()
let graph = loadPackageGraph(
fs: fs,
diagnostics: diagnostics,
manifests: [
Manifest.createManifest(
name: "Bar",
path: "/Bar",
url: "/Bar",
v: .v4_2,
packageKind: .root,
cLanguageStandard: "c11",
swiftLanguageVersions: [.v4_2],
products: [
.init(name: "BarLib", type: .library(.dynamic), targets: ["BarLib"]),
],
targets: [
.init(name: "BarLib"),
]),
]
)

var pif: PIF.TopLevelObject!
try! withCustomEnv(["PKG_CONFIG_PATH": inputsDir.pathString]) {
let builder = PIFBuilder(graph: graph, parameters: .mock(shouldCreateDylibForDynamicProducts: true), diagnostics: diagnostics)
pif = builder.construct()
}

XCTAssertNoDiagnostics(diagnostics)

PIFTester(pif) { workspace in
workspace.checkProject("PACKAGE:/Bar") { project in
project.checkTarget("PACKAGE-PRODUCT:BarLib") { target in
XCTAssertEqual(target.name, "BarLib")
XCTAssertEqual(target.productType, .dynamicLibrary)
XCTAssertEqual(target.productName, "libBarLib.dylib")
}
}
}
}

func testSystemLibraryTargets() {
let fs = InMemoryFileSystem(emptyFiles:
"/Foo/Sources/SystemLib1/module.modulemap",
Expand Down

0 comments on commit f786bbb

Please sign in to comment.