From fef5b573c6a91f375a5cf83c84c289cadda8315b Mon Sep 17 00:00:00 2001 From: David Dresser Date: Thu, 25 Sep 2025 13:43:21 -0700 Subject: [PATCH 1/6] release/0.5.4 changes merged into main but not on develop --- .github/workflows/build.yml | 2 +- Sources/GenIR/GenIR.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f071396..e9c226f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '16.2.0' # Specify the desired Xcode version + xcode-version: '16.4.0' # Specify the desired Xcode version - uses: actions/checkout@v4 diff --git a/Sources/GenIR/GenIR.swift b/Sources/GenIR/GenIR.swift index c8a141a..10d7fe7 100644 --- a/Sources/GenIR/GenIR.swift +++ b/Sources/GenIR/GenIR.swift @@ -107,7 +107,7 @@ struct DebuggingOptions: ParsableArguments { } } - mutating private func validateXcarchive() throws { + mutating private func validateXcarchive() throws { // Version 0.2.x and below allowed the output folder to be any arbitrary folder. // Docs said to use 'IR' inside an xcarchive. For backwards compatibility, if we have an xcarchive path with an IR // folder, remove the IR portion @@ -226,7 +226,7 @@ struct DebuggingOptions: ParsableArguments { let targets = pifCache.projects.flatMap { project in project.targets.compactMap { Target(from: $0, in: project) } }.filter { !$0.isTest } - GenIRLogger.logger.debug("Project non-test targets: \(targets.count)") + GenIRLogger.logger.debug("Project non-test targets: \(targets.count)") let targetCommands = log.commandLog.reduce(into: [TargetKey: [CompilerCommand]]()) { commands, entry in commands[entry.target, default: []].append(entry.command) From 31645936eaa7998e76913d2a36b61319ac6bf3f4 Mon Sep 17 00:00:00 2001 From: David Dresser Date: Sat, 27 Sep 2025 14:55:20 -0700 Subject: [PATCH 2/6] SSAST-10888 reference dynamic dependency instead of adding its contents --- Sources/DependencyGraph/DependencyGraph.swift | 19 +++++++++++++++++-- Sources/GenIR/OutputPostprocessor.swift | 11 +++++++++-- Sources/GenIR/Versions.swift | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Sources/DependencyGraph/DependencyGraph.swift b/Sources/DependencyGraph/DependencyGraph.swift index 02766df..17c0076 100644 --- a/Sources/DependencyGraph/DependencyGraph.swift +++ b/Sources/DependencyGraph/DependencyGraph.swift @@ -37,18 +37,28 @@ public class DependencyGraph { /// - Parameter value: the associated value for a node to start the search with /// - Returns: the chain of nodes, starting with the 'bottom' of the dependency subgraph public func chain(for value: Value) -> [Node] { + let noFilter: [String: URL] = [:] + return chainWithFilter(for: value, dynamicDepencyFilter: noFilter) + } + + /// Returns the dependency 'chain' for the value associated with a node in the graph using a depth-first search + /// while filtering dynamic dependencies. + /// - Parameter value: the associated value for a node to start the search with + /// - Parameter value: a dictionary whose keys indicating node values which will not be chased further. + /// - Returns: the chain of nodes, starting with the 'bottom' of the dependency subgraph + public func chainWithFilter(for value: Value, dynamicDepencyFilter: [String: URL]) -> [Node] { guard let node = findNode(for: value) else { GenIRLogger.logger.debug("Couldn't find node for value: \(value.valueName)") return [] } - return depthFirstSearch(startingAt: node) + return depthFirstSearchWithFilter(startingAt: node, dynamicDepencyFilter: dynamicDepencyFilter) } /// Perform a depth-first search starting at the provided node /// - Parameter node: the node whose children to search through /// - Returns: an array of nodes ordered by a depth-first search approach - private func depthFirstSearch(startingAt node: Node) -> [Node] { + private func depthFirstSearchWithFilter(startingAt node: Node, dynamicDepencyFilter: [String: URL]) -> [Node] { GenIRLogger.logger.debug("----\nSearching for: \(node.value.valueName)") var visited = Set() var chain = [Node]() @@ -60,6 +70,11 @@ public class DependencyGraph { visited.insert(node) for edge in node.edges where edge.relationship == .dependency { + if dynamicDepencyFilter[edge.to.valueName] != nil { + GenIRLogger.logger.debug("\tskipping dependency: \(edge.to.valueName)") + chain.append(edge.to) + continue + } if visited.insert(edge.to).inserted { GenIRLogger.logger.debug("edge to: \(edge.to)") depthFirst(node: edge.to) diff --git a/Sources/GenIR/OutputPostprocessor.swift b/Sources/GenIR/OutputPostprocessor.swift index 2569ee8..11a93fa 100644 --- a/Sources/GenIR/OutputPostprocessor.swift +++ b/Sources/GenIR/OutputPostprocessor.swift @@ -87,11 +87,18 @@ class OutputPostprocessor { return } - for node in graph.chain(for: target) { + for node in graph.chainWithFilter(for: target, dynamicDepencyFilter: dynamicDependencyToPath) { GenIRLogger.logger.debug("Processing Node: \(node.valueName)") // Do not copy dynamic dependencies - guard dynamicDependencyToPath[node.value.productName] == nil else { continue } + guard dynamicDependencyToPath[node.value.productName] == nil else { + // Add a reference to this directory for any dynamic dependency that is not the current one being processed. + if irDirectory.lastPathComponent != node.value.productName { + let dynamDir = irDirectory.appendingPathComponent(node.value.productName) + try manager.createDirectory(at: dynamDir, withIntermediateDirectories: false) + } + continue + } try copyDependencies(for: node.value, to: irDirectory, processed: &processed) diff --git a/Sources/GenIR/Versions.swift b/Sources/GenIR/Versions.swift index 0d64883..30facb7 100644 --- a/Sources/GenIR/Versions.swift +++ b/Sources/GenIR/Versions.swift @@ -13,5 +13,5 @@ import Foundation enum Versions { - static let version = "0.5.4" + static let version = "1.0.0" } From 4a034da0f403ee50358decbb6a775faf653ad5c7 Mon Sep 17 00:00:00 2001 From: David Dresser Date: Mon, 27 Oct 2025 14:16:13 -0700 Subject: [PATCH 3/6] SSAST-10888 don't copy dependent modules but save them for pp to reconstruct. --- Sources/GenIR/OutputPostprocessor.swift | 31 ++++++++++++++++++++----- Tests/GenIRTests/WorkspaceTests.swift | 1 + 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Sources/GenIR/OutputPostprocessor.swift b/Sources/GenIR/OutputPostprocessor.swift index 11a93fa..26b2341 100644 --- a/Sources/GenIR/OutputPostprocessor.swift +++ b/Sources/GenIR/OutputPostprocessor.swift @@ -56,6 +56,7 @@ class OutputPostprocessor { try manager.createDirectory(at: output, withIntermediateDirectories: false) for node in nodes { + var targetDependencies: [String: [String]] = [:] let dependers = node.edges.filter { $0.relationship == .depender } guard dynamicDependencyToPath[node.value.productName] != nil || (dependers.count == 0 && !node.value.isSwiftPackage) else { @@ -78,11 +79,14 @@ class OutputPostprocessor { // Copy over this target's static dependencies var processed: Set = [] - try copyDependencies(for: node.value, to: irDirectory, processed: &processed) + try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDeps: &targetDependencies) + + // Persist the dependency map for this target + try persistDynamicDependencies(map: targetDependencies, to: irDirectory.appendingPathComponent("savedDeps.json")) } } - private func copyDependencies(for target: Target, to irDirectory: URL, processed: inout Set) throws { + private func copyDependencies(for target: Target, to irDirectory: URL, processed: inout Set, savedDeps: inout [String: [String]]) throws { guard processed.insert(target).inserted else { return } @@ -92,15 +96,15 @@ class OutputPostprocessor { // Do not copy dynamic dependencies guard dynamicDependencyToPath[node.value.productName] == nil else { - // Add a reference to this directory for any dynamic dependency that is not the current one being processed. + // Skip this directory for any dynamic dependency that is not the current one being processed. During preprocessing on the + // platform the modules for this dependency will be retrieved and added to this module. if irDirectory.lastPathComponent != node.value.productName { - let dynamDir = irDirectory.appendingPathComponent(node.value.productName) - try manager.createDirectory(at: dynamDir, withIntermediateDirectories: false) + savedDeps[irDirectory.lastPathComponent, default: []].append(node.value.productName) } continue } - try copyDependencies(for: node.value, to: irDirectory, processed: &processed) + try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDeps: &savedDeps) let buildDirectory = build.appendingPathComponent(node.value.productName) if manager.directoryExists(at: buildDirectory) { @@ -192,4 +196,19 @@ class OutputPostprocessor { GenIRLogger.logger.debug("Couldn't determine the base search path for the xcarchive, using: \(productsPath)") return productsPath } + + /// Persist the dynamic dependecies in the IR folder. The preprocessor will use this data to build modules + /// for BCA. + private func persistDynamicDependencies(map dynamicDependencyToPath: [String: [String]], to destination: URL) throws { + // Convert URL to string for serialization + let serializableDict = dynamicDependencyToPath.mapValues { $0 } + + // JSON encode + let encoder = JSONEncoder() + encoder.outputFormatting = [.sortedKeys, .prettyPrinted] + let data = try encoder.encode(serializableDict) + + // Write to file + try data.write(to: URL(fileURLWithPath: destination.filePath)) + } } diff --git a/Tests/GenIRTests/WorkspaceTests.swift b/Tests/GenIRTests/WorkspaceTests.swift index 2ae6cfd..a39a1db 100644 --- a/Tests/GenIRTests/WorkspaceTests.swift +++ b/Tests/GenIRTests/WorkspaceTests.swift @@ -15,6 +15,7 @@ final class WorkspaceTests: XCTestCase { static let frameworkIRFiles: Set = ["Framework.bc", "Framework_vers.bc"] static let sfSafeSymbolsIRFiles: Set = [ "NSImageExtension.bc", + "savedDeps.json", "SFSymbol+1.0.bc", "SFSymbol+1.1.bc", "SFSymbol+2.0.bc", From 33fd3911b1f1cc78b9d3029294ef692715dc8182 Mon Sep 17 00:00:00 2001 From: David Dresser Date: Fri, 14 Nov 2025 15:48:52 -0800 Subject: [PATCH 4/6] SSAST-10888 Add test for filtering the dependency chase. --- TestAssets/DependencyChaseFilter/README.txt | 53 +++ .../contents.xcworkspacedata | 20 + .../xcshareddata/WorkspaceSettings.xcsettings | 5 + .../xcshareddata/swiftpm/Package.resolved | 231 ++++++++++ .../TestApp77.xcodeproj/project.pbxproj | 420 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 ++ .../TestApp77/Assets.xcassets/Contents.json | 6 + .../TestApp77/TestApp77/ContentView.swift | 31 ++ .../Preview Assets.xcassets/Contents.json | 6 + .../TestApp77/TestApp77-Bridging-Header.h | 14 + .../TestApp77/TestApp77/TestApp77App.swift | 17 + .../TestLibraryA.xcodeproj/project.pbxproj | 396 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../TestLibraryA/TestLibraryA/TestLibraryA.h | 19 + .../TestLibraryA/VersionPrinter.h | 17 + .../TestLibraryA/VersionPrinter.m | 19 + .../TestLibraryB.xcodeproj/project.pbxproj | 436 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../TestLibraryB/TestLibraryB/TestLibraryB.h | 18 + .../TestLibraryB/VersionPrinterB.h | 17 + .../TestLibraryB/VersionPrinterB.m | 16 + .../TestLibraryC.xcodeproj/project.pbxproj | 372 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../TestLibraryC/TestLibraryC/TestLibraryC.h | 19 + .../TestLibraryC/VersionPrinterC.h | 15 + .../TestLibraryC/VersionPrinterC.m | 17 + .../DependencyChaseFilterTests.swift | 44 ++ 29 files changed, 2282 insertions(+) create mode 100644 TestAssets/DependencyChaseFilter/README.txt create mode 100644 TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/contents.xcworkspacedata create mode 100644 TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.pbxproj create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/Contents.json create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/ContentView.swift create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77-Bridging-Header.h create mode 100644 TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77App.swift create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.pbxproj create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/TestLibraryA.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.m create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.pbxproj create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/TestLibraryB.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.m create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.pbxproj create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/TestLibraryC.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.h create mode 100644 TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.m create mode 100644 Tests/GenIRTests/DependencyChaseFilterTests.swift diff --git a/TestAssets/DependencyChaseFilter/README.txt b/TestAssets/DependencyChaseFilter/README.txt new file mode 100644 index 0000000..dc5f4ee --- /dev/null +++ b/TestAssets/DependencyChaseFilter/README.txt @@ -0,0 +1,53 @@ +Test project in TestApp77.xcworkspace (built originally with Xcode 16.1). + + +TestApp77 (app target) depends on TestLibraryA (framework target) and TestLibraryC (framework target) + +TestLibraryA (framework target) depends on TestLibraryB (framework target) + +TestLibraryB (framework target) depends on the opentelemetry-swift package. + +TestLibraryC (framework target) has no dependencies. + + + +Generated archive is in build/test.xcarchive. + + +--- +See that the IR files from the opentelemetry-swift package (e.g., ZipkinBaggagePropagator.bc) appear in all targets, +except for TestLibraryC (which doesn't have a transitive dependency on opentelemetry-swift). + +However, the files should only appear in IR/TestLibraryB, which is the target that references the package. You can +check that only Products/Applications/TestApp77.app/Frameworks/TestLibraryB.framework/TestLibraryB contains symbols +from opentelemetry-swift (e.g., using the `nm` utility). + +Why is this a problem? The size of the IR folder is bloating the app: + +$ du -chd 1 build/test.xcarchive/IR + 26M build/test.xcarchive/IR/TestApp77.app + 26M build/test.xcarchive/IR/TestLibraryB.framework +4.0K build/test.xcarchive/IR/TestLibraryC.framework + 26M build/test.xcarchive/IR/TestLibraryA.framework + 78M build/test.xcarchive/IR + 78M total + + +This app has no actual contents: only TestLibraryB should have anything of +significance from the opentelemetry-swift package (26M), and everything else +should be ~4K. However, we're getting the 26M from opentelemetry-swift multiplied +across all transitive dependencies, which for a big app with ~200 frameworks, can +be multiple gigabytes of extra space. + +In particular, we're seeing our zipped app archive go above the 2GiB upload limit! + + +--- +Build command: + +rm -rf ./build && xcodebuild clean -workspace TestApp77.xcworkspace -scheme TestApp77 -derivedDataPath ./build && xcodebuild archive -derivedDataPath ./build -workspace TestApp77.xcworkspace -scheme TestApp77 -configuration Debug -destination generic/platform=iOS -archivePath build/test.xcarchive > build_log.txt + + +Gen-IR command: + +gen-ir build_log.txt build/test.xcarchive --debug > gen_ir_log.txt diff --git a/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/contents.xcworkspacedata b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dc40679 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..3778260 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,231 @@ +{ + "originHash" : "2c128f8da131b6f688d204a82023ec45f28617c47a0244f3e088ec8d96d23e95", + "pins" : [ + { + "identity" : "grpc-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/grpc/grpc-swift.git", + "state" : { + "revision" : "a56a157218877ef3e9625f7e1f7b2cb7e46ead1b", + "version" : "1.26.1" + } + }, + { + "identity" : "opentelemetry-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/open-telemetry/opentelemetry-swift", + "state" : { + "revision" : "7a68865d9cc571cbe62c4d4902ccc0d902881eab", + "version" : "2.1.0" + } + }, + { + "identity" : "opentelemetry-swift-core", + "kind" : "remoteSourceControl", + "location" : "https://github.com/open-telemetry/opentelemetry-swift-core.git", + "state" : { + "revision" : "6aebc7734e154cd221ea9fb76bd4f611262be962", + "version" : "2.1.1" + } + }, + { + "identity" : "opentracing-objc", + "kind" : "remoteSourceControl", + "location" : "https://github.com/undefinedlabs/opentracing-objc", + "state" : { + "revision" : "18c1a35ca966236cee0c5a714a51a73ff33384c1", + "version" : "0.5.2" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms.git", + "state" : { + "revision" : "87e50f483c54e6efd60e885f7f5aa946cee68023", + "version" : "1.2.1" + } + }, + { + "identity" : "swift-asn1", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-asn1.git", + "state" : { + "revision" : "f70225981241859eb4aa1a18a75531d26637c8cc", + "version" : "1.4.0" + } + }, + { + "identity" : "swift-async-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-async-algorithms.git", + "state" : { + "revision" : "042e1c4d9d19748c9c228f8d4ebc97bb1e339b0b", + "version" : "1.0.4" + } + }, + { + "identity" : "swift-atomics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-atomics.git", + "state" : { + "revision" : "b601256eab081c0f92f059e12818ac1d4f178ff7", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-certificates", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-certificates.git", + "state" : { + "revision" : "4b092f15164144c24554e0a75e080a960c5190a6", + "version" : "1.14.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "8c0c0a8b49e080e54e5e328cc552821ff07cd341", + "version" : "1.2.1" + } + }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "d1c6b70f7c5f19fb0b8750cb8dcdf2ea6e2d8c34", + "version" : "3.15.0" + } + }, + { + "identity" : "swift-http-structured-headers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-structured-headers.git", + "state" : { + "revision" : "1625f271afb04375bf48737a5572613248d0e7a0", + "version" : "1.4.0" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types.git", + "state" : { + "revision" : "a0a57e949a8903563aba4615869310c0ebf14c03", + "version" : "1.4.0" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log.git", + "state" : { + "revision" : "ce592ae52f982c847a4efc0dd881cc9eb32d29f2", + "version" : "1.6.4" + } + }, + { + "identity" : "swift-metrics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-metrics.git", + "state" : { + "revision" : "0743a9364382629da3bf5677b46a2c4b1ce5d2a6", + "version" : "2.7.1" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio.git", + "state" : { + "revision" : "1c30f0f2053b654e3d1302492124aa6d242cdba7", + "version" : "2.86.0" + } + }, + { + "identity" : "swift-nio-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-extras.git", + "state" : { + "revision" : "a55c3dd3a81d035af8a20ce5718889c0dcab073d", + "version" : "1.29.0" + } + }, + { + "identity" : "swift-nio-http2", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-http2.git", + "state" : { + "revision" : "5e9e99ec96c53bc2c18ddd10c1e25a3cd97c55e5", + "version" : "1.38.0" + } + }, + { + "identity" : "swift-nio-ssl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-ssl.git", + "state" : { + "revision" : "737e550e607d82bf15bdfddf158ec61652ce836f", + "version" : "2.34.0" + } + }, + { + "identity" : "swift-nio-transport-services", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-transport-services.git", + "state" : { + "revision" : "e645014baea2ec1c2db564410c51a656cf47c923", + "version" : "1.25.1" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "bbadd4b853a33fd78c4ae977d17bb2af15eb3f2a", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "2547102afd04fe49f1b286090f13ebce07284980", + "version" : "1.31.1" + } + }, + { + "identity" : "swift-service-lifecycle", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swift-server/swift-service-lifecycle.git", + "state" : { + "revision" : "e7187309187695115033536e8fc9b2eb87fd956d", + "version" : "2.8.0" + } + }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "395a77f0aa927f0ff73941d7ac35f2b46d47c9db", + "version" : "1.6.3" + } + }, + { + "identity" : "thrift-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/undefinedlabs/Thrift-Swift", + "state" : { + "revision" : "18ff09e6b30e589ed38f90a1af23e193b8ecef8e", + "version" : "1.1.2" + } + } + ], + "version" : 3 +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.pbxproj b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c09e8b7 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.pbxproj @@ -0,0 +1,420 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 13EF34552E7DF71C00F2EE87 /* TestLibraryA.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF34532E7DF6A200F2EE87 /* TestLibraryA.framework */; }; + 13EF34562E7DF71C00F2EE87 /* TestLibraryA.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF34532E7DF6A200F2EE87 /* TestLibraryA.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 13EF349E2E7DF7EA00F2EE87 /* TestLibraryB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF349D2E7DF7EA00F2EE87 /* TestLibraryB.framework */; }; + 13EF349F2E7DF7EA00F2EE87 /* TestLibraryB.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF349D2E7DF7EA00F2EE87 /* TestLibraryB.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 13EF34C52E81D33700F2EE87 /* TestLibraryC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF34C42E81D33700F2EE87 /* TestLibraryC.framework */; }; + 13EF34C62E81D33700F2EE87 /* TestLibraryC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF34C42E81D33700F2EE87 /* TestLibraryC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 13EF34522E7DF6A200F2EE87 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 13EF344C2E7DF6A200F2EE87 /* TestLibraryA.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 13EF34372E7DF58A00F2EE87; + remoteInfo = TestLibraryA; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 13EF34572E7DF71C00F2EE87 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 13EF34562E7DF71C00F2EE87 /* TestLibraryA.framework in Embed Frameworks */, + 13EF34C62E81D33700F2EE87 /* TestLibraryC.framework in Embed Frameworks */, + 13EF349F2E7DF7EA00F2EE87 /* TestLibraryB.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 13EF341C2E7DF54400F2EE87 /* TestApp77.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestApp77.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13EF344C2E7DF6A200F2EE87 /* TestLibraryA.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = TestLibraryA.xcodeproj; path = ../TestLibraryA/TestLibraryA.xcodeproj; sourceTree = ""; }; + 13EF349D2E7DF7EA00F2EE87 /* TestLibraryB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TestLibraryB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13EF34C42E81D33700F2EE87 /* TestLibraryC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TestLibraryC.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 13EF341E2E7DF54400F2EE87 /* TestApp77 */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = TestApp77; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13EF34192E7DF54400F2EE87 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 13EF34552E7DF71C00F2EE87 /* TestLibraryA.framework in Frameworks */, + 13EF34C52E81D33700F2EE87 /* TestLibraryC.framework in Frameworks */, + 13EF349E2E7DF7EA00F2EE87 /* TestLibraryB.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13EF34132E7DF54400F2EE87 = { + isa = PBXGroup; + children = ( + 13EF341E2E7DF54400F2EE87 /* TestApp77 */, + 13EF344B2E7DF6A200F2EE87 /* Frameworks */, + 13EF341D2E7DF54400F2EE87 /* Products */, + ); + sourceTree = ""; + }; + 13EF341D2E7DF54400F2EE87 /* Products */ = { + isa = PBXGroup; + children = ( + 13EF341C2E7DF54400F2EE87 /* TestApp77.app */, + ); + name = Products; + sourceTree = ""; + }; + 13EF344B2E7DF6A200F2EE87 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 13EF34C42E81D33700F2EE87 /* TestLibraryC.framework */, + 13EF349D2E7DF7EA00F2EE87 /* TestLibraryB.framework */, + 13EF344C2E7DF6A200F2EE87 /* TestLibraryA.xcodeproj */, + ); + name = Frameworks; + sourceTree = ""; + }; + 13EF344D2E7DF6A200F2EE87 /* Products */ = { + isa = PBXGroup; + children = ( + 13EF34532E7DF6A200F2EE87 /* TestLibraryA.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13EF341B2E7DF54400F2EE87 /* TestApp77 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13EF342A2E7DF54500F2EE87 /* Build configuration list for PBXNativeTarget "TestApp77" */; + buildPhases = ( + 13EF34182E7DF54400F2EE87 /* Sources */, + 13EF34192E7DF54400F2EE87 /* Frameworks */, + 13EF341A2E7DF54400F2EE87 /* Resources */, + 13EF34572E7DF71C00F2EE87 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 13EF341E2E7DF54400F2EE87 /* TestApp77 */, + ); + name = TestApp77; + packageProductDependencies = ( + ); + productName = TestApp77; + productReference = 13EF341C2E7DF54400F2EE87 /* TestApp77.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 13EF34142E7DF54400F2EE87 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1610; + LastUpgradeCheck = 2600; + TargetAttributes = { + 13EF341B2E7DF54400F2EE87 = { + CreatedOnToolsVersion = 16.1; + }; + }; + }; + buildConfigurationList = 13EF34172E7DF54400F2EE87 /* Build configuration list for PBXProject "TestApp77" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 13EF34132E7DF54400F2EE87; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 13EF341D2E7DF54400F2EE87 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 13EF344D2E7DF6A200F2EE87 /* Products */; + ProjectRef = 13EF344C2E7DF6A200F2EE87 /* TestLibraryA.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13EF341B2E7DF54400F2EE87 /* TestApp77 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 13EF34532E7DF6A200F2EE87 /* TestLibraryA.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = TestLibraryA.framework; + remoteRef = 13EF34522E7DF6A200F2EE87 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 13EF341A2E7DF54400F2EE87 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13EF34182E7DF54400F2EE87 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13EF34282E7DF54500F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/TestLibraryA"; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/TestApp77/TestApp77-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 13EF34292E7DF54500F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/TestLibraryA"; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OBJC_BRIDGING_HEADER = "$(SRCROOT)/TestApp77/TestApp77-Bridging-Header.h"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 13EF342B2E7DF54500F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_ASSET_PATHS = "\"TestApp77/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestApp77; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 13EF342C2E7DF54500F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_ASSET_PATHS = "\"TestApp77/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestApp77; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13EF34172E7DF54400F2EE87 /* Build configuration list for PBXProject "TestApp77" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34282E7DF54500F2EE87 /* Debug */, + 13EF34292E7DF54500F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13EF342A2E7DF54500F2EE87 /* Build configuration list for PBXNativeTarget "TestApp77" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF342B2E7DF54500F2EE87 /* Debug */, + 13EF342C2E7DF54500F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 13EF34142E7DF54400F2EE87 /* Project object */; +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AccentColor.colorset/Contents.json b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AppIcon.appiconset/Contents.json b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/Contents.json b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/ContentView.swift b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/ContentView.swift new file mode 100644 index 0000000..b474510 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/ContentView.swift @@ -0,0 +1,31 @@ +// +// ContentView.swift +// TestApp77 +// +// Created by Keith Johnson on 9/19/25. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + .onAppear { + // printVersionInfo prints TestLibraryA's info. TestLibraryA in turn prints TestLibraryB's info + VersionPrinter.printVersionInfo() + + // Now print TestLibraryC's info + VersionPrinterC.printVersionInfoC() + } + } +} + +#Preview { + ContentView() +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Preview Content/Preview Assets.xcassets/Contents.json b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77-Bridging-Header.h b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77-Bridging-Header.h new file mode 100644 index 0000000..ada2d69 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77-Bridging-Header.h @@ -0,0 +1,14 @@ +// +// TestApp77-Bridging-Header.h +// TestApp77 +// +// Created by David Dresser on 10/21/25. +// + +#ifndef TestApp77_Bridging_Header_h +#define TestApp77_Bridging_Header_h + +#import // For Objective-C +#import // For Objective-C + +#endif /* TestApp77_Bridging_Header_h */ diff --git a/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77App.swift b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77App.swift new file mode 100644 index 0000000..a9894bd --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestApp77/TestApp77/TestApp77App.swift @@ -0,0 +1,17 @@ +// +// TestApp77App.swift +// TestApp77 +// +// Created by Keith Johnson on 9/19/25. +// + +import SwiftUI + +@main +struct TestApp77App: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.pbxproj b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8368128 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.pbxproj @@ -0,0 +1,396 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 13EF349A2E7DF7E000F2EE87 /* TestLibraryB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13EF34992E7DF7E000F2EE87 /* TestLibraryB.framework */; }; + A906D2282EA80285007DC512 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A906D2272EA80285007DC512 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13EF34372E7DF58A00F2EE87 /* TestLibraryA.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TestLibraryA.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 13EF34992E7DF7E000F2EE87 /* TestLibraryB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TestLibraryB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A906D2272EA80285007DC512 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 13EF343C2E7DF58A00F2EE87 /* Exceptions for "TestLibraryA" folder in "TestLibraryA" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + TestLibraryA.h, + VersionPrinter.h, + ); + target = 13EF34362E7DF58A00F2EE87 /* TestLibraryA */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 13EF34392E7DF58A00F2EE87 /* TestLibraryA */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 13EF343C2E7DF58A00F2EE87 /* Exceptions for "TestLibraryA" folder in "TestLibraryA" target */, + ); + path = TestLibraryA; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13EF34342E7DF58A00F2EE87 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A906D2282EA80285007DC512 /* Foundation.framework in Frameworks */, + 13EF349A2E7DF7E000F2EE87 /* TestLibraryB.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13EF342D2E7DF58A00F2EE87 = { + isa = PBXGroup; + children = ( + 13EF34392E7DF58A00F2EE87 /* TestLibraryA */, + 13EF34982E7DF7E000F2EE87 /* Frameworks */, + 13EF34382E7DF58A00F2EE87 /* Products */, + ); + sourceTree = ""; + }; + 13EF34382E7DF58A00F2EE87 /* Products */ = { + isa = PBXGroup; + children = ( + 13EF34372E7DF58A00F2EE87 /* TestLibraryA.framework */, + ); + name = Products; + sourceTree = ""; + }; + 13EF34982E7DF7E000F2EE87 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A906D2272EA80285007DC512 /* Foundation.framework */, + 13EF34992E7DF7E000F2EE87 /* TestLibraryB.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 13EF34322E7DF58A00F2EE87 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 13EF34362E7DF58A00F2EE87 /* TestLibraryA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13EF343D2E7DF58A00F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryA" */; + buildPhases = ( + 13EF34322E7DF58A00F2EE87 /* Headers */, + 13EF34332E7DF58A00F2EE87 /* Sources */, + 13EF34342E7DF58A00F2EE87 /* Frameworks */, + 13EF34352E7DF58A00F2EE87 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 13EF34392E7DF58A00F2EE87 /* TestLibraryA */, + ); + name = TestLibraryA; + packageProductDependencies = ( + ); + productName = TestLibraryA; + productReference = 13EF34372E7DF58A00F2EE87 /* TestLibraryA.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 13EF342E2E7DF58A00F2EE87 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 2600; + TargetAttributes = { + 13EF34362E7DF58A00F2EE87 = { + CreatedOnToolsVersion = 16.1; + }; + }; + }; + buildConfigurationList = 13EF34312E7DF58A00F2EE87 /* Build configuration list for PBXProject "TestLibraryA" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 13EF342D2E7DF58A00F2EE87; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 13EF34382E7DF58A00F2EE87 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13EF34362E7DF58A00F2EE87 /* TestLibraryA */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13EF34352E7DF58A00F2EE87 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13EF34332E7DF58A00F2EE87 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13EF343E2E7DF58A00F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryA; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 13EF343F2E7DF58A00F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryA; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 13EF34402E7DF58A00F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9EPD44Q626; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 13EF34412E7DF58A00F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9EPD44Q626; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13EF34312E7DF58A00F2EE87 /* Build configuration list for PBXProject "TestLibraryA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34402E7DF58A00F2EE87 /* Debug */, + 13EF34412E7DF58A00F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13EF343D2E7DF58A00F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF343E2E7DF58A00F2EE87 /* Debug */, + 13EF343F2E7DF58A00F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 13EF342E2E7DF58A00F2EE87 /* Project object */; +} diff --git a/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/TestLibraryA.h b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/TestLibraryA.h new file mode 100644 index 0000000..89fd998 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/TestLibraryA.h @@ -0,0 +1,19 @@ +// +// TestLibraryA.h +// TestLibraryA +// +// Created by Keith Johnson on 9/19/25. +// + +#import + +//! Project version number for TestLibraryA. +FOUNDATION_EXPORT double TestLibraryAVersionNumber; + +//! Project version string for TestLibraryA. +FOUNDATION_EXPORT const unsigned char TestLibraryAVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import +#import diff --git a/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.h b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.h new file mode 100644 index 0000000..a61f46f --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.h @@ -0,0 +1,17 @@ +// +// VersionPrinter.h +// TestLibraryA +// +// Created by David Dresser on 10/21/25. +// + +#ifndef VersionPrinter_h +#define VersionPrinter_h + +#import + +@interface VersionPrinter : NSObject ++ (void)printVersionInfo; +@end + +#endif /* VersionPrinter_h */ diff --git a/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.m b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.m new file mode 100644 index 0000000..e48f687 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryA/TestLibraryA/VersionPrinter.m @@ -0,0 +1,19 @@ +// +// VersionPrinter.m +// TestLibraryA +// +// Created by David Dresser on 10/21/25. +// + +#import "VersionPrinter.h" +#import "TestLibraryA.h" + +@implementation VersionPrinter ++ (void)printVersionInfo { + NSLog(@"Version Number: %f", TestLibraryAVersionNumber); + NSLog(@"Version String: %s", TestLibraryAVersionString); + + NSLog(@"Test LibraryB Version Info"); + [VersionPrinterB printVersionInfoB]; +} +@end diff --git a/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.pbxproj b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.pbxproj new file mode 100644 index 0000000..85daf08 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.pbxproj @@ -0,0 +1,436 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 13EF34A92E7DF8A500F2EE87 /* NetworkStatus in Frameworks */ = {isa = PBXBuildFile; productRef = 13EF34A82E7DF8A500F2EE87 /* NetworkStatus */; }; + A906D2262EA80241007DC512 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A906D2252EA80241007DC512 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13EF347F2E7DF7A900F2EE87 /* TestLibraryB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TestLibraryB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A906D2252EA80241007DC512 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 13EF34842E7DF7A900F2EE87 /* Exceptions for "TestLibraryB" folder in "TestLibraryB" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + TestLibraryB.h, + VersionPrinterB.h, + ); + target = 13EF347E2E7DF7A900F2EE87 /* TestLibraryB */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 13EF34812E7DF7A900F2EE87 /* TestLibraryB */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 13EF34842E7DF7A900F2EE87 /* Exceptions for "TestLibraryB" folder in "TestLibraryB" target */, + ); + path = TestLibraryB; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13EF347C2E7DF7A900F2EE87 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A906D2262EA80241007DC512 /* Foundation.framework in Frameworks */, + 13EF34A92E7DF8A500F2EE87 /* NetworkStatus in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13EF34752E7DF7A900F2EE87 = { + isa = PBXGroup; + children = ( + 13EF34812E7DF7A900F2EE87 /* TestLibraryB */, + A906D2242EA80241007DC512 /* Frameworks */, + 13EF34802E7DF7A900F2EE87 /* Products */, + ); + sourceTree = ""; + }; + 13EF34802E7DF7A900F2EE87 /* Products */ = { + isa = PBXGroup; + children = ( + 13EF347F2E7DF7A900F2EE87 /* TestLibraryB.framework */, + ); + name = Products; + sourceTree = ""; + }; + A906D2242EA80241007DC512 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A906D2252EA80241007DC512 /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 13EF347A2E7DF7A900F2EE87 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 13EF347E2E7DF7A900F2EE87 /* TestLibraryB */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13EF34852E7DF7A900F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryB" */; + buildPhases = ( + 13EF347A2E7DF7A900F2EE87 /* Headers */, + 13EF347B2E7DF7A900F2EE87 /* Sources */, + 13EF347C2E7DF7A900F2EE87 /* Frameworks */, + 13EF347D2E7DF7A900F2EE87 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 13EF34812E7DF7A900F2EE87 /* TestLibraryB */, + ); + name = TestLibraryB; + packageProductDependencies = ( + 13EF34A22E7DF8A500F2EE87 /* BaggagePropagationProcessor */, + 13EF34A42E7DF8A500F2EE87 /* InMemoryExporter */, + 13EF34A62E7DF8A500F2EE87 /* JaegerExporter */, + 13EF34A82E7DF8A500F2EE87 /* NetworkStatus */, + 13EF34AA2E7DF8A500F2EE87 /* OTelSwiftLog */, + ); + productName = TestLibraryB; + productReference = 13EF347F2E7DF7A900F2EE87 /* TestLibraryB.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 13EF34762E7DF7A900F2EE87 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1610; + TargetAttributes = { + 13EF347E2E7DF7A900F2EE87 = { + CreatedOnToolsVersion = 16.1; + }; + }; + }; + buildConfigurationList = 13EF34792E7DF7A900F2EE87 /* Build configuration list for PBXProject "TestLibraryB" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 13EF34752E7DF7A900F2EE87; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 13EF34802E7DF7A900F2EE87 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13EF347E2E7DF7A900F2EE87 /* TestLibraryB */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13EF347D2E7DF7A900F2EE87 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13EF347B2E7DF7A900F2EE87 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13EF34862E7DF7A900F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 9EPD44Q626; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryB; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 13EF34872E7DF7A900F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 9EPD44Q626; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryB; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 13EF34882E7DF7A900F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 13EF34892E7DF7A900F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13EF34792E7DF7A900F2EE87 /* Build configuration list for PBXProject "TestLibraryB" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34882E7DF7A900F2EE87 /* Debug */, + 13EF34892E7DF7A900F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13EF34852E7DF7A900F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryB" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34862E7DF7A900F2EE87 /* Debug */, + 13EF34872E7DF7A900F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/open-telemetry/opentelemetry-swift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.1.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 13EF34A22E7DF8A500F2EE87 /* BaggagePropagationProcessor */ = { + isa = XCSwiftPackageProductDependency; + package = 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */; + productName = BaggagePropagationProcessor; + }; + 13EF34A42E7DF8A500F2EE87 /* InMemoryExporter */ = { + isa = XCSwiftPackageProductDependency; + package = 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */; + productName = InMemoryExporter; + }; + 13EF34A62E7DF8A500F2EE87 /* JaegerExporter */ = { + isa = XCSwiftPackageProductDependency; + package = 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */; + productName = JaegerExporter; + }; + 13EF34A82E7DF8A500F2EE87 /* NetworkStatus */ = { + isa = XCSwiftPackageProductDependency; + package = 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */; + productName = NetworkStatus; + }; + 13EF34AA2E7DF8A500F2EE87 /* OTelSwiftLog */ = { + isa = XCSwiftPackageProductDependency; + package = 13EF34A12E7DF8A500F2EE87 /* XCRemoteSwiftPackageReference "opentelemetry-swift" */; + productName = OTelSwiftLog; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 13EF34762E7DF7A900F2EE87 /* Project object */; +} diff --git a/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/TestLibraryB.h b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/TestLibraryB.h new file mode 100644 index 0000000..67d8eeb --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/TestLibraryB.h @@ -0,0 +1,18 @@ +// +// TestLibraryB.h +// TestLibraryB +// +// Created by Keith Johnson on 9/19/25. +// + +#import + +//! Project version number for TestLibraryB. +FOUNDATION_EXPORT double TestLibraryBVersionNumber; + +//! Project version string for TestLibraryB. +FOUNDATION_EXPORT const unsigned char TestLibraryBVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import diff --git a/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.h b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.h new file mode 100644 index 0000000..b18f691 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.h @@ -0,0 +1,17 @@ +// +// VersionPrinter.h +// TestLibraryA +// +// Created by David Dresser on 10/21/25. +// + +#ifndef VersionPrinterB_h +#define VersionPrinterB_h + +#import + +@interface VersionPrinterB : NSObject ++ (void)printVersionInfoB; +@end + +#endif /* VersionPrinter_h */ diff --git a/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.m b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.m new file mode 100644 index 0000000..7cbcbf5 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryB/TestLibraryB/VersionPrinterB.m @@ -0,0 +1,16 @@ +// +// VersionPrinter.m +// TestLibraryB +// +// Created by David Dresser on 10/21/25. +// + +#import "VersionPrinterB.h" +#import "TestLibraryB.h" + +@implementation VersionPrinterB ++ (void)printVersionInfoB { + NSLog(@"Version Number: %f", TestLibraryBVersionNumber); + NSLog(@"Version String: %s", TestLibraryBVersionString); +} +@end diff --git a/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.pbxproj b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7eb9f8d --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.pbxproj @@ -0,0 +1,372 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + 13EF34B72E81D31800F2EE87 /* TestLibraryC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TestLibraryC.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 13EF34BC2E81D31800F2EE87 /* Exceptions for "TestLibraryC" folder in "TestLibraryC" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + TestLibraryC.h, + VersionPrinterC.h, + ); + target = 13EF34B62E81D31800F2EE87 /* TestLibraryC */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 13EF34B92E81D31800F2EE87 /* TestLibraryC */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 13EF34BC2E81D31800F2EE87 /* Exceptions for "TestLibraryC" folder in "TestLibraryC" target */, + ); + path = TestLibraryC; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13EF34B42E81D31800F2EE87 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13EF34AD2E81D31800F2EE87 = { + isa = PBXGroup; + children = ( + 13EF34B92E81D31800F2EE87 /* TestLibraryC */, + 13EF34B82E81D31800F2EE87 /* Products */, + ); + sourceTree = ""; + }; + 13EF34B82E81D31800F2EE87 /* Products */ = { + isa = PBXGroup; + children = ( + 13EF34B72E81D31800F2EE87 /* TestLibraryC.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 13EF34B22E81D31800F2EE87 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 13EF34B62E81D31800F2EE87 /* TestLibraryC */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13EF34BD2E81D31800F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryC" */; + buildPhases = ( + 13EF34B22E81D31800F2EE87 /* Headers */, + 13EF34B32E81D31800F2EE87 /* Sources */, + 13EF34B42E81D31800F2EE87 /* Frameworks */, + 13EF34B52E81D31800F2EE87 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 13EF34B92E81D31800F2EE87 /* TestLibraryC */, + ); + name = TestLibraryC; + packageProductDependencies = ( + ); + productName = TestLibraryC; + productReference = 13EF34B72E81D31800F2EE87 /* TestLibraryC.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 13EF34AE2E81D31800F2EE87 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1610; + TargetAttributes = { + 13EF34B62E81D31800F2EE87 = { + CreatedOnToolsVersion = 16.1; + }; + }; + }; + buildConfigurationList = 13EF34B12E81D31800F2EE87 /* Build configuration list for PBXProject "TestLibraryC" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 13EF34AD2E81D31800F2EE87; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 13EF34B82E81D31800F2EE87 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13EF34B62E81D31800F2EE87 /* TestLibraryC */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13EF34B52E81D31800F2EE87 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13EF34B32E81D31800F2EE87 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13EF34BE2E81D31800F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 9EPD44Q626; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryC; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 13EF34BF2E81D31800F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 9EPD44Q626; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.epic.keijohns.sizing.TestLibraryC; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 13EF34C02E81D31800F2EE87 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 13EF34C12E81D31800F2EE87 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13EF34B12E81D31800F2EE87 /* Build configuration list for PBXProject "TestLibraryC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34C02E81D31800F2EE87 /* Debug */, + 13EF34C12E81D31800F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13EF34BD2E81D31800F2EE87 /* Build configuration list for PBXNativeTarget "TestLibraryC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13EF34BE2E81D31800F2EE87 /* Debug */, + 13EF34BF2E81D31800F2EE87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 13EF34AE2E81D31800F2EE87 /* Project object */; +} diff --git a/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/TestLibraryC.h b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/TestLibraryC.h new file mode 100644 index 0000000..a63577e --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/TestLibraryC.h @@ -0,0 +1,19 @@ +// +// TestLibraryC.h +// TestLibraryC +// +// Created by Keith Johnson on 9/22/25. +// + +#import + +//! Project version number for TestLibraryC. +FOUNDATION_EXPORT double TestLibraryCVersionNumber; + +//! Project version string for TestLibraryC. +FOUNDATION_EXPORT const unsigned char TestLibraryCVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +#import + diff --git a/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.h b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.h new file mode 100644 index 0000000..3908a39 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.h @@ -0,0 +1,15 @@ +// +// VersionPrinterC.h +// TestLibraryC +// +// Created by David Dresser on 10/21/25. +// + +#ifndef VersionPrinterC_h +#define VersionPrinterC_h + +@interface VersionPrinterC : NSObject ++ (void)printVersionInfoC; +@end + +#endif /* VersionPrinterC_h */ diff --git a/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.m b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.m new file mode 100644 index 0000000..d3ac047 --- /dev/null +++ b/TestAssets/DependencyChaseFilter/TestLibraryC/TestLibraryC/VersionPrinterC.m @@ -0,0 +1,17 @@ +// +// VersionPrinterC.m +// TestLibraryC +// +// Created by David Dresser on 10/21/25. +// + +#import +#import "VersionPrinterC.h" +#import "TestLibraryC.h" + +@implementation VersionPrinterC ++ (void)printVersionInfoC { + NSLog(@"Version Number TestLibraryC: %f", TestLibraryCVersionNumber); + NSLog(@"Version String TestLibraryC: %s", TestLibraryCVersionString); +} +@end diff --git a/Tests/GenIRTests/DependencyChaseFilterTests.swift b/Tests/GenIRTests/DependencyChaseFilterTests.swift new file mode 100644 index 0000000..93fc94e --- /dev/null +++ b/Tests/GenIRTests/DependencyChaseFilterTests.swift @@ -0,0 +1,44 @@ +import XCTest +@testable import gen_ir + +final class DependencyChaseFilterTests: XCTestCase { + let testPath: URL = { + TestContext.testAssetPath + .appendingPathComponent("DependencyChaseFilter") + .appendingPathComponent("TestApp77.xcworkspace") + }() + let scheme = "TestApp77" + + func testDependencyChaseFilter() throws { + let context = TestContext() + try context.build(test: testPath, scheme: scheme) + + var runner = IREmitterCommand() + try runner.run( + log: context.buildLog.filePath, + archive: context.archive, + level: .debug, + dryRun: false, + dumpDependencyGraph: false + ) + + // Verify that the dependency chase filter worked as expected + // Root of the IR should have 4 directories + let irPath = context.archive.appendingPathComponent("IR") + let files = try FileManager.default.contentsOfDirectory(at: irPath, includingPropertiesForKeys: [.isDirectoryKey], options: []) + XCTAssertEqual(files.count, 4, "DependencyChaseFilterTests: Expected 4 IR directories to be generated") + + // Validate the contents of each root directory in the IR folder. + try validateDirContents(context: context, dirName: "TestApp77.app", expectedCount: 4) + try validateDirContents(context: context, dirName: "TestLibraryA.framework", expectedCount: 3) + try validateDirContents(context: context, dirName: "TestLibraryB.framework", expectedCount: 368) + try validateDirContents(context: context, dirName: "TestLibraryC.framework", expectedCount: 3) + } + + private func validateDirContents(context: TestContext, dirName: String, expectedCount: Int) throws { + // dirName should have expectedCount files + let libPath = context.archive.appendingPathComponent("IR").appendingPathComponent(dirName) + let files = try FileManager.default.contentsOfDirectory(at: libPath, includingPropertiesForKeys: nil) + XCTAssertEqual(files.count, expectedCount, "DependencyChaseFilterTests: Expected \(expectedCount) \(dirName) files to be generated") + } +} From 1fa365f25f7cf901a97ff1c052cc0036b8c836b8 Mon Sep 17 00:00:00 2001 From: David Dresser Date: Fri, 14 Nov 2025 15:51:06 -0800 Subject: [PATCH 5/6] SSAST-10888 Code clean up. --- Sources/DependencyGraph/DependencyGraph.swift | 17 ++++++++++------- Sources/GenIR/CompilerCommandRunner.swift | 4 ++-- Sources/GenIR/OutputPostprocessor.swift | 5 +++-- Sources/GenIR/Versions.swift | 3 ++- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Sources/DependencyGraph/DependencyGraph.swift b/Sources/DependencyGraph/DependencyGraph.swift index 17c0076..a83fb7f 100644 --- a/Sources/DependencyGraph/DependencyGraph.swift +++ b/Sources/DependencyGraph/DependencyGraph.swift @@ -37,28 +37,31 @@ public class DependencyGraph { /// - Parameter value: the associated value for a node to start the search with /// - Returns: the chain of nodes, starting with the 'bottom' of the dependency subgraph public func chain(for value: Value) -> [Node] { - let noFilter: [String: URL] = [:] - return chainWithFilter(for: value, dynamicDepencyFilter: noFilter) + let noFilter: Set = [] + return chainWithFilter(for: value, filter: noFilter) } /// Returns the dependency 'chain' for the value associated with a node in the graph using a depth-first search /// while filtering dynamic dependencies. /// - Parameter value: the associated value for a node to start the search with - /// - Parameter value: a dictionary whose keys indicating node values which will not be chased further. + /// - Parameter value: a set whose keys indicate node values which will not be chased further. /// - Returns: the chain of nodes, starting with the 'bottom' of the dependency subgraph - public func chainWithFilter(for value: Value, dynamicDepencyFilter: [String: URL]) -> [Node] { + public func chainWithFilter(for value: Value, filter dynamicDependencyFilter: Set) -> [Node] { guard let node = findNode(for: value) else { GenIRLogger.logger.debug("Couldn't find node for value: \(value.valueName)") return [] } - return depthFirstSearchWithFilter(startingAt: node, dynamicDepencyFilter: dynamicDepencyFilter) + return depthFirstSearchWithFilter(startingAt: node, filter: dynamicDependencyFilter) } /// Perform a depth-first search starting at the provided node /// - Parameter node: the node whose children to search through + /// - Parameter filter: A set of String. If a dependency relationship in the graph is contained in + /// the Set, then add that edge to the chain and continue with the next edge without descending + /// further down the graph. /// - Returns: an array of nodes ordered by a depth-first search approach - private func depthFirstSearchWithFilter(startingAt node: Node, dynamicDepencyFilter: [String: URL]) -> [Node] { + private func depthFirstSearchWithFilter(startingAt node: Node, filter dynamicDependencyFilter: Set) -> [Node] { GenIRLogger.logger.debug("----\nSearching for: \(node.value.valueName)") var visited = Set() var chain = [Node]() @@ -70,7 +73,7 @@ public class DependencyGraph { visited.insert(node) for edge in node.edges where edge.relationship == .dependency { - if dynamicDepencyFilter[edge.to.valueName] != nil { + if dynamicDependencyFilter.contains(edge.to.valueName) { GenIRLogger.logger.debug("\tskipping dependency: \(edge.to.valueName)") chain.append(edge.to) continue diff --git a/Sources/GenIR/CompilerCommandRunner.swift b/Sources/GenIR/CompilerCommandRunner.swift index 10ddbbd..dc453de 100644 --- a/Sources/GenIR/CompilerCommandRunner.swift +++ b/Sources/GenIR/CompilerCommandRunner.swift @@ -65,7 +65,7 @@ struct CompilerCommandRunner { continue } - GenIRLogger.logger.info("Operating on target: \(target.name). Total modules processed: \(totalModulesRun)") + GenIRLogger.logger.debug("Operating on target: \(target.name). Total modules processed: \(totalModulesRun)") totalModulesRun += try run(commands: targetCommands, for: target.productName, at: output) } @@ -90,7 +90,7 @@ struct CompilerCommandRunner { var targetModulesRun = 0 for (index, command) in commands.enumerated() { - GenIRLogger.logger.info( + GenIRLogger.logger.debug( """ \(dryRun ? "Dry run of" : "Running") command (\(command.compiler.rawValue)) \(index + 1) of \(commands.count). \ Target modules processed: \(targetModulesRun) diff --git a/Sources/GenIR/OutputPostprocessor.swift b/Sources/GenIR/OutputPostprocessor.swift index 26b2341..19a17d7 100644 --- a/Sources/GenIR/OutputPostprocessor.swift +++ b/Sources/GenIR/OutputPostprocessor.swift @@ -91,8 +91,8 @@ class OutputPostprocessor { return } - for node in graph.chainWithFilter(for: target, dynamicDepencyFilter: dynamicDependencyToPath) { - GenIRLogger.logger.debug("Processing Node: \(node.valueName)") + for node in graph.chainWithFilter(for: target, filter: Set(dynamicDependencyToPath.keys)) { + GenIRLogger.logger.debug("Processing Node with product: \(node.value.productName) and value: \(node.valueName)") // Do not copy dynamic dependencies guard dynamicDependencyToPath[node.value.productName] == nil else { @@ -101,6 +101,7 @@ class OutputPostprocessor { if irDirectory.lastPathComponent != node.value.productName { savedDeps[irDirectory.lastPathComponent, default: []].append(node.value.productName) } + GenIRLogger.logger.debug(" ---> Skipping dynamic dependency: \(node.value.productName)") continue } diff --git a/Sources/GenIR/Versions.swift b/Sources/GenIR/Versions.swift index 30facb7..e41a483 100644 --- a/Sources/GenIR/Versions.swift +++ b/Sources/GenIR/Versions.swift @@ -5,7 +5,8 @@ // Created by Thomas Hedderwick on 12/09/2022. // // History: -// 2025-nn-nn - 0.5.4 -- Update release doc; warn multiple builds; capture debug data +// 2025-nn-nn - 1.0.0 -- Don't chase through Dynamic Dependencies +// 2025-09-19 - 0.5.4 -- Update release doc; warn multiple builds; capture debug data // 2025-04-18 - 0.5.3 -- PIF Tracing; log unique compiler commands // 2025-04-09 - 0.5.2 -- PIF sort workspace; log instead of throw // 2024-09-17 - 0.5.1 From d37ecb01a7affd6c4f38a2955fc03140d9aca072 Mon Sep 17 00:00:00 2001 From: David Dresser Date: Fri, 14 Nov 2025 16:33:24 -0800 Subject: [PATCH 6/6] SSAST-10888 Code clean up: rename dependency file passed to preprocessor. --- Sources/GenIR/OutputPostprocessor.swift | 10 +++++----- Tests/GenIRTests/WorkspaceTests.swift | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/GenIR/OutputPostprocessor.swift b/Sources/GenIR/OutputPostprocessor.swift index 19a17d7..223d0d6 100644 --- a/Sources/GenIR/OutputPostprocessor.swift +++ b/Sources/GenIR/OutputPostprocessor.swift @@ -79,14 +79,14 @@ class OutputPostprocessor { // Copy over this target's static dependencies var processed: Set = [] - try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDeps: &targetDependencies) + try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDependencies: &targetDependencies) // Persist the dependency map for this target - try persistDynamicDependencies(map: targetDependencies, to: irDirectory.appendingPathComponent("savedDeps.json")) + try persistDynamicDependencies(map: targetDependencies, to: irDirectory.appendingPathComponent("savedDependencies.json")) } } - private func copyDependencies(for target: Target, to irDirectory: URL, processed: inout Set, savedDeps: inout [String: [String]]) throws { + private func copyDependencies(for target: Target, to irDirectory: URL, processed: inout Set, savedDependencies: inout [String: [String]]) throws { guard processed.insert(target).inserted else { return } @@ -99,13 +99,13 @@ class OutputPostprocessor { // Skip this directory for any dynamic dependency that is not the current one being processed. During preprocessing on the // platform the modules for this dependency will be retrieved and added to this module. if irDirectory.lastPathComponent != node.value.productName { - savedDeps[irDirectory.lastPathComponent, default: []].append(node.value.productName) + savedDependencies[irDirectory.lastPathComponent, default: []].append(node.value.productName) } GenIRLogger.logger.debug(" ---> Skipping dynamic dependency: \(node.value.productName)") continue } - try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDeps: &savedDeps) + try copyDependencies(for: node.value, to: irDirectory, processed: &processed, savedDependencies: &savedDependencies) let buildDirectory = build.appendingPathComponent(node.value.productName) if manager.directoryExists(at: buildDirectory) { diff --git a/Tests/GenIRTests/WorkspaceTests.swift b/Tests/GenIRTests/WorkspaceTests.swift index a39a1db..f660b8f 100644 --- a/Tests/GenIRTests/WorkspaceTests.swift +++ b/Tests/GenIRTests/WorkspaceTests.swift @@ -15,7 +15,7 @@ final class WorkspaceTests: XCTestCase { static let frameworkIRFiles: Set = ["Framework.bc", "Framework_vers.bc"] static let sfSafeSymbolsIRFiles: Set = [ "NSImageExtension.bc", - "savedDeps.json", + "savedDependencies.json", "SFSymbol+1.0.bc", "SFSymbol+1.1.bc", "SFSymbol+2.0.bc",