Skip to content

Commit 9486ee6

Browse files
committed
[BuildPlan] Demote pkg-config errors to warnings
Fix fallout from 350745a, these were always supposed to be warnings and not errors. <rdar://problem/42743455>
1 parent efeba46 commit 9486ee6

File tree

7 files changed

+78
-12
lines changed

7 files changed

+78
-12
lines changed

Sources/Build/BuildPlan.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -818,7 +818,9 @@ public class BuildPlan {
818818
if let provider = result.provider, result.couldNotFindConfigFile {
819819
diagnostics.emit(data: PkgConfigHintDiagnostic(pkgConfigName: result.pkgConfigName, installText: provider.installText))
820820
} else if let error = result.error {
821-
diagnostics.emit(error)
821+
diagnostics.emit(
822+
data: PkgConfigGenericDiagnostic(error: "\(error)"),
823+
location: PkgConfigDiagnosticLocation(pcFile: result.pkgConfigName, target: target.name))
822824
}
823825
pkgConfigCache[target] = (result.cFlags, result.libs)
824826
return pkgConfigCache[target]!
@@ -828,6 +830,28 @@ public class BuildPlan {
828830
private var pkgConfigCache = [SystemLibraryTarget: (cFlags: [String], libs: [String])]()
829831
}
830832

833+
struct PkgConfigDiagnosticLocation: DiagnosticLocation {
834+
let pcFile: String
835+
let target: String
836+
837+
public var localizedDescription: String {
838+
return "'\(target)' \(pcFile).pc"
839+
}
840+
}
841+
842+
public struct PkgConfigGenericDiagnostic: DiagnosticData {
843+
public static let id = DiagnosticID(
844+
type: PkgConfigGenericDiagnostic.self,
845+
name: "org.swift.diags.pkg-config-generic",
846+
defaultBehavior: .warning,
847+
description: {
848+
$0 <<< { $0.error }
849+
}
850+
)
851+
852+
let error: String
853+
}
854+
831855
public struct PkgConfigHintDiagnostic: DiagnosticData {
832856
public static let id = DiagnosticID(
833857
type: PkgConfigHintDiagnostic.self,

Sources/PackageLoading/Target+PkgConfig.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func whitelist(pcFile: String, flags: (cFlags: [String], libs: [String])) throws
164164
let filtered = filter(flags: flags.cFlags, filters: ["-I", "-F"]) +
165165
filter(flags: flags.libs, filters: ["-L", "-l", "-F", "-framework", "-w"])
166166
guard filtered.isEmpty else {
167-
throw PkgConfigError.nonWhitelistedFlags("Non whitelisted flags found: \(filtered) in pc file \(pcFile)")
167+
throw PkgConfigError.nonWhitelistedFlags(filtered.joined(separator: ", "))
168168
}
169169
}
170170

Sources/Utility/PkgConfig.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,21 @@ import Basic
1212
import Foundation
1313
import func POSIX.getenv
1414

15-
public enum PkgConfigError: Swift.Error {
15+
public enum PkgConfigError: Swift.Error, CustomStringConvertible {
1616
case couldNotFindConfigFile
1717
case parsingError(String)
1818
case nonWhitelistedFlags(String)
19+
20+
public var description: String {
21+
switch self {
22+
case .couldNotFindConfigFile:
23+
return "couldn't find pc file"
24+
case .parsingError(let error):
25+
return "parsing error(s): \(error)"
26+
case .nonWhitelistedFlags(let flags):
27+
return "non whitelisted flag(s): \(flags)"
28+
}
29+
}
1930
}
2031

2132
public struct PkgConfigExecutionDiagnostic: DiagnosticData {

Tests/BuildTests/BuildPlanTests.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -828,7 +828,7 @@ final class BuildPlanTests: XCTestCase {
828828
}
829829
}
830830

831-
func testPkgConfigError() throws {
831+
func testPkgConfigHintDiagnostic() throws {
832832
let fileSystem = InMemoryFileSystem(emptyFiles:
833833
"/A/Sources/ATarget/foo.swift",
834834
"/A/Sources/BTarget/module.modulemap"
@@ -861,6 +861,40 @@ final class BuildPlanTests: XCTestCase {
861861

862862
XCTAssertTrue(diagnostics.diagnostics.contains(where: { ($0.data is PkgConfigHintDiagnostic) }))
863863
}
864+
865+
func testPkgConfigGenericDiagnostic() throws {
866+
let fileSystem = InMemoryFileSystem(emptyFiles:
867+
"/A/Sources/ATarget/foo.swift",
868+
"/A/Sources/BTarget/module.modulemap"
869+
)
870+
871+
let diagnostics = DiagnosticsEngine()
872+
let graph = loadPackageGraph(root: "/A", fs: fileSystem, diagnostics: diagnostics,
873+
manifests: [
874+
Manifest.createV4Manifest(
875+
name: "A",
876+
path: "/A",
877+
url: "/A",
878+
targets: [
879+
TargetDescription(name: "ATarget", dependencies: ["BTarget"]),
880+
TargetDescription(
881+
name: "BTarget",
882+
type: .system,
883+
pkgConfig: "BTarget"
884+
)
885+
]),
886+
]
887+
)
888+
889+
_ = try BuildPlan(buildParameters: mockBuildParameters(),
890+
graph: graph, diagnostics: diagnostics, fileSystem: fileSystem)
891+
892+
let diagnostic = diagnostics.diagnostics.first(where: { ($0.data is PkgConfigGenericDiagnostic) })!
893+
894+
XCTAssertEqual(diagnostic.localizedDescription, "couldn't find pc file")
895+
XCTAssertEqual(diagnostic.behavior, .warning)
896+
XCTAssertEqual(diagnostic.location.localizedDescription, "'BTarget' BTarget.pc")
897+
}
864898
}
865899

866900
// MARK:- Test Helpers

Tests/BuildTests/XCTestManifests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ extension BuildPlanTests {
1414
("testDynamicProducts", testDynamicProducts),
1515
("testExecAsDependency", testExecAsDependency),
1616
("testNonReachableProductsAndTargets", testNonReachableProductsAndTargets),
17-
("testPkgConfigError", testPkgConfigError),
17+
("testPkgConfigGenericDiagnostic", testPkgConfigGenericDiagnostic),
18+
("testPkgConfigHintDiagnostic", testPkgConfigHintDiagnostic),
1819
("testSwiftCMixed", testSwiftCMixed),
1920
("testSystemPackageBuildPlan", testSystemPackageBuildPlan),
2021
("testTestModule", testTestModule),

Tests/PackageLoadingTests/PkgConfigTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class PkgConfigTests: XCTestCase {
8888
XCTAssertFalse(result.couldNotFindConfigFile)
8989
switch result.error {
9090
case PkgConfigError.nonWhitelistedFlags(let desc)?:
91-
XCTAssertEqual(desc, "Non whitelisted flags found: [\"-DBlackListed\"] in pc file Bar")
91+
XCTAssertEqual(desc, "-DBlackListed")
9292
default:
9393
XCTFail("unexpected error \(result.error.debugDescription)")
9494
}

Tests/PackageLoadingTests/WhitelistTests.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ final class PkgConfigWhitelistTests: XCTestCase {
2828
do {
2929
try whitelist(pcFile: "dummy", flags: (cFlags, libs))
3030
} catch {
31-
XCTAssertEqual("\(error)", """
32-
nonWhitelistedFlags("Non whitelisted flags found: [\\"-L/hello\\", \\"-module-name\\", \\"name\\", \\"-werror\\"] in pc file dummy")
33-
""")
31+
XCTAssertEqual("\(error)", "non whitelisted flag(s): -L/hello, -module-name, name, -werror")
3432
}
3533
}
3634

@@ -40,9 +38,7 @@ final class PkgConfigWhitelistTests: XCTestCase {
4038
do {
4139
try whitelist(pcFile: "dummy", flags: (cFlags, libs))
4240
} catch {
43-
XCTAssertEqual("\(error)", """
44-
nonWhitelistedFlags("Non whitelisted flags found: [\\"-L/hello\\", \\"-module-name\\", \\"ok\\", \\"name\\"] in pc file dummy")
45-
""")
41+
XCTAssertEqual("\(error)", "non whitelisted flag(s): -L/hello, -module-name, ok, name")
4642
}
4743
}
4844

0 commit comments

Comments
 (0)