Skip to content

Commit 7dde3c9

Browse files
authored
Move App Intents Task Producer to SWBApplePlatform (#347)
* Move App Intents Task Producer * Fix formatting * Pass in buildPhasesEndNode for task construction * Add unorderedPostBuildPhasesTaskProducers
1 parent 1d45a98 commit 7dde3c9

File tree

12 files changed

+64
-29
lines changed

12 files changed

+64
-29
lines changed

Sources/SWBCore/SpecImplementations/Tools/AppIntentsMetadataCompiler.swift renamed to Sources/SWBApplePlatform/AppIntentsMetadataCompiler.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import SWBUtil
1414
import SWBMacro
15+
public import SWBCore
1516

1617
/// The minimal data we need to serialize to reconstruct `generateLocalizationInfo`
1718
private struct AppIntentsLocalizationPayload: TaskPayload {
Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,11 @@
1212

1313
import SWBCore
1414
import SWBUtil
15+
import SWBTaskConstruction
1516

1617
final class AppIntentsMetadataTaskProducer: PhasedTaskProducer, TaskProducer {
17-
var sourcesBuildPhase: SourcesBuildPhase?
18-
var resourcesBuildPhase: ResourcesBuildPhase?
1918

20-
init(_ context: TargetTaskProducerContext, sourcesBuildPhase: SourcesBuildPhase?, resourcesBuildPhase: ResourcesBuildPhase?, phaseStartNodes: [any PlannedNode], phaseEndNode: any PlannedNode) {
21-
self.sourcesBuildPhase = sourcesBuildPhase
22-
self.resourcesBuildPhase = resourcesBuildPhase
19+
init(_ context: TargetTaskProducerContext, phaseStartNodes: [any PlannedNode], phaseEndNode: any PlannedNode) {
2320
super.init(context, phaseStartNodes: phaseStartNodes, phaseEndNode: phaseEndNode)
2421
}
2522

@@ -54,12 +51,15 @@ final class AppIntentsMetadataTaskProducer: PhasedTaskProducer, TaskProducer {
5451
guard !context.settings.globalScope.evaluate(BuiltinMacros.LM_SKIP_METADATA_EXTRACTION) else {
5552
return []
5653
}
54+
guard let configuredTarget = self.targetContext.configuredTarget, let buildPhaseTarget = configuredTarget.target as? BuildPhaseTarget else {
55+
return []
56+
}
5757

5858
context.addDeferredProducer {
5959
let scope = self.context.settings.globalScope
6060
var deferredTasks: [any PlannedTask] = []
61-
let buildFilesProcessingContext = BuildFilesProcessingContext(scope)
62-
let swiftSources: [FileToBuild] = self.filterBuildFiles(self.sourcesBuildPhase?.buildFiles, identifiers: ["sourcecode.swift"], buildFilesProcessingContext: buildFilesProcessingContext)
61+
let buildFilesProcessingContext = BuildFilesProcessingContext(self.context.settings.globalScope)
62+
let swiftSources: [FileToBuild] = self.filterBuildFiles(buildPhaseTarget.sourcesBuildPhase?.buildFiles, identifiers: ["sourcecode.swift"], buildFilesProcessingContext: buildFilesProcessingContext)
6363
let perArchConstMetadataFiles = self.context.generatedSwiftConstMetadataFiles()
6464

6565
var metadataDependencyList: Set<Path> = []
@@ -136,12 +136,12 @@ final class AppIntentsMetadataTaskProducer: PhasedTaskProducer, TaskProducer {
136136
}
137137

138138
}
139-
let appShortcutStringsSources: [FileToBuild] = self.filterBuildFiles(self.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { ["AppShortcuts.strings", "AppShortcuts.xcstrings"].contains($0.absolutePath.basename) }
139+
let appShortcutStringsSources: [FileToBuild] = self.filterBuildFiles(buildPhaseTarget.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { ["AppShortcuts.strings", "AppShortcuts.xcstrings"].contains($0.absolutePath.basename) }
140140

141141
let cbc = CommandBuildContext(producer: self.context, scope: scope, inputs: swiftSources + constMetadataFilesToBuild + appShortcutStringsSources, resourcesDir: buildFilesProcessingContext.resourcesDir)
142142

143143

144-
let assistantIntentsStringsSources: [FileToBuild] = self.filterBuildFiles(self.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { ["AssistantIntents.strings", "AssistantIntents.xcstrings"].contains($0.absolutePath.basename) }
144+
let assistantIntentsStringsSources: [FileToBuild] = self.filterBuildFiles(buildPhaseTarget.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { ["AssistantIntents.strings", "AssistantIntents.xcstrings"].contains($0.absolutePath.basename) }
145145
await self.appendGeneratedTasks(&deferredTasks) { delegate in
146146
let shouldConstructAppIntentsMetadataTask = self.context.appIntentsMetadataCompilerSpec.shouldConstructAppIntentsMetadataTask(cbc)
147147
let isInstallLoc = scope.evaluate(BuiltinMacros.BUILD_COMPONENTS).contains("installLoc")
@@ -161,13 +161,13 @@ final class AppIntentsMetadataTaskProducer: PhasedTaskProducer, TaskProducer {
161161
((!scope.effectiveInputInfoPlistPath().isEmpty && shouldConstructAppIntentsMetadataTask) || isInstallLoc) {
162162
var infoPlistSources: [FileToBuild]
163163
if isInstallLoc {
164-
infoPlistSources = self.filterBuildFiles(self.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { $0.absolutePath.basename.hasSuffix("InfoPlist.strings") || $0.absolutePath.basename.hasSuffix("InfoPlist.xcstrings") }
164+
infoPlistSources = self.filterBuildFiles(buildPhaseTarget.resourcesBuildPhase?.buildFiles, identifiers: ["text.plist.strings", "text.json.xcstrings"], buildFilesProcessingContext: buildFilesProcessingContext).filter { $0.absolutePath.basename.hasSuffix("InfoPlist.strings") || $0.absolutePath.basename.hasSuffix("InfoPlist.xcstrings") }
165165
// The installLoc builds should include an AppShortcuts strings/xcstrings file to run SSU tasks
166166
guard appShortcutStringsSources.count == 1 else {
167167
return
168168
}
169169
} else {
170-
infoPlistSources = [FileToBuild(context: self.context, absolutePath: scope.evaluate(BuiltinMacros.TARGET_BUILD_DIR).join(scope.evaluate(BuiltinMacros.INFOPLIST_PATH)))]
170+
infoPlistSources = [FileToBuild(absolutePath: scope.evaluate(BuiltinMacros.TARGET_BUILD_DIR).join(scope.evaluate(BuiltinMacros.INFOPLIST_PATH)), inferringTypeUsing: self.context)]
171171
}
172172
let yamlGenerationInputs: [FileToBuild] = infoPlistSources + appShortcutStringsSources
173173
let appIntentsSsuTrainingCbc = CommandBuildContext(producer: self.context, scope: scope, inputs: yamlGenerationInputs, resourcesDir: buildFilesProcessingContext.resourcesDir)
@@ -180,3 +180,13 @@ final class AppIntentsMetadataTaskProducer: PhasedTaskProducer, TaskProducer {
180180
return tasks
181181
}
182182
}
183+
184+
extension TaskProducerContext {
185+
var appIntentsMetadataCompilerSpec: AppIntentsMetadataCompilerSpec {
186+
return workspaceContext.core.specRegistry.getSpec("com.apple.compilers.appintentsmetadata", domain: domain) as! AppIntentsMetadataCompilerSpec
187+
}
188+
189+
var appIntentsSsuTrainingCompilerSpec: AppIntentsSSUTrainingCompilerSpec {
190+
return workspaceContext.core.specRegistry.getSpec("com.apple.compilers.appintents-ssu-training", domain: domain) as! AppIntentsSSUTrainingCompilerSpec
191+
}
192+
}

Sources/SWBCore/SpecImplementations/Tools/AppIntentsSSUTrainingCompiler.swift renamed to Sources/SWBApplePlatform/AppIntentsSSUTrainingCompiler.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import SWBUtil
1414
import Foundation
1515
import SWBMacro
16+
public import SWBCore
1617

1718
final public class AppIntentsSSUTrainingCompilerSpec: GenericCommandLineToolSpec, SpecIdentifierType, @unchecked Sendable {
1819
public static let identifier = "com.apple.compilers.appintents-ssu-training"

Sources/SWBApplePlatform/Plugin.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,15 @@ struct TaskProducersExtension: TaskProducerExtension {
4040
}
4141

4242
var unorderedPostSetupTaskProducers: [any TaskProducerFactory] {
43-
[StubBinaryTaskProducerFactory()]
43+
[
44+
StubBinaryTaskProducerFactory()
45+
]
46+
}
47+
48+
var unorderedPostBuildPhasesTaskProducers: [any TaskProducerFactory] {
49+
[
50+
AppIntentsMetadataTaskProducerFactory()
51+
]
4452
}
4553

4654
var globalTaskProducers: [any GlobalTaskProducerFactory] {
@@ -62,6 +70,16 @@ struct StubBinaryTaskProducerFactory: TaskProducerFactory, GlobalTaskProducerFac
6270
}
6371
}
6472

73+
struct AppIntentsMetadataTaskProducerFactory : TaskProducerFactory {
74+
var name: String {
75+
"AppIntentsMetadataTaskProducer"
76+
}
77+
78+
func createTaskProducer(_ context: TargetTaskProducerContext, startPhaseNodes: [PlannedVirtualNode], endPhaseNode: PlannedVirtualNode) -> any TaskProducer {
79+
AppIntentsMetadataTaskProducer(context, phaseStartNodes: startPhaseNodes, phaseEndNode: endPhaseNode)
80+
}
81+
}
82+
6583
struct RealityAssetsTaskProducerFactory: TaskProducerFactory {
6684
var name: String {
6785
"RealityAssetsTaskProducer"
@@ -76,6 +94,8 @@ struct ApplePlatformSpecsExtension: SpecificationsExtension {
7694
func specificationClasses() -> [any SpecIdentifierType.Type] {
7795
[
7896
ActoolCompilerSpec.self,
97+
AppIntentsMetadataCompilerSpec.self,
98+
AppIntentsSSUTrainingCompilerSpec.self,
7999
CoreDataModelCompilerSpec.self,
80100
CoreMLCompilerSpec.self,
81101
CopyTiffFileSpec.self,

Sources/SWBCore/SpecImplementations/RegisterSpecs.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ public struct BuiltinSpecsExtension: SpecificationsExtension {
4444

4545
public func specificationClasses() -> [any SpecIdentifierType.Type] {
4646
[
47-
AppIntentsMetadataCompilerSpec.self,
4847
AppShortcutStringsMetadataCompilerSpec.self,
49-
AppIntentsSSUTrainingCompilerSpec.self,
5048
CodesignToolSpec.self,
5149
CopyToolSpec.self,
5250
ClangStatCacheSpec.self,

Sources/SWBCore/SpecImplementations/Specs.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public class FileTypeSpec : Spec, SpecType, @unchecked Sendable {
284284
public let isFramework: Bool
285285

286286
/// The extensions matched by this file type.
287-
let extensions: Set<String>
287+
public let extensions: Set<String>
288288

289289
/// The language dialect, suitable for passing to clang via its `-x` option. This will be `nil` if the file type does not define the language dialect.
290290
public let languageDialect: GCCCompatibleLanguageDialect?

Sources/SWBCore/TaskGeneration.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,8 +1133,14 @@ public struct LocalizationBuildPortion: Hashable, Sendable {
11331133
/// The name of the architecture we were building for.
11341134
public let architecture: String
11351135

1136+
public init(effectivePlatformName: String, variant: String, architecture: String) {
1137+
self.effectivePlatformName = effectivePlatformName
1138+
self.variant = variant
1139+
self.architecture = architecture
1140+
}
1141+
11361142
/// Returns a platform name to use for localization info purposes.
1137-
static func effectivePlatformName(scope: MacroEvaluationScope, sdkVariant: SDKVariant?) -> String {
1143+
public static func effectivePlatformName(scope: MacroEvaluationScope, sdkVariant: SDKVariant?) -> String {
11381144
if let sdkVariant, sdkVariant.isMacCatalyst {
11391145
// Treat Catalyst as a separate platform.
11401146
return MacCatalystInfo.localizationEffectivePlatformName

Sources/SWBTaskConstruction/ProductPlanning/ProductPlanner.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,11 +470,13 @@ extension StandardTarget
470470
taskProducers.append(factory.createTaskProducer(taskProducerContext, startPhaseNodes: [setupEndPhaseNode], endPhaseNode: endPhaseNode))
471471
postprocessingTaskProducerInputNodes.append(endPhaseNode)
472472
}
473-
}
474473

475-
createNewPhaseNode("AppIntentsMetadataTaskProducer")
476-
taskProducers.append(AppIntentsMetadataTaskProducer(taskProducerContext, sourcesBuildPhase: self.sourcesBuildPhase, resourcesBuildPhase: self.resourcesBuildPhase, phaseStartNodes: [setupEndPhaseNode, buildPhasesEndNode], phaseEndNode: endPhaseNode))
477-
postprocessingTaskProducerInputNodes.append(endPhaseNode)
474+
for factory in taskProducerExtension.unorderedPostBuildPhasesTaskProducers {
475+
createNewPhaseNode(factory.name)
476+
taskProducers.append(factory.createTaskProducer(taskProducerContext, startPhaseNodes: [setupEndPhaseNode, buildPhasesEndNode], endPhaseNode: endPhaseNode))
477+
postprocessingTaskProducerInputNodes.append(endPhaseNode)
478+
}
479+
}
478480

479481
// Add postprocessing task producers. These are ordered after all of the other task producers.
480482
createNewPhaseNode("ProductPostprocessingTaskProducer")

Sources/SWBTaskConstruction/TaskProducers/BuildPhaseTaskProducers/FilesBasedBuildPhaseTaskProducer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ package final class BuildFilesProcessingContext: BuildFileFilteringContext {
7272
fileprivate let resolveBuildRules: Bool
7373

7474
/// The resources directory for the product, if relevant.
75-
let resourcesDir: Path
75+
public let resourcesDir: Path
7676
/// The resources intermediates directory, if appropriate.
7777
let tmpResourcesDir: Path
7878

Sources/SWBTaskConstruction/TaskProducers/StandardTaskProducer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ open class PhasedTaskProducer: StandardTaskProducer {
102102
/// The subclass *must* manually report these, if `addTaskBarrier` is used.
103103
var additionalGateTasks: [any PlannedTask] = []
104104

105-
var targetContext: TargetTaskProducerContext
105+
public var targetContext: TargetTaskProducerContext
106106

107107
/// Create a phased task producer.
108108
///

Sources/SWBTaskConstruction/TaskProducers/TaskProducer.swift

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,7 @@ public class TaskProducerContext: StaleFileRemovalContext, BuildFileResolution
201201
}
202202
}
203203

204-
let appIntentsMetadataCompilerSpec: AppIntentsMetadataCompilerSpec
205-
let appShortcutStringsMetadataCompilerSpec: AppShortcutStringsMetadataCompilerSpec
206-
let appIntentsSsuTrainingCompilerSpec: AppIntentsSSUTrainingCompilerSpec
204+
public let appShortcutStringsMetadataCompilerSpec: AppShortcutStringsMetadataCompilerSpec
207205
let appleScriptCompilerSpec: CommandLineToolSpec
208206
public let clangSpec: ClangCompilerSpec
209207
public let clangAssemblerSpec: ClangCompilerSpec
@@ -331,9 +329,7 @@ public class TaskProducerContext: StaleFileRemovalContext, BuildFileResolution
331329
//
332330
// FIXME: These should really be bound even earlier, like in the spec cache. Or at least, we should throw here and just produce a dep graph error if any are missing.
333331
let domain = settings.platform?.name ?? ""
334-
self.appIntentsMetadataCompilerSpec = workspaceContext.core.specRegistry.getSpec("com.apple.compilers.appintentsmetadata", domain: domain) as! AppIntentsMetadataCompilerSpec
335332
self.appShortcutStringsMetadataCompilerSpec = workspaceContext.core.specRegistry.getSpec("com.apple.compilers.appshortcutstringsmetadata", domain: domain) as! AppShortcutStringsMetadataCompilerSpec
336-
self.appIntentsSsuTrainingCompilerSpec = workspaceContext.core.specRegistry.getSpec("com.apple.compilers.appintents-ssu-training", domain: domain) as! AppIntentsSSUTrainingCompilerSpec
337333
self.appleScriptCompilerSpec = workspaceContext.core.specRegistry.getSpec("com.apple.compilers.osacompile", domain: domain) as! CommandLineToolSpec
338334
self.clangSpec = try! workspaceContext.core.specRegistry.getSpec(domain: domain) as ClangCompilerSpec
339335
self.clangAssemblerSpec = try! workspaceContext.core.specRegistry.getSpec(domain: domain) as ClangAssemblerSpec
@@ -556,7 +552,7 @@ public class TaskProducerContext: StaleFileRemovalContext, BuildFileResolution
556552
}
557553

558554
/// Get the product generated Swift Objective-C interface header files.
559-
func generatedSwiftConstMetadataFiles() -> [String: [Path]] {
555+
public func generatedSwiftConstMetadataFiles() -> [String: [Path]] {
560556
return queue.blocking_sync {
561557
assert(_inDeferredMode)
562558
return _generatedGeneratedSwiftConstMetadataFiles
@@ -607,7 +603,7 @@ public class TaskProducerContext: StaleFileRemovalContext, BuildFileResolution
607603
}
608604

609605
/// Add a deferred task production block.
610-
func addDeferredProducer(_ body: @escaping () async -> [any PlannedTask]) {
606+
public func addDeferredProducer(_ body: @escaping () async -> [any PlannedTask]) {
611607
queue.blocking_sync {
612608
assert(!_inDeferredMode)
613609
_deferredProducers.append(body)

Sources/SWBTaskConstruction/TaskProducers/TaskProducerExtensionPoint.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ package protocol TaskProducerExtension: Sendable {
2626

2727
var setupTaskProducers: [any TaskProducerFactory] { get }
2828
var unorderedPostSetupTaskProducers: [any TaskProducerFactory] { get }
29+
var unorderedPostBuildPhasesTaskProducers: [any TaskProducerFactory] { get }
2930
var globalTaskProducers: [any GlobalTaskProducerFactory] { get }
3031
}
3132

0 commit comments

Comments
 (0)