Skip to content

Commit 796b7ff

Browse files
authored
supress warnings from remote dependencies (#5605) (#5608)
1 parent 6dec900 commit 796b7ff

File tree

8 files changed

+124
-2
lines changed

8 files changed

+124
-2
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// swift-tools-version: 5.7
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "app",
6+
products: [
7+
.executable(name: "app", targets: ["app"])
8+
],
9+
dependencies: [
10+
.package(url: "../dep1", from: "1.0.0"),
11+
.package(url: "../dep2", from: "1.0.0"),
12+
],
13+
targets: [
14+
.executableTarget(
15+
name: "app",
16+
dependencies: [
17+
.product(name: "dep1", package: "dep1"),
18+
.product(name: "dep2", package: "dep2")
19+
],
20+
path: "./"
21+
)
22+
]
23+
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import dep1
2+
import dep2
3+
4+
@main
5+
struct App {
6+
var deprecated: DeprecatedApp
7+
8+
public static func main() {
9+
print("hello, world!")
10+
}
11+
}
12+
13+
@available(*, deprecated)
14+
struct DeprecatedApp {
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// swift-tools-version: 5.7
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "dep1",
6+
products: [
7+
.library(name: "dep1", targets: ["dep1"])
8+
],
9+
targets: [
10+
.target(name: "dep1", path: "./")
11+
]
12+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct Dep1 {
2+
var deprecated: Deprecated1
3+
}
4+
5+
@available(*, deprecated)
6+
struct Deprecated1 {
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// swift-tools-version: 5.7
2+
import PackageDescription
3+
4+
let package = Package(
5+
name: "dep2",
6+
products: [
7+
.library(name: "dep2", targets: ["dep2"])
8+
],
9+
targets: [
10+
.target(name: "dep2", path: "./")
11+
]
12+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct Dep2 {
2+
var deprecated: Deprecated2
3+
}
4+
5+
@available(*, deprecated)
6+
struct Deprecated2 {
7+
}

Sources/Build/BuildPlan.swift

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,8 @@ public final class ClangTargetBuildDescription {
530530

531531
/// Target description for a Swift target.
532532
public final class SwiftTargetBuildDescription {
533+
/// The package this target belongs to.
534+
public let package: ResolvedPackage
533535

534536
/// The target described by this target.
535537
public let target: ResolvedTarget
@@ -661,6 +663,7 @@ public final class SwiftTargetBuildDescription {
661663

662664
/// Create a new target description with target and build parameters.
663665
init(
666+
package: ResolvedPackage,
664667
target: ResolvedTarget,
665668
toolsVersion: ToolsVersion,
666669
additionalFileRules: [FileRuleDescription] = [],
@@ -675,6 +678,7 @@ public final class SwiftTargetBuildDescription {
675678
guard target.underlyingTarget is SwiftTarget else {
676679
throw InternalError("underlying target type mismatch \(target)")
677680
}
681+
self.package = package
678682
self.target = target
679683
self.toolsVersion = toolsVersion
680684
self.buildParameters = buildParameters
@@ -869,6 +873,11 @@ public final class SwiftTargetBuildDescription {
869873
args += ["-emit-module-interface-path", parseableModuleInterfaceOutputPath.pathString]
870874
}
871875

876+
// suppress warnings if the package is remote
877+
if self.package.isRemote {
878+
args += ["-suppress-warnings"]
879+
}
880+
872881
args += buildParameters.toolchain.extraSwiftCFlags
873882
// User arguments (from -Xswiftc) should follow generated arguments to allow user overrides
874883
args += buildParameters.swiftCompilerFlags
@@ -1608,13 +1617,17 @@ public class BuildPlan {
16081617
var generateRedundant = generate
16091618
var result: [(ResolvedProduct, SwiftTargetBuildDescription)] = []
16101619
for testProduct in graph.allProducts where testProduct.type == .test {
1620+
guard let package = graph.package(for: testProduct) else {
1621+
throw InternalError("package not found for \(testProduct)")
1622+
}
16111623
generateRedundant = generateRedundant && nil == testProduct.testManifestTarget
16121624
// if test manifest exists, prefer that over test detection,
16131625
// this is designed as an escape hatch when test discovery is not appropriate
16141626
// and for backwards compatibility for projects that have existing test manifests (LinuxMain.swift)
16151627
let toolsVersion = graph.package(for: testProduct)?.manifest.toolsVersion ?? .v5_5
16161628
if let testManifestTarget = testProduct.testManifestTarget, !generate {
16171629
let desc = try SwiftTargetBuildDescription(
1630+
package: package,
16181631
target: testManifestTarget,
16191632
toolsVersion: toolsVersion,
16201633
buildParameters: buildParameters,
@@ -1651,6 +1664,7 @@ public class BuildPlan {
16511664
)
16521665

16531666
let target = try SwiftTargetBuildDescription(
1667+
package: package,
16541668
target: testManifestTarget,
16551669
toolsVersion: toolsVersion,
16561670
buildParameters: buildParameters,
@@ -1716,7 +1730,11 @@ public class BuildPlan {
17161730

17171731
switch target.underlyingTarget {
17181732
case is SwiftTarget:
1733+
guard let package = graph.package(for: target) else {
1734+
throw InternalError("package not found for \(target)")
1735+
}
17191736
targetMap[target] = try .swift(SwiftTargetBuildDescription(
1737+
package: package,
17201738
target: target,
17211739
toolsVersion: toolsVersion,
17221740
additionalFileRules: additionalFileRules,
@@ -2303,8 +2321,19 @@ private func generateResourceInfoPlist(
23032321
return true
23042322
}
23052323

2306-
fileprivate extension TSCUtility.Triple {
2307-
var isSupportingStaticStdlib: Bool {
2324+
extension TSCUtility.Triple {
2325+
fileprivate var isSupportingStaticStdlib: Bool {
23082326
isLinux() || arch == .wasm32
23092327
}
23102328
}
2329+
2330+
extension ResolvedPackage {
2331+
fileprivate var isRemote: Bool {
2332+
switch self.underlyingPackage.manifest.packageKind {
2333+
case .registry, .remoteSourceControl, .localSourceControl:
2334+
return true
2335+
case .root, .fileSystem:
2336+
return false
2337+
}
2338+
}
2339+
}

Tests/FunctionalTests/MiscellaneousTests.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,4 +827,21 @@ class MiscellaneousTestCase: XCTestCase {
827827
XCTAssertNoMatch(stderr2, .contains("command_arguments"))
828828
}
829829
}
830+
831+
func testNoWarningFromRemoteDependencies() throws {
832+
try fixture(name: "Miscellaneous/DependenciesWarnings") { path in
833+
// prepare the deps as git sources
834+
let dependency1Path = path.appending(component: "dep1")
835+
initGitRepo(dependency1Path, tag: "1.0.0")
836+
let dependency2Path = path.appending(component: "dep2")
837+
initGitRepo(dependency2Path, tag: "1.0.0")
838+
839+
let appPath = path.appending(component: "app")
840+
let (stdout, stderr) = try SwiftPMProduct.SwiftBuild.execute([], packagePath: appPath)
841+
XCTAssertDirectoryExists(appPath.appending(component: ".build"))
842+
XCTAssertMatch(stdout + stderr, .contains("'DeprecatedApp' is deprecated"))
843+
XCTAssertNoMatch(stdout + stderr, .contains("'Deprecated1' is deprecated"))
844+
XCTAssertNoMatch(stdout + stderr, .contains("'Deprecated2' is deprecated"))
845+
}
846+
}
830847
}

0 commit comments

Comments
 (0)