Skip to content

Commit 67e4e99

Browse files
authored
Merge pull request swiftlang#78 from benlangmuir/fix-build-path-config-better
Change configuration build path to be absolute
2 parents 5873380 + eba9508 commit 67e4e99

File tree

7 files changed

+63
-25
lines changed

7 files changed

+63
-25
lines changed

Sources/SKCore/BuildSetup.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
13+
import Basic
1414
import Utility
1515
import SKSupport
1616

@@ -19,19 +19,19 @@ public struct BuildSetup {
1919

2020
/// Default configuration
2121
public static let `default` = BuildSetup(configuration: .debug,
22-
path: ".build",
22+
path: nil,
2323
flags: BuildFlags())
2424

25-
/// Build configuration
25+
/// Build configuration (debug|release).
2626
public let configuration: BuildConfiguration
2727

28-
/// Build artefacts directory path
29-
public let path: String
28+
/// Build artefacts directory path. If nil, the build system may choose a default value.
29+
public let path: AbsolutePath?
3030

3131
/// Additional build flags
3232
public let flags: BuildFlags
3333

34-
public init(configuration: BuildConfiguration, path: String, flags: BuildFlags) {
34+
public init(configuration: BuildConfiguration, path: AbsolutePath?, flags: BuildFlags) {
3535
self.configuration = configuration
3636
self.path = path
3737
self.flags = flags

Sources/SKSupport/BuildConfiguration.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import Foundation
1413
import Utility
1514

1615
public enum BuildConfiguration: String {

Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,7 @@ public final class SwiftPMWorkspace {
113113
swiftPMToolchain.extraSwiftCFlags = extraSwiftFlags
114114
swiftPMToolchain.extraCPPFlags = extraClangFlags
115115

116-
117-
let buildPath: AbsolutePath
118-
if let absoluteBuildPath = try? AbsolutePath(validating: buildSetup.path) {
119-
buildPath = absoluteBuildPath
120-
} else {
121-
buildPath = packageRoot.appending(component: buildSetup.path)
122-
}
116+
let buildPath: AbsolutePath = buildSetup.path ?? packageRoot.appending(component: ".build")
123117

124118
self.workspace = Workspace(
125119
dataPath: buildPath,

Sources/SKTestSupport/TestServer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public struct TestSourceKitServer {
3535
}
3636

3737
public static let buildSetup: BuildSetup = BuildSetup(configuration: .debug,
38-
path: ".build",
38+
path: nil,
3939
flags: BuildFlags())
4040

4141
public let client: TestClient

Sources/sourcekit-lsp/main.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import SKSupport
1717
import SKCore
1818
import SPMLibc
1919
import Dispatch
20+
import Basic
2021
import Utility
2122
import Foundation
2223
import sourcekitd // Not needed here, but fixes debugging...
@@ -26,7 +27,7 @@ func parseArguments() throws -> BuildSetup {
2627
let parser = ArgumentParser(usage: "[options]", overview: "Language Server Protocol implementation for Swift and C-based languages")
2728
let loggingOption = parser.add(option: "--log-level", kind: LogLevel.self, usage: "Set the logging level (debug|info|warning|error) [default: \(LogLevel.default)]")
2829
let buildConfigurationOption = parser.add(option: "--configuration", shortName: "-c", kind: BuildConfiguration.self, usage: "Build with configuration (debug|release) [default: debug]")
29-
let buildPathOption = parser.add(option: "--build-path", kind: String.self, usage: "Specify build/cache directory [default: ./.build]")
30+
let buildPathOption = parser.add(option: "--build-path", kind: PathArgument.self, usage: "Specify build/cache directory")
3031
let buildFlagsCc = parser.add(option: "-Xcc", kind: [String].self, strategy: .oneByOne, usage: "Pass flag through to all C compiler invocations")
3132
let buildFlagsCxx = parser.add(option: "-Xcxx", kind: [String].self, strategy: .oneByOne, usage: "Pass flag through to all C++ compiler invocations")
3233
let buildFlagsLinker = parser.add(option: "-Xlinker", kind: [String].self, strategy: .oneByOne, usage: "Pass flag through to all linker invocations")
@@ -46,9 +47,10 @@ func parseArguments() throws -> BuildSetup {
4647
Logger.shared.setLogLevel(environmentVariable: "SOURCEKIT_LOGGING")
4748
}
4849

49-
return BuildSetup(configuration: parsedArguments.get(buildConfigurationOption) ?? BuildSetup.default.configuration,
50-
path: parsedArguments.get(buildPathOption) ?? BuildSetup.default.path,
51-
flags: buildFlags)
50+
return BuildSetup(
51+
configuration: parsedArguments.get(buildConfigurationOption) ?? BuildSetup.default.configuration,
52+
path: parsedArguments.get(buildPathOption)?.path,
53+
flags: buildFlags)
5254
}
5355

5456
let clientConnection = JSONRPCConection(inFD: STDIN_FILENO, outFD: STDOUT_FILENO, closeHandler: {

Tests/SKSwiftPMWorkspaceTests/SwiftPMWorkspaceTests.swift

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,44 @@ final class SwiftPMWorkspaceTests: XCTestCase {
123123
check(aswift.asString, arguments: arguments)
124124
}
125125

126+
func testBuildSetup() {
127+
// FIXME: should be possible to use InMemoryFileSystem.
128+
let fs = localFileSystem
129+
let tempDir = try! TemporaryDirectory(removeTreeOnDeinit: true)
130+
try! fs.createFiles(root: tempDir.path, files: [
131+
"pkg/Sources/lib/a.swift": "",
132+
"pkg/Package.swift": """
133+
// swift-tools-version:4.2
134+
import PackageDescription
135+
let package = Package(name: "a", products: [], dependencies: [],
136+
targets: [.target(name: "lib", dependencies: [])])
137+
"""
138+
])
139+
let packageRoot = tempDir.path.appending(component: "pkg")
140+
let tr = ToolchainRegistry.shared
141+
142+
let config = BuildSetup(
143+
configuration: .release,
144+
path: packageRoot.appending(component: "non_default_build_path"),
145+
flags: BuildFlags(xcc: ["-m32"], xcxx: [], xswiftc: ["-typecheck"], xlinker: []))
146+
147+
let ws = try! SwiftPMWorkspace(
148+
workspacePath: packageRoot,
149+
toolchainRegistry: tr,
150+
fileSystem: fs,
151+
buildSetup: config)
152+
153+
let aswift = packageRoot.appending(components: "Sources", "lib", "a.swift")
154+
let build = buildPath(root: packageRoot, config: config)
155+
156+
XCTAssertEqual(ws.buildPath, build)
157+
let arguments = ws.settings(for: aswift.asURL, .swift)!.compilerArguments
158+
159+
check("-typecheck", arguments: arguments)
160+
check("-Xcc", "-m32", arguments: arguments)
161+
check("-O", arguments: arguments)
162+
}
163+
126164
func testManifestArgs() {
127165
// FIXME: should be possible to use InMemoryFileSystem.
128166
let fs = localFileSystem
@@ -384,18 +422,22 @@ private func check(
384422
}
385423
}
386424

387-
private func buildPath(root: AbsolutePath) -> AbsolutePath {
388-
if let absoluteBuildPath = try? AbsolutePath(validating: TestSourceKitServer.buildSetup.path) {
425+
private func buildPath(
426+
root: AbsolutePath,
427+
config: BuildSetup = TestSourceKitServer.buildSetup) -> AbsolutePath
428+
{
429+
let buildConfig = "\(config.configuration)"
430+
if let absoluteBuildPath = config.path {
389431
#if os(macOS)
390-
return absoluteBuildPath.appending(components: "x86_64-apple-macosx", "debug")
432+
return absoluteBuildPath.appending(components: "x86_64-apple-macosx", buildConfig)
391433
#else
392-
return absoluteBuildPath.appending(components: "x86_64-unknown-linux", "debug")
434+
return absoluteBuildPath.appending(components: "x86_64-unknown-linux", buildConfig)
393435
#endif
394436
} else {
395437
#if os(macOS)
396-
return root.appending(components: TestSourceKitServer.buildSetup.path, "x86_64-apple-macosx", "debug")
438+
return root.appending(components: ".build", "x86_64-apple-macosx", buildConfig)
397439
#else
398-
return root.appending(components: TestSourceKitServer.buildSetup.path, "x86_64-unknown-linux", "debug")
440+
return root.appending(components: ".build", "x86_64-unknown-linux", buildConfig)
399441
#endif
400442
}
401443
}

Tests/SKSwiftPMWorkspaceTests/XCTestManifests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ extension SwiftPMWorkspaceTests {
88
static let __allTests__SwiftPMWorkspaceTests = [
99
("testBasicCXXArgs", testBasicCXXArgs),
1010
("testBasicSwiftArgs", testBasicSwiftArgs),
11+
("testBuildSetup", testBuildSetup),
1112
("testDeploymentTargetSwift", testDeploymentTargetSwift),
1213
("testManifestArgs", testManifestArgs),
1314
("testMultiFileSwift", testMultiFileSwift),

0 commit comments

Comments
 (0)