Skip to content

Commit f2a290b

Browse files
authored
Merge pull request #449 from swiftlang/owenv/cmake-smoke-test-fixes
Improve cmake-smoke-test command plugin
2 parents 0e2c781 + b82da06 commit f2a290b

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

Plugins/cmake-smoke-test/cmake-smoke-test.swift

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,56 @@ import Foundation
1717
struct CMakeSmokeTest: CommandPlugin {
1818
func performCommand(context: PluginContext, arguments: [String]) async throws {
1919
var args = ArgumentExtractor(arguments)
20-
2120
let hostOS = try OS.host()
2221

22+
guard args.extractFlag(named: "disable-sandbox") > 0 else {
23+
throw Errors.missingRequiredOption("--disable-sandbox")
24+
}
25+
2326
guard let cmakePath = args.extractOption(named: "cmake-path").last else { throw Errors.missingRequiredOption("--cmake-path") }
2427
print("using cmake at \(cmakePath)")
2528
let cmakeURL = URL(filePath: cmakePath)
2629
guard let ninjaPath = args.extractOption(named: "ninja-path").last else { throw Errors.missingRequiredOption("--ninja-path") }
2730
print("using ninja at \(ninjaPath)")
2831
let ninjaURL = URL(filePath: ninjaPath)
29-
guard let sysrootPath = args.extractOption(named: "sysroot-path").last else { throw Errors.missingRequiredOption("--sysroot-path") }
30-
print("using sysroot at \(sysrootPath)")
32+
let sysrootPath = args.extractOption(named: "sysroot-path").last
33+
if let sysrootPath {
34+
print("using sysroot at \(sysrootPath)")
35+
}
3136

3237
let moduleCachePath = context.pluginWorkDirectoryURL.appending(component: "module-cache").path()
3338

3439
let swiftBuildURL = context.package.directoryURL
3540
let swiftBuildBuildURL = context.pluginWorkDirectoryURL.appending(component: "swift-build")
3641
print("swift-build: \(swiftBuildURL.path())")
3742

38-
let swiftToolsSupportCoreURL = try findSiblingRepository("swift-tools-support-core", swiftBuildURL: swiftBuildURL)
43+
let swiftToolsSupportCoreURL = try findDependency("swift-tools-support-core", pluginContext: context)
3944
let swiftToolsSupportCoreBuildURL = context.pluginWorkDirectoryURL.appending(component: "swift-tools-support-core")
4045

41-
let swiftSystemURL = try findSiblingRepository("swift-system", swiftBuildURL: swiftBuildURL)
46+
let swiftSystemURL = try findDependency("swift-system", pluginContext: context)
4247
let swiftSystemBuildURL = context.pluginWorkDirectoryURL.appending(component: "swift-system")
4348

44-
let llbuildURL = try findSiblingRepository("llbuild", swiftBuildURL: swiftBuildURL)
49+
let llbuildURL = try findDependency("swift-llbuild", pluginContext: context)
4550
let llbuildBuildURL = context.pluginWorkDirectoryURL.appending(component: "llbuild")
4651

47-
let swiftArgumentParserURL = try findSiblingRepository("swift-argument-parser", swiftBuildURL: swiftBuildURL)
52+
let swiftArgumentParserURL = try findDependency("swift-argument-parser", pluginContext: context)
4853
let swiftArgumentParserBuildURL = context.pluginWorkDirectoryURL.appending(component: "swift-argument-parser")
4954

50-
let swiftDriverURL = try findSiblingRepository("swift-driver", swiftBuildURL: swiftBuildURL)
55+
let swiftDriverURL = try findDependency("swift-driver", pluginContext: context)
5156
let swiftDriverBuildURL = context.pluginWorkDirectoryURL.appending(component: "swift-driver")
5257

5358
for url in [swiftToolsSupportCoreBuildURL, swiftSystemBuildURL, llbuildBuildURL, swiftArgumentParserBuildURL, swiftDriverBuildURL, swiftBuildBuildURL] {
5459
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
5560
}
5661

57-
let sharedSwiftFlags = [
58-
"-sdk", sysrootPath,
62+
var sharedSwiftFlags = [
5963
"-module-cache-path", moduleCachePath
6064
]
6165

66+
if let sysrootPath {
67+
sharedSwiftFlags += ["-sdk", sysrootPath]
68+
}
69+
6270
let cMakeProjectArgs = [
6371
"-DArgumentParser_DIR=\(swiftArgumentParserBuildURL.appending(components: "cmake", "modules").path())",
6472
"-DLLBuild_DIR=\(llbuildBuildURL.appending(components: "cmake", "modules").path())",
@@ -107,11 +115,28 @@ struct CMakeSmokeTest: CommandPlugin {
107115
print("Built swift-build")
108116
}
109117

110-
func findSiblingRepository(_ name: String, swiftBuildURL: URL) throws -> URL {
111-
let url = swiftBuildURL.deletingLastPathComponent().appending(component: name)
112-
print("\(name): \(url.path())")
113-
guard FileManager.default.fileExists(atPath: url.path()) else { throw Errors.missingRepository(url.path()) }
114-
return url
118+
func findDependency(_ name: String, pluginContext: PluginContext) throws -> URL {
119+
var stack: [Package] = pluginContext.package.dependencies.map { $0.package }
120+
var visited = Set(stack.map { $0.id })
121+
var transitiveDependencies = pluginContext.package.dependencies.map { $0.package }
122+
while let current = stack.popLast() {
123+
for dependency in current.dependencies {
124+
guard visited.insert(dependency.package.id).inserted else {
125+
continue
126+
}
127+
transitiveDependencies.append(dependency.package)
128+
stack.append(dependency.package)
129+
}
130+
}
131+
guard let dependency = transitiveDependencies.first(where: { $0.id == name }) else {
132+
throw Errors.missingRepository(name)
133+
}
134+
let dependencyURL = dependency.directoryURL
135+
print("\(name): \(dependencyURL.path())")
136+
guard FileManager.default.fileExists(atPath: dependencyURL.path()) else {
137+
throw Errors.missingRepository(dependencyURL.path())
138+
}
139+
return dependencyURL
115140
}
116141
}
117142

0 commit comments

Comments
 (0)