Skip to content
Merged
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
6 changes: 4 additions & 2 deletions Sources/Build/BuildPlan/BuildPlan+Test.swift
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ extension BuildPlan {
dependencies: testProduct.underlying.modules.map { .module($0, conditions: []) },
packageAccess: true, // test target is allowed access to package decls by default
testDiscoverySrc: Sources(paths: discoveryPaths, root: discoveryDerivedDir),
buildSettings: discoveryBuildSettings
buildSettings: discoveryBuildSettings,
implicit: true
)
let discoveryResolvedModule = ResolvedModule(
packageIdentity: testProduct.packageIdentity,
Expand Down Expand Up @@ -287,7 +288,8 @@ private extension PackageModel.SwiftModule {
dependencies: dependencies,
packageAccess: packageAccess,
buildSettings: buildSettings,
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: true
)
}
}
9 changes: 8 additions & 1 deletion Sources/Commands/PackageCommands/Migrate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,12 @@ extension SwiftPackageCommand {
} else {
let graph = try await buildSystem.getPackageGraph()
for buildDescription in buildPlan.buildModules
where graph.isRootPackage(buildDescription.package) && buildDescription.module.type != .plugin
where graph.isRootPackage(buildDescription.package)
{
let module = buildDescription.module
guard module.type != .plugin, !module.implicit else {
continue
}
modules.append(buildDescription)
}
}
Expand Down Expand Up @@ -204,6 +208,9 @@ extension SwiftPackageCommand {

return try await swiftCommandState.createBuildSystem(
traitConfiguration: .init(),
// Don't attempt to cache manifests with temporary
// feature flags added just for migration purposes.
cacheBuildManifest: false,
productsBuildParameters: destinationBuildParameters,
toolsBuildParameters: toolsBuildParameters,
// command result output goes on stdout
Expand Down
7 changes: 1 addition & 6 deletions Sources/PackageGraph/ModulesGraph+Loading.swift
Original file line number Diff line number Diff line change
Expand Up @@ -680,12 +680,7 @@ private func createResolvedPackages(
// Get all implicit system library dependencies in this package.
let implicitSystemLibraryDeps = packageBuilder.dependencies
.flatMap(\.modules)
.filter {
if case let systemLibrary as SystemLibraryModule = $0.module {
return systemLibrary.isImplicit
}
return false
}
.filter(\.module.implicit)

let packageDoesNotSupportProductAliases = packageBuilder.package.doesNotSupportProductAliases
let lookupByProductIDs = !packageDoesNotSupportProductAliases &&
Expand Down
6 changes: 6 additions & 0 deletions Sources/PackageGraph/Resolution/ResolvedModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,12 @@ public struct ResolvedModule {
})
}

/// Whether this module comes from a declaration in the manifest file
/// or was synthesized (i.e. some test modules are synthesized).
public var implicit: Bool {
self.underlying.implicit
}

/// Create a resolved module instance.
public init(
packageIdentity: PackageIdentity,
Expand Down
9 changes: 6 additions & 3 deletions Sources/PackageLoading/PackageBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1079,7 +1079,8 @@ public final class PackageBuilder {
declaredSwiftVersions: self.declaredSwiftVersions(),
buildSettings: buildSettings,
buildSettingsDescription: manifestTarget.settings,
usesUnsafeFlags: manifestTarget.usesUnsafeFlags
usesUnsafeFlags: manifestTarget.usesUnsafeFlags,
implicit: false
)
} else {
// It's not a Swift target, so it's a Clang target (those are the only two types of source target currently
Expand Down Expand Up @@ -1124,7 +1125,8 @@ public final class PackageBuilder {
dependencies: dependencies,
buildSettings: buildSettings,
buildSettingsDescription: manifestTarget.settings,
usesUnsafeFlags: manifestTarget.usesUnsafeFlags
usesUnsafeFlags: manifestTarget.usesUnsafeFlags,
implicit: false
)
}
}
Expand Down Expand Up @@ -1903,7 +1905,8 @@ extension PackageBuilder {
packageAccess: false,
buildSettings: buildSettings,
buildSettingsDescription: targetDescription.settings,
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: true
)
}
}
Expand Down
3 changes: 2 additions & 1 deletion Sources/PackageModel/Module/BinaryModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ public final class BinaryModule: Module {
buildSettings: .init(),
buildSettingsDescription: [],
pluginUsages: [],
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: false
)
}

Expand Down
6 changes: 4 additions & 2 deletions Sources/PackageModel/Module/ClangModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public final class ClangModule: Module {
dependencies: [Module.Dependency] = [],
buildSettings: BuildSettings.AssignmentTable = .init(),
buildSettingsDescription: [TargetBuildSettingDescription.Setting] = [],
usesUnsafeFlags: Bool
usesUnsafeFlags: Bool,
implicit: Bool
) throws {
guard includeDir.isDescendantOfOrEqual(to: sources.root) else {
throw StringError("\(includeDir) should be contained in the source root \(sources.root)")
Expand All @@ -86,7 +87,8 @@ public final class ClangModule: Module {
buildSettings: buildSettings,
buildSettingsDescription: buildSettingsDescription,
pluginUsages: [],
usesUnsafeFlags: usesUnsafeFlags
usesUnsafeFlags: usesUnsafeFlags,
implicit: implicit
)
}
}
8 changes: 7 additions & 1 deletion Sources/PackageModel/Module/Module.swift
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@ public class Module {
/// Whether or not this target uses any custom unsafe flags.
public let usesUnsafeFlags: Bool

/// Whether this module comes from a declaration in the manifest file
/// or was synthesized (i.e. some test modules are synthesized).
public let implicit: Bool

init(
name: String,
potentialBundleName: String? = nil,
Expand All @@ -256,7 +260,8 @@ public class Module {
buildSettings: BuildSettings.AssignmentTable,
buildSettingsDescription: [TargetBuildSettingDescription.Setting],
pluginUsages: [PluginUsage],
usesUnsafeFlags: Bool
usesUnsafeFlags: Bool,
implicit: Bool
) {
self.name = name
self.potentialBundleName = potentialBundleName
Expand All @@ -273,6 +278,7 @@ public class Module {
self.buildSettingsDescription = buildSettingsDescription
self.pluginUsages = pluginUsages
self.usesUnsafeFlags = usesUnsafeFlags
self.implicit = implicit
}
}

Expand Down
3 changes: 2 additions & 1 deletion Sources/PackageModel/Module/PluginModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ public final class PluginModule: Module {
buildSettings: .init(),
buildSettingsDescription: [],
pluginUsages: [],
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: false
)
}
}
Expand Down
15 changes: 10 additions & 5 deletions Sources/PackageModel/Module/SwiftModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public final class SwiftModule: Module {
dependencies: [Module.Dependency],
packageAccess: Bool,
testDiscoverySrc: Sources,
buildSettings: BuildSettings.AssignmentTable = .init()) {
buildSettings: BuildSettings.AssignmentTable = .init(),
implicit: Bool) {
self.declaredSwiftVersions = []

super.init(
Expand All @@ -46,7 +47,8 @@ public final class SwiftModule: Module {
buildSettings: buildSettings,
buildSettingsDescription: [],
pluginUsages: [],
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: implicit
)
}

Expand All @@ -68,7 +70,8 @@ public final class SwiftModule: Module {
buildSettings: BuildSettings.AssignmentTable = .init(),
buildSettingsDescription: [TargetBuildSettingDescription.Setting] = [],
pluginUsages: [PluginUsage] = [],
usesUnsafeFlags: Bool
usesUnsafeFlags: Bool,
implicit: Bool
) {
self.declaredSwiftVersions = declaredSwiftVersions
super.init(
Expand All @@ -85,7 +88,8 @@ public final class SwiftModule: Module {
buildSettings: buildSettings,
buildSettingsDescription: buildSettingsDescription,
pluginUsages: pluginUsages,
usesUnsafeFlags: usesUnsafeFlags
usesUnsafeFlags: usesUnsafeFlags,
implicit: implicit
)
}

Expand Down Expand Up @@ -133,7 +137,8 @@ public final class SwiftModule: Module {
buildSettings: buildSettings,
buildSettingsDescription: [],
pluginUsages: [],
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: true
)
}

Expand Down
7 changes: 2 additions & 5 deletions Sources/PackageModel/Module/SystemLibraryModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ public final class SystemLibraryModule: Module {
/// List of system package providers, if any.
public let providers: [SystemPackageProviderDescription]?

/// True if this system library should become implicit dependency of its dependent packages.
public let isImplicit: Bool

public init(
name: String,
path: AbsolutePath,
Expand All @@ -38,7 +35,6 @@ public final class SystemLibraryModule: Module {
let sources = Sources(paths: [], root: path)
self.pkgConfig = pkgConfig
self.providers = providers
self.isImplicit = isImplicit
super.init(
name: name,
type: .systemModule,
Expand All @@ -49,7 +45,8 @@ public final class SystemLibraryModule: Module {
buildSettings: .init(),
buildSettingsDescription: [],
pluginUsages: [],
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: isImplicit
)
}
}
3 changes: 2 additions & 1 deletion Sources/_InternalTestSupport/ResolvedModule+Mock.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ extension ResolvedModule {
sources: Sources(paths: [], root: "/"),
dependencies: [],
packageAccess: false,
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: true
),
dependencies: deps.map { .module($0, conditions: conditions) },
defaultLocalization: nil,
Expand Down
88 changes: 88 additions & 0 deletions Tests/BuildTests/BuildPlanTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7435,6 +7435,94 @@ class BuildPlanTestCase: BuildSystemProviderTestCase {
}
}
}

func testImplicitModules() async throws {
let fileSystem = InMemoryFileSystem(
emptyFiles:
"/A/Sources/ATarget/foo.swift",
"/A/Sources/AMacro/macro.swift",
"/A/Sources/AExecutable/main.swift",
"/A/Sources/ASystemLib/module.modulemap",
"/A/Plugins/APlugin/main.swift",
"/A/Tests/ATargetTests/foo.swift"
)

let observability = ObservabilitySystem.makeForTesting()
let graph = try loadModulesGraph(
fileSystem: fileSystem,
manifests: [
Manifest.createRootManifest(
displayName: "A",
path: "/A",
dependencies: [
],
targets: [
TargetDescription(name: "ATarget"),
TargetDescription(
name: "AMacro",
dependencies: [],
type: .`macro`
),
TargetDescription(
name: "AExecutable",
dependencies: ["ATarget"],
type: .executable
),
TargetDescription(
name: "APlugin",
type: .plugin,
pluginCapability: .buildTool
),
TargetDescription(
name: "ASystemLib",
type: .system
),
TargetDescription(
name: "ATargetTests",
dependencies: ["ATarget"],
type: .test
),
]
),
],
observabilityScope: observability.topScope
)
XCTAssertNoDiagnostics(observability.diagnostics)

let result = try await BuildPlanResult(plan: mockBuildPlan(
graph: graph,
fileSystem: fileSystem,
observabilityScope: observability.topScope
))

struct ExpectedTarget: Hashable, Equatable {
let name: String
let implicit: Bool
}

var expectedTargets: Set<ExpectedTarget> = [
.init(name: "ATarget", implicit: false),
.init(name: "AMacro", implicit: false),
.init(name: "AExecutable", implicit: false),
.init(name: "ATargetTests", implicit: false),
.init(name: "APackageTests", implicit: true),
]
#if !os(macOS)
expectedTargets.insert(.init(name: "APackageDiscoveredTests", implicit: true))
#endif
XCTAssertEqual(
Set(result.targetMap.map { ExpectedTarget(name: $0.module.name, implicit: $0.module.implicit) }),
expectedTargets
)
XCTAssertEqual(
result.plan.graph.module(for: "APlugin")?.implicit,
false
)
XCTAssertEqual(
result.plan.graph.module(for: "ASystemLib")?.implicit,
false
)
}
}

class BuildPlanNativeTests: BuildPlanTestCase {
Expand Down
3 changes: 2 additions & 1 deletion Tests/BuildTests/ClangTargetBuildDescriptionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ final class ClangTargetBuildDescriptionTests: XCTestCase {
type: .library,
path: .root,
sources: .init(paths: [.root.appending(component: "foo.c")], root: .root),
usesUnsafeFlags: false
usesUnsafeFlags: false,
implicit: true
)
}

Expand Down