Skip to content

Commit 1b59346

Browse files
authored
Get run and test working against Swift Build. (swiftlang#8331)
1 parent 273568e commit 1b59346

File tree

8 files changed

+212
-172
lines changed

8 files changed

+212
-172
lines changed

Sources/Commands/SwiftRunCommand.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,10 @@ public struct SwiftRunCommand: AsyncSwiftCommand {
350350
#else
351351
let number_fds = getdtablesize()
352352
#endif /* os(Android) */
353-
354-
// 2. close all file descriptors.
353+
354+
// 2. set to close all file descriptors on exec
355355
for i in 3..<number_fds {
356-
close(i)
356+
_ = fcntl(i, F_SETFD, FD_CLOEXEC)
357357
}
358358
#endif /* os(FreeBSD) || os(OpenBSD) */
359359
#endif

Sources/CoreCommands/SwiftCommandState.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,6 @@ public final class SwiftCommandState {
455455
self.observabilityHandler.progress,
456456
self.observabilityHandler.prompt
457457
)
458-
let isXcodeBuildSystemEnabled = self.options.build.buildSystem.usesXcodeBuildEngine
459458
let workspace = try Workspace(
460459
fileSystem: self.fileSystem,
461460
location: .init(
@@ -473,9 +472,9 @@ public final class SwiftCommandState {
473472
configuration: .init(
474473
skipDependenciesUpdates: options.resolver.skipDependencyUpdate,
475474
prefetchBasedOnResolvedFile: options.resolver.shouldEnableResolverPrefetching,
476-
shouldCreateMultipleTestProducts: toolWorkspaceConfiguration.wantsMultipleTestProducts || options.build.buildSystem.usesXcodeBuildEngine,
475+
shouldCreateMultipleTestProducts: toolWorkspaceConfiguration.wantsMultipleTestProducts || options.build.buildSystem.shouldCreateMultipleTestProducts,
477476
createREPLProduct: toolWorkspaceConfiguration.wantsREPLProduct,
478-
additionalFileRules: isXcodeBuildSystemEnabled ? FileRuleDescription.xcbuildFileTypes : FileRuleDescription.swiftpmFileTypes,
477+
additionalFileRules: options.build.buildSystem.additionalFileRules,
479478
sharedDependenciesCacheEnabled: self.options.caching.useDependenciesCache,
480479
fingerprintCheckingMode: self.options.security.fingerprintCheckingMode,
481480
signingEntityCheckingMode: self.options.security.signingEntityCheckingMode,
@@ -805,12 +804,12 @@ public final class SwiftCommandState {
805804
toolchain: toolchain,
806805
triple: triple,
807806
flags: options.build.buildFlags,
807+
buildSystemKind: options.build.buildSystem,
808808
pkgConfigDirectories: options.locations.pkgConfigDirectories,
809809
architectures: options.build.architectures,
810810
workers: options.build.jobs ?? UInt32(ProcessInfo.processInfo.activeProcessorCount),
811811
sanitizers: options.build.enabledSanitizers,
812812
indexStoreMode: options.build.indexStoreMode.buildParameter,
813-
isXcodeBuildSystemEnabled: options.build.buildSystem.usesXcodeBuildEngine,
814813
prepareForIndexing: prepareForIndexingMode,
815814
debuggingParameters: .init(
816815
debugInfoFormat: options.build.debugInfoFormat.buildParameter,
@@ -1035,6 +1034,26 @@ public final class SwiftCommandState {
10351034
}
10361035
}
10371036

1037+
extension BuildSystemProvider.Kind {
1038+
fileprivate var shouldCreateMultipleTestProducts: Bool {
1039+
switch self {
1040+
case .xcode, .swiftbuild:
1041+
return true
1042+
case .native:
1043+
return false
1044+
}
1045+
}
1046+
1047+
fileprivate var additionalFileRules: [FileRuleDescription] {
1048+
switch self {
1049+
case .xcode, .swiftbuild:
1050+
return FileRuleDescription.xcbuildFileTypes
1051+
case .native:
1052+
return FileRuleDescription.swiftpmFileTypes
1053+
}
1054+
}
1055+
}
1056+
10381057
/// Returns path of the nearest directory containing the manifest file w.r.t
10391058
/// current working directory.
10401059
private func findPackageRoot(fileSystem: FileSystem) -> AbsolutePath? {
@@ -1202,3 +1221,4 @@ extension Basics.Diagnostic {
12021221
.error(arguments.map { "'\($0)'" }.spm_localizedJoin(type: .conjunction) + " are mutually exclusive")
12031222
}
12041223
}
1224+

Sources/SPMBuildCore/BuildParameters/BuildParameters.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,7 @@ public struct BuildParameters: Encodable {
122122
}
123123
}
124124

125-
/// Whether the Xcode build system is used.
126-
public var isXcodeBuildSystemEnabled: Bool
125+
public var buildSystemKind: BuildSystemProvider.Kind
127126

128127
public var shouldSkipBuilding: Bool
129128

@@ -152,13 +151,13 @@ public struct BuildParameters: Encodable {
152151
toolchain: Toolchain,
153152
triple: Triple? = nil,
154153
flags: BuildFlags,
154+
buildSystemKind: BuildSystemProvider.Kind = .native,
155155
pkgConfigDirectories: [AbsolutePath] = [],
156156
architectures: [String]? = nil,
157157
workers: UInt32 = UInt32(ProcessInfo.processInfo.activeProcessorCount),
158158
shouldCreateDylibForDynamicProducts: Bool = true,
159159
sanitizers: EnabledSanitizers = EnabledSanitizers(),
160160
indexStoreMode: IndexStoreMode = .auto,
161-
isXcodeBuildSystemEnabled: Bool = false,
162161
shouldSkipBuilding: Bool = false,
163162
prepareForIndexing: PrepareForIndexingMode = .off,
164163
debuggingParameters: Debugging? = nil,
@@ -179,6 +178,7 @@ public struct BuildParameters: Encodable {
179178
self.configuration = configuration
180179
self._toolchain = _Toolchain(toolchain: toolchain)
181180
self.triple = triple
181+
self.buildSystemKind = buildSystemKind
182182
switch self.debuggingParameters.debugInfoFormat {
183183
case .dwarf:
184184
var flags = flags
@@ -214,7 +214,6 @@ public struct BuildParameters: Encodable {
214214
self.shouldCreateDylibForDynamicProducts = shouldCreateDylibForDynamicProducts
215215
self.sanitizers = sanitizers
216216
self.indexStoreMode = indexStoreMode
217-
self.isXcodeBuildSystemEnabled = isXcodeBuildSystemEnabled
218217
self.shouldSkipBuilding = shouldSkipBuilding
219218
self.prepareForIndexing = prepareForIndexing
220219
self.driverParameters = driverParameters
@@ -225,9 +224,17 @@ public struct BuildParameters: Encodable {
225224

226225
/// The path to the build directory (inside the data directory).
227226
public var buildPath: AbsolutePath {
228-
if isXcodeBuildSystemEnabled {
229-
return dataPath.appending(components: "Products", configuration.dirname.capitalized)
230-
} else {
227+
// TODO: query the build system for this.
228+
switch buildSystemKind {
229+
case .xcode, .swiftbuild:
230+
var configDir: String = configuration.dirname.capitalized
231+
if self.triple.isWindows() {
232+
configDir += "-windows"
233+
} else if self.triple.isLinux() {
234+
configDir += "-linux"
235+
}
236+
return dataPath.appending(components: "Products", configDir)
237+
case .native:
231238
return dataPath.appending(component: configuration.dirname)
232239
}
233240
}

Sources/SPMBuildCore/BuildSystem/BuildSystem.swift

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public protocol BuildSystemFactory {
128128

129129
public struct BuildSystemProvider {
130130
// TODO: In the future, we may want this to be about specific capabilities of a build system rather than choosing a concrete one.
131-
public enum Kind: String, CaseIterable {
131+
public enum Kind: String, Codable, CaseIterable {
132132
case native
133133
case swiftbuild
134134
case xcode
@@ -169,15 +169,6 @@ public struct BuildSystemProvider {
169169
}
170170
}
171171

172-
extension BuildSystemProvider.Kind {
173-
public var usesXcodeBuildEngine: Bool {
174-
switch self {
175-
case .native: return false
176-
case .swiftbuild: return false
177-
case .xcode: return true
178-
}
179-
}
180-
}
181172
private enum Errors: Swift.Error {
182173
case buildSystemProviderNotRegistered(kind: BuildSystemProvider.Kind)
183174
}

Sources/SPMBuildCore/Triple+Extensions.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,14 @@ extension Triple {
2626

2727
extension Triple {
2828
public func platformBuildPathComponent(buildSystem: BuildSystemProvider.Kind) -> String {
29-
// Use "apple" as the subdirectory because in theory Xcode build system
30-
// can be used to build for any Apple platform and it has its own
31-
// conventions for build subpaths based on platforms.
32-
buildSystem.usesXcodeBuildEngine ? "apple" : self.platformBuildPathComponent
29+
switch buildSystem {
30+
case .xcode:
31+
// Use "apple" as the subdirectory because in theory Xcode build system
32+
// can be used to build for any Apple platform and it has its own
33+
// conventions for build subpaths based on platforms.
34+
return "apple"
35+
case .swiftbuild, .native:
36+
return self.platformBuildPathComponent
37+
}
3338
}
3439
}

0 commit comments

Comments
 (0)