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
19 changes: 3 additions & 16 deletions Sources/PackageGraph/ModulesGraph+Loading.swift
Original file line number Diff line number Diff line change
Expand Up @@ -728,23 +728,10 @@ private func createResolvedPackages(
moduleBuilder.dependencies += implicitSystemLibraryDeps.map { .module($0, conditions: []) }

// Establish product dependencies.
for case .product(let productRef, let conditions) in moduleBuilder.module.dependencies {
for case .product(let productRef, var conditions) in moduleBuilder.module.dependencies {
if let package = productRef.package, prebuilts[.plain(package)]?[productRef.name] != nil {
// See if we're using a prebuilt instead
if moduleBuilder.module.type == .macro {
continue
} else if moduleBuilder.module.type == .test {
// use prebuilt if this is a test that depends a macro target
// these are guaranteed built for host
if moduleBuilder.module.dependencies.contains(where: { dep in
guard let module = dep.module else {
return false
}
return module.type == .macro
}) {
continue
}
}
// Only use the dependency if not on host
conditions.append(.host(.init(isHost: false)))
}

// Find the product in this package's dependency products.
Expand Down
7 changes: 6 additions & 1 deletion Sources/PackageGraph/Resolution/ResolvedModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,12 @@ extension ResolvedModule: Identifiable {
public var targetName: String { self.moduleName }

public let moduleName: String
let packageIdentity: PackageIdentity
public let packageIdentity: PackageIdentity

public init(moduleName: String, packageIdentity: PackageIdentity) {
self.moduleName = moduleName
self.packageIdentity = packageIdentity
}
}

public var id: ID {
Expand Down
57 changes: 28 additions & 29 deletions Sources/PackageLoading/PackageBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1407,40 +1407,39 @@ public final class PackageBuilder {
table.add(assignment, for: .SWIFT_ACTIVE_COMPILATION_CONDITIONS)
}

// Add in flags for prebuilts if the target is a macro or a macro test.
// Currently we only support prebuilts for macros.
if target.type == .macro || target.isMacroTest(in: manifest) {
let prebuiltLibraries: [String: PrebuiltLibrary] = target.dependencies.reduce(into: .init()) {
guard case let .product(name: name, package: package, moduleAliases: _, condition: _) = $1,
let package = package,
let prebuilt = prebuilts[.plain(package)]?[name]
else {
return
}

$0[prebuilt.libraryName] = prebuilt
// Add in flags for prebuilts on host
let prebuiltLibraries: [String: PrebuiltLibrary] = target.dependencies.reduce(into: .init()) {
guard case let .product(name: name, package: package, moduleAliases: _, condition: _) = $1,
let package = package,
let prebuilt = prebuilts[.plain(package)]?[name]
else {
return
}

for prebuilt in prebuiltLibraries.values {
let lib = prebuilt.path.appending(components: ["lib", "lib\(prebuilt.libraryName).a"]).pathString
var ldFlagsAssignment = BuildSettings.Assignment()
ldFlagsAssignment.values = [lib]
table.add(ldFlagsAssignment, for: .OTHER_LDFLAGS)
$0[prebuilt.libraryName] = prebuilt
}

var includeDirs: [AbsolutePath] = [prebuilt.path.appending(component: "Modules")]
if let checkoutPath = prebuilt.checkoutPath, let includePath = prebuilt.includePath {
for includeDir in includePath {
includeDirs.append(checkoutPath.appending(includeDir))
}
} else {
for cModule in prebuilt.cModules {
includeDirs.append(prebuilt.path.appending(components: "include", cModule))
}
for prebuilt in prebuiltLibraries.values {
let lib = prebuilt.path.appending(components: ["lib", "lib\(prebuilt.libraryName).a"]).pathString
var ldFlagsAssignment = BuildSettings.Assignment()
ldFlagsAssignment.values = [lib]
ldFlagsAssignment.conditions = [.host(.init(isHost: true))]
table.add(ldFlagsAssignment, for: .OTHER_LDFLAGS)

var includeDirs: [AbsolutePath] = [prebuilt.path.appending(component: "Modules")]
if let checkoutPath = prebuilt.checkoutPath, let includePath = prebuilt.includePath {
for includeDir in includePath {
includeDirs.append(checkoutPath.appending(includeDir))
}
} else {
for cModule in prebuilt.cModules {
includeDirs.append(prebuilt.path.appending(components: "include", cModule))
}
var includeAssignment = BuildSettings.Assignment()
includeAssignment.values = includeDirs.map({ "-I\($0.pathString)" })
table.add(includeAssignment, for: .OTHER_SWIFT_FLAGS)
}
var includeAssignment = BuildSettings.Assignment()
includeAssignment.values = includeDirs.map({ "-I\($0.pathString)" })
includeAssignment.conditions = [.host(.init(isHost: true))]
table.add(includeAssignment, for: .OTHER_SWIFT_FLAGS)
}

return table
Expand Down
4 changes: 3 additions & 1 deletion Sources/PackageModel/BuildEnvironment.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
/// A build environment with which to evaluate conditions.
public struct BuildEnvironment {
public let platform: Platform
public let isHost: Bool
public let configuration: BuildConfiguration?

public init(platform: Platform, configuration: BuildConfiguration? = nil) {
public init(platform: Platform, isHost: Bool, configuration: BuildConfiguration? = nil) {
self.platform = platform
self.configuration = configuration
self.isHost = isHost
}
}
19 changes: 16 additions & 3 deletions Sources/PackageModel/Manifest/PackageConditionDescription.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public enum PackageCondition: Hashable, Sendable {
case platforms(PlatformsCondition)
case configuration(ConfigurationCondition)
case traits(TraitCondition)
case host(HostCondition)

public func satisfies(_ environment: BuildEnvironment) -> Bool {
switch self {
Expand All @@ -39,6 +40,8 @@ public enum PackageCondition: Hashable, Sendable {
return platforms.satisfies(environment)
case .traits(let traits):
return traits.satisfies(environment)
case .host(let host):
return host.satisfies(environment)
}
}

Expand Down Expand Up @@ -107,9 +110,7 @@ public struct ConfigurationCondition: Hashable, Sendable {
}
}


/// A configuration condition implies that an assignment is valid on
/// a particular build configuration.
/// A traits condition implies that an assignment is valid in the given build environment
public struct TraitCondition: Hashable, Sendable {
public let traits: Set<String>

Expand All @@ -122,3 +123,15 @@ public struct TraitCondition: Hashable, Sendable {
}
}

/// A host condition determines whether the build environment is for host
public struct HostCondition: Hashable, Sendable {
public let isHost: Bool

public init(isHost: Bool) {
self.isHost = isHost
}

public func satisfies(_ environment: BuildEnvironment) -> Bool {
environment.isHost == isHost
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public struct BuildParameters: Encodable {

/// The current build environment.
public var buildEnvironment: BuildEnvironment {
BuildEnvironment(platform: currentPlatform, configuration: configuration)
BuildEnvironment(platform: currentPlatform, isHost: destination == .host, configuration: configuration)
}

/// The current platform we're building for.
Expand Down
3 changes: 3 additions & 0 deletions Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import enum PackageModel.BuildConfiguration
import enum PackageModel.BuildSettings
import class PackageModel.ClangModule
import struct PackageModel.ConfigurationCondition
import struct PackageModel.HostCondition
import class PackageModel.Manifest
import class PackageModel.Module
import enum PackageModel.ModuleMapType
Expand Down Expand Up @@ -255,12 +256,14 @@ extension Sequence<PackageModel.PackageCondition> {
var platformConditions: [PackageModel.PlatformsCondition] = []
var configurationConditions: [PackageModel.ConfigurationCondition] = []
var traitConditions: [PackageModel.TraitCondition] = []
var hostConditions: [PackageModel.HostCondition] = []

for packageCondition in self {
switch packageCondition {
case .platforms(let condition): platformConditions.append(condition)
case .configuration(let condition): configurationConditions.append(condition)
case .traits(let condition): traitConditions.append(condition)
case .host(let condition): hostConditions.append(condition)
}
}

Expand Down
24 changes: 15 additions & 9 deletions Tests/BuildTests/BuildPlanTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -957,6 +957,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .release
),
graph: graph,
Expand Down Expand Up @@ -999,6 +1000,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .macOS,
isHost: true,
configuration: .debug
),
graph: graph,
Expand Down Expand Up @@ -1507,6 +1509,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .release
),
graph: graph,
Expand All @@ -1526,6 +1529,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(
platform: .macOS,
isHost: true,
configuration: .debug
),
graph: graph,
Expand Down Expand Up @@ -2106,6 +2110,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .release
),
graph: graph,
Expand Down Expand Up @@ -3568,7 +3573,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let graphResult = PackageGraphResultXCTest(graph)

do {
let linuxDebug = BuildEnvironment(platform: .linux, configuration: .debug)
let linuxDebug = BuildEnvironment(platform: .linux, isHost: true, configuration: .debug)
try graphResult.check(reachableBuildProducts: "aexec", "BLibrary1", "BLibrary2", in: linuxDebug)
try graphResult.check(reachableBuildTargets: "ATarget", "BTarget1", "BTarget2", in: linuxDebug)

Expand All @@ -3583,7 +3588,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
}

do {
let macosDebug = BuildEnvironment(platform: .macOS, configuration: .debug)
let macosDebug = BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug)
try graphResult.check(reachableBuildProducts: "aexec", "BLibrary2", in: macosDebug)
try graphResult.check(reachableBuildTargets: "ATarget", "BTarget2", "BTarget3", in: macosDebug)

Expand All @@ -3598,7 +3603,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
}

do {
let androidRelease = BuildEnvironment(platform: .android, configuration: .release)
let androidRelease = BuildEnvironment(platform: .android, isHost: false, configuration: .release)
try graphResult.check(reachableBuildProducts: "aexec", "CLibrary", in: androidRelease)
try graphResult.check(reachableBuildTargets: "ATarget", "CTarget", in: androidRelease)

Expand Down Expand Up @@ -4905,7 +4910,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test debug configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .debug),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand All @@ -4927,7 +4932,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test release configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .release),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand Down Expand Up @@ -4993,7 +4998,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test debug configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .debug),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand All @@ -5011,7 +5016,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test release configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .release),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand Down Expand Up @@ -5131,7 +5136,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test debug configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .debug),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand Down Expand Up @@ -5162,7 +5167,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
// Test release configuration
do {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(platform: .macOS, configuration: .release),
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release),
graph: graph,
fileSystem: fs,
observabilityScope: observability.topScope
Expand Down Expand Up @@ -7235,6 +7240,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
let result = try await BuildPlanResult(plan: mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .release
),
graph: graph,
Expand Down
4 changes: 4 additions & 0 deletions Tests/BuildTests/LLBuildManifestBuilderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ struct LLBuildManifestBuilderTests {
var plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .macOS,
isHost: true,
configuration: .release
),
graph: graph,
Expand Down Expand Up @@ -86,6 +87,7 @@ struct LLBuildManifestBuilderTests {
plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .macOS,
isHost: true,
configuration: .debug
),
graph: graph,
Expand Down Expand Up @@ -129,6 +131,7 @@ struct LLBuildManifestBuilderTests {
plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .release
),
graph: graph,
Expand All @@ -155,6 +158,7 @@ struct LLBuildManifestBuilderTests {
plan = try await mockBuildPlan(
environment: BuildEnvironment(
platform: .linux,
isHost: true,
configuration: .debug
),
graph: graph,
Expand Down
8 changes: 4 additions & 4 deletions Tests/BuildTests/PluginInvocationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ final class PluginInvocationTests: XCTestCase {
let pluginRunner = MockPluginScriptRunner()
let buildParameters = mockBuildParameters(
destination: .host,
environment: BuildEnvironment(platform: .macOS, configuration: .debug)
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug)
)

let results = try await invokeBuildToolPlugins(
Expand Down Expand Up @@ -960,7 +960,7 @@ final class PluginInvocationTests: XCTestCase {
let outputDir = packageDir.appending(".build")
let buildParameters = mockBuildParameters(
destination: .host,
environment: BuildEnvironment(platform: .macOS, configuration: .debug)
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug)
)

let result = try await invokeBuildToolPlugins(
Expand Down Expand Up @@ -1102,7 +1102,7 @@ final class PluginInvocationTests: XCTestCase {
let outputDir = packageDir.appending(".build")
let buildParameters = mockBuildParameters(
destination: .host,
environment: BuildEnvironment(platform: .macOS, configuration: .debug)
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug)
)

let result = try await invokeBuildToolPlugins(
Expand Down Expand Up @@ -1456,7 +1456,7 @@ final class PluginInvocationTests: XCTestCase {
let outputDir = packageDir.appending(".build")
let buildParameters = mockBuildParameters(
destination: .host,
environment: BuildEnvironment(platform: .macOS, configuration: .debug)
environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug)
)

return try await invokeBuildToolPlugins(
Expand Down
Loading