diff --git a/Sources/SWBBuildService/BuildDependencyInfo.swift b/Sources/SWBBuildService/BuildDependencyInfo.swift index fd6ca8ff..223fa75f 100644 --- a/Sources/SWBBuildService/BuildDependencyInfo.swift +++ b/Sources/SWBBuildService/BuildDependencyInfo.swift @@ -117,6 +117,7 @@ package struct BuildDependencyInfo: Codable { package enum LibraryType: String, Codable, Sendable { case dynamic case `static` + case upward case unknown } @@ -434,9 +435,11 @@ extension BuildDependencyInfo { /// - remark: This is written somewhat generically (with the callback blocks) in the hopes that `LinkageDependencyResolver.dependencies(for:...)` can someday adopt it, as the general approach was stolen from there. package static func findLinkedInputsFromBuildSettings(_ settings: Settings, addFramework: @Sendable (TargetDependencyInfo.Input) async -> Void, addLibrary: @Sendable (TargetDependencyInfo.Input) async -> Void, addError: @Sendable (String) async -> Void) async { await LdLinkerSpec.processLinkerSettingsForLibraryOptions(settings: settings) { macro, flag, stem in - await addFramework(TargetDependencyInfo.Input(inputType: .framework, name: .stem(stem), linkType: .searchPath, libraryType: .dynamic)) + let libType: TargetDependencyInfo.Input.LibraryType = (flag == "-upward_framework") ? .upward : .dynamic + await addFramework(TargetDependencyInfo.Input(inputType: .framework, name: .stem(stem), linkType: .searchPath, libraryType: libType)) } addLibrary: { macro, flag, stem in - await addLibrary(TargetDependencyInfo.Input(inputType: .library, name: .stem(stem), linkType: .searchPath, libraryType: .unknown)) + let libType: TargetDependencyInfo.Input.LibraryType = (flag == "-upward-l") ? .upward : .unknown + await addLibrary(TargetDependencyInfo.Input(inputType: .library, name: .stem(stem), linkType: .searchPath, libraryType: libType)) } addError: { error in await addError(error) } diff --git a/Tests/SWBBuildServiceTests/BuildDependencyInfoTests.swift b/Tests/SWBBuildServiceTests/BuildDependencyInfoTests.swift index 8d83baf6..0883a288 100644 --- a/Tests/SWBBuildServiceTests/BuildDependencyInfoTests.swift +++ b/Tests/SWBBuildServiceTests/BuildDependencyInfoTests.swift @@ -313,6 +313,7 @@ import Foundation "-merge_framework MergeFwk", "-no_merge_framework NoMergeFwk", "-lazy_framework LazyFwk", + "-upward_framework UpwardFwk", // Apparently both of these uses of -Xlinker are valid "-Xlinker -reexport_framework -Xlinker XlinkXlinkFwk", @@ -328,6 +329,7 @@ import Foundation "-merge-lMergeLib", "-no_merge-lNoMergeLib", "-lazy-lLazyLib", + "-upward-lUpwardLib", "-Xlinker -reexport-lXlinkerLib", "-Wl,-reexport-lQuoteLib", @@ -397,6 +399,15 @@ import Foundation } } + // Check upward framework + for fwkStem in ["UpwardFwk"] { + results.checkTargetInputName(target, .stem(fwkStem)) { input in + #expect(input.inputType == .framework) + #expect(input.linkType == .searchPath) + #expect(input.libraryType == .upward) + } + } + // Check library linkage for fwkStem in ["Lib", "WeakLib", "ReexportLib", "MergeLib", "NoMergeLib", "LazyLib"] { results.checkTargetInputName(target, .stem(fwkStem)) { input in @@ -413,6 +424,15 @@ import Foundation } } + // Check upward library + for fwkStem in ["UpwardLib"] { + results.checkTargetInputName(target, .stem(fwkStem)) { input in + #expect(input.inputType == .library) + #expect(input.linkType == .searchPath) + #expect(input.libraryType == .upward) + } + } + results.checkNoMoreTargetInputs(target) results.checkTargetOutputPath(target, "/Applications/AppTarget.app")