Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions Sources/SWBCore/ProjectModel/BuildFile.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,40 @@ public final class BuildFile: ProjectModelItem {
/// Whether to skip the "no rule to process file..." warning for this file.
public let shouldWarnIfNoRuleToProcess: Bool

private init(
guid: String,
buildableItem: BuildableItem,
headerVisibility: HeaderVisibility?,
additionalArgs: MacroStringListExpression?,
decompress: Bool,
migCodegenFiles: MigCodegenFiles?,
intentsCodegenVisibility: IntentsCodegenVisibility,
resourceRule: ResourceRule,
codeSignOnCopy: Bool,
removeHeadersOnCopy: Bool,
shouldLinkWeakly: Bool,
assetTags: Set<String>,
platformFilters: Set<PlatformFilter>,
buildConfigurationFilters: Set<BuildConfigurationFilter>,
shouldWarnIfNoRuleToProcess: Bool
) {
self.guid = guid
self.buildableItem = buildableItem
self.headerVisibility = headerVisibility
self.additionalArgs = additionalArgs
self.decompress = decompress
self.migCodegenFiles = migCodegenFiles
self.intentsCodegenVisibility = intentsCodegenVisibility
self.resourceRule = resourceRule
self.codeSignOnCopy = codeSignOnCopy
self.removeHeadersOnCopy = removeHeadersOnCopy
self.shouldLinkWeakly = shouldLinkWeakly
self.assetTags = assetTags
self.platformFilters = platformFilters
self.buildConfigurationFilters = buildConfigurationFilters
self.shouldWarnIfNoRuleToProcess = shouldWarnIfNoRuleToProcess
}

init(_ model: SWBProtocol.BuildFile, _ pifLoader: PIFLoader)
{
guid = model.guid
Expand Down Expand Up @@ -215,6 +249,31 @@ public final class BuildFile: ProjectModelItem {
}
}

extension BuildFile {
package func with(
platformFilters: Set<PlatformFilter>,
buildConfigurationFilters: Set<BuildConfigurationFilter>
) -> BuildFile {
.init(
guid: self.guid,
buildableItem: self.buildableItem,
headerVisibility: self.headerVisibility,
additionalArgs: self.additionalArgs,
decompress: self.decompress,
migCodegenFiles: self.migCodegenFiles,
intentsCodegenVisibility: self.intentsCodegenVisibility,
resourceRule: self.resourceRule,
codeSignOnCopy: self.codeSignOnCopy,
removeHeadersOnCopy: self.removeHeadersOnCopy,
shouldLinkWeakly: self.shouldLinkWeakly,
assetTags: self.assetTags,
platformFilters: platformFilters,
buildConfigurationFilters: buildConfigurationFilters,
shouldWarnIfNoRuleToProcess: self.shouldWarnIfNoRuleToProcess
)
}
}

extension HeaderVisibility: PIFStringEnum {
public static let logicalTypeName = "header visibility"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,17 +177,27 @@ final class SwiftPackageCopyFilesTaskProducer: CopyFilesTaskProducer {
aggregatedBuildConfigurationFilters = buildConfigurationFilters.reduce([]) { $0.union($1) }
}

let target: Target
if case .targetProduct(let guid) = firstBuildFile.buildableItem, let _target = context.workspaceContext.workspace.target(for: guid) {
target = _target
} else {
// If this isn't a target product reference, it has to be a `binaryTarget` which does not support platform or build configuration filters by definition, so we can return the first build file instead.
assert(aggregatedPlatformFilters.isEmpty)
assert(aggregatedBuildConfigurationFilters.isEmpty)
return firstBuildFile
}
switch firstBuildFile.buildableItem {
case .targetProduct(guid: let guid):
guard let target = context.workspaceContext.workspace.target(
for: guid
) else {
assertionFailure("Expected target for '\(guid)'")
return firstBuildFile
}

return BuildFile(guid: firstBuildFile.guid, targetProductGuid: target.guid, platformFilters: aggregatedPlatformFilters, buildConfigurationFilters: aggregatedBuildConfigurationFilters)
return .init(
guid: firstBuildFile.guid,
targetProductGuid: target.guid,
platformFilters: aggregatedPlatformFilters,
buildConfigurationFilters: aggregatedBuildConfigurationFilters
)
case .reference, .namedReference:
return firstBuildFile.with(
platformFilters: aggregatedPlatformFilters,
buildConfigurationFilters: aggregatedBuildConfigurationFilters
)
}
}

return buildFiles
Expand Down
Loading
Loading