in Sources/PackagePlugin/PluginInput.swift [84:200]
mutating func target(for id: WireInput.Target.Id) throws -> Target {
if let target = targetsById[id] { return target }
guard id < input.targets.count else {
throw PluginDeserializationError.malformedInputJSON("invalid target id (\(id))")
}
let wireTarget = input.targets[id]
let dependencies: [TargetDependency] = try wireTarget.dependencies.map {
switch $0 {
case .target(let targetId):
let target = try self.target(for: targetId)
return .target(target)
case .product(let productId):
let product = try self.product(for: productId)
return .product(product)
}
}
let directory = try self.path(for: wireTarget.directoryId)
let target: Target
switch wireTarget.info {
case let .swiftSourceModuleInfo(moduleName, sourceFiles, compilationConditions, linkedLibraries, linkedFrameworks):
let sourceFiles = FileList(try sourceFiles.map {
let path = try self.path(for: $0.basePathId).appending($0.name)
let type: FileType
switch $0.type {
case .source:
type = .source
case .header:
type = .header
case .resource:
type = .resource
case .unknown:
type = .unknown
}
return File(path: path, type: type)
})
target = SwiftSourceModuleTarget(
id: String(id),
name: wireTarget.name,
directory: directory,
dependencies: dependencies,
moduleName: moduleName,
sourceFiles: sourceFiles,
compilationConditions: compilationConditions,
linkedLibraries: linkedLibraries,
linkedFrameworks: linkedFrameworks)
case let .clangSourceModuleInfo(moduleName, sourceFiles, preprocessorDefinitions, headerSearchPaths, publicHeadersDirId, linkedLibraries, linkedFrameworks):
let publicHeadersDir = try publicHeadersDirId.map { try self.path(for: $0) }
let sourceFiles = FileList(try sourceFiles.map {
let path = try self.path(for: $0.basePathId).appending($0.name)
let type: FileType
switch $0.type {
case .source:
type = .source
case .header:
type = .header
case .resource:
type = .resource
case .unknown:
type = .unknown
}
return File(path: path, type: type)
})
target = ClangSourceModuleTarget(
id: String(id),
name: wireTarget.name,
directory: directory,
dependencies: dependencies,
moduleName: moduleName,
sourceFiles: sourceFiles,
preprocessorDefinitions: preprocessorDefinitions,
headerSearchPaths: headerSearchPaths,
publicHeadersDirectory: publicHeadersDir,
linkedLibraries: linkedLibraries,
linkedFrameworks: linkedFrameworks)
case let .binaryArtifactInfo(kind, origin, artifactId):
let artifact = try self.path(for: artifactId)
let artifactKind: BinaryArtifactTarget.Kind
switch kind {
case .artifactsArchive:
artifactKind = .artifactsArchive
case .xcframework:
artifactKind = .xcframework
}
let artifactOrigin: BinaryArtifactTarget.Origin
switch origin {
case .local:
artifactOrigin = .local
case .remote(let url):
artifactOrigin = .remote(url: url)
}
target = BinaryArtifactTarget(
id: String(id),
name: wireTarget.name,
directory: directory,
dependencies: dependencies,
kind: artifactKind,
origin: artifactOrigin,
artifact: artifact)
case let .systemLibraryInfo(pkgConfig, compilerFlags, linkerFlags):
target = SystemLibraryTarget(
id: String(id),
name: wireTarget.name,
directory: directory,
dependencies: dependencies,
pkgConfig: pkgConfig,
compilerFlags: compilerFlags,
linkerFlags: linkerFlags)
}
targetsById[id] = target
return target
}