Skip to content

Commit a2fb6ee

Browse files
committed
Get run and test working against Swift Build.
Cleans up handling of the new build system. It's close to the old xcode build system but with a couple of differences. Gets rid of the boolean isXcodeBuild and pass in the actual Kind so we can do different things based on which one is selected. Selects the build output path for binaries based on the selection. Also cleans up code with a missing wait for the build service to complete and with with the file descriptor close before swift run execs the process.
1 parent 2d03ce7 commit a2fb6ee

File tree

8 files changed

+48
-30
lines changed

8 files changed

+48
-30
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
@@ -441,7 +441,6 @@ public final class SwiftCommandState {
441441
self.observabilityHandler.progress,
442442
self.observabilityHandler.prompt
443443
)
444-
let isXcodeBuildSystemEnabled = self.options.build.buildSystem.usesXcodeBuildEngine
445444
let workspace = try Workspace(
446445
fileSystem: self.fileSystem,
447446
location: .init(
@@ -459,9 +458,9 @@ public final class SwiftCommandState {
459458
configuration: .init(
460459
skipDependenciesUpdates: options.resolver.skipDependencyUpdate,
461460
prefetchBasedOnResolvedFile: options.resolver.shouldEnableResolverPrefetching,
462-
shouldCreateMultipleTestProducts: toolWorkspaceConfiguration.wantsMultipleTestProducts || options.build.buildSystem.usesXcodeBuildEngine,
461+
shouldCreateMultipleTestProducts: toolWorkspaceConfiguration.wantsMultipleTestProducts || options.build.buildSystem.shouldCreateMultipleTestProducts,
463462
createREPLProduct: toolWorkspaceConfiguration.wantsREPLProduct,
464-
additionalFileRules: isXcodeBuildSystemEnabled ? FileRuleDescription.xcbuildFileTypes : FileRuleDescription.swiftpmFileTypes,
463+
additionalFileRules: options.build.buildSystem.additionalFileRules,
465464
sharedDependenciesCacheEnabled: self.options.caching.useDependenciesCache,
466465
fingerprintCheckingMode: self.options.security.fingerprintCheckingMode,
467466
signingEntityCheckingMode: self.options.security.signingEntityCheckingMode,
@@ -790,12 +789,12 @@ public final class SwiftCommandState {
790789
toolchain: toolchain,
791790
triple: triple,
792791
flags: options.build.buildFlags,
792+
buildSystemKind: options.build.buildSystem,
793793
pkgConfigDirectories: options.locations.pkgConfigDirectories,
794794
architectures: options.build.architectures,
795795
workers: options.build.jobs ?? UInt32(ProcessInfo.processInfo.activeProcessorCount),
796796
sanitizers: options.build.enabledSanitizers,
797797
indexStoreMode: options.build.indexStoreMode.buildParameter,
798-
isXcodeBuildSystemEnabled: options.build.buildSystem.usesXcodeBuildEngine,
799798
prepareForIndexing: prepareForIndexingMode,
800799
debuggingParameters: .init(
801800
debugInfoFormat: options.build.debugInfoFormat.buildParameter,
@@ -1020,6 +1019,26 @@ public final class SwiftCommandState {
10201019
}
10211020
}
10221021

1022+
extension BuildSystemProvider.Kind {
1023+
fileprivate var shouldCreateMultipleTestProducts: Bool {
1024+
switch self {
1025+
case .xcode, .swiftbuild:
1026+
return true
1027+
case .native:
1028+
return false
1029+
}
1030+
}
1031+
1032+
fileprivate var additionalFileRules: [FileRuleDescription] {
1033+
switch self {
1034+
case .xcode, .swiftbuild:
1035+
return FileRuleDescription.xcbuildFileTypes
1036+
case .native:
1037+
return FileRuleDescription.swiftpmFileTypes
1038+
}
1039+
}
1040+
}
1041+
10231042
/// Returns path of the nearest directory containing the manifest file w.r.t
10241043
/// current working directory.
10251044
private func findPackageRoot(fileSystem: FileSystem) -> AbsolutePath? {
@@ -1187,3 +1206,4 @@ extension Basics.Diagnostic {
11871206
.error(arguments.map { "'\($0)'" }.spm_localizedJoin(type: .conjunction) + " are mutually exclusive")
11881207
}
11891208
}
1209+

Sources/SPMBuildCore/BuildParameters/BuildParameters.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ public struct BuildParameters: Encodable {
120120
}
121121
}
122122

123-
/// Whether the Xcode build system is used.
124-
public var isXcodeBuildSystemEnabled: Bool
123+
public var buildSystemKind: BuildSystemProvider.Kind
125124

126125
public var shouldSkipBuilding: Bool
127126

@@ -150,13 +149,13 @@ public struct BuildParameters: Encodable {
150149
toolchain: Toolchain,
151150
triple: Triple? = nil,
152151
flags: BuildFlags,
152+
buildSystemKind: BuildSystemProvider.Kind,
153153
pkgConfigDirectories: [AbsolutePath] = [],
154154
architectures: [String]? = nil,
155155
workers: UInt32 = UInt32(ProcessInfo.processInfo.activeProcessorCount),
156156
shouldCreateDylibForDynamicProducts: Bool = true,
157157
sanitizers: EnabledSanitizers = EnabledSanitizers(),
158158
indexStoreMode: IndexStoreMode = .auto,
159-
isXcodeBuildSystemEnabled: Bool = false,
160159
shouldSkipBuilding: Bool = false,
161160
prepareForIndexing: PrepareForIndexingMode = .off,
162161
debuggingParameters: Debugging? = nil,
@@ -177,6 +176,7 @@ public struct BuildParameters: Encodable {
177176
self.configuration = configuration
178177
self._toolchain = _Toolchain(toolchain: toolchain)
179178
self.triple = triple
179+
self.buildSystemKind = buildSystemKind
180180
switch self.debuggingParameters.debugInfoFormat {
181181
case .dwarf:
182182
var flags = flags
@@ -212,7 +212,6 @@ public struct BuildParameters: Encodable {
212212
self.shouldCreateDylibForDynamicProducts = shouldCreateDylibForDynamicProducts
213213
self.sanitizers = sanitizers
214214
self.indexStoreMode = indexStoreMode
215-
self.isXcodeBuildSystemEnabled = isXcodeBuildSystemEnabled
216215
self.shouldSkipBuilding = shouldSkipBuilding
217216
self.prepareForIndexing = prepareForIndexing
218217
self.driverParameters = driverParameters
@@ -223,9 +222,10 @@ public struct BuildParameters: Encodable {
223222

224223
/// The path to the build directory (inside the data directory).
225224
public var buildPath: AbsolutePath {
226-
if isXcodeBuildSystemEnabled {
225+
switch buildSystemKind {
226+
case .xcode, .swiftbuild:
227227
return dataPath.appending(components: "Products", configuration.dirname.capitalized)
228-
} else {
228+
case .native:
229229
return dataPath.appending(component: configuration.dirname)
230230
}
231231
}

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
@@ -24,9 +24,14 @@ extension Triple {
2424

2525
extension Triple {
2626
public func platformBuildPathComponent(buildSystem: BuildSystemProvider.Kind) -> String {
27-
// Use "apple" as the subdirectory because in theory Xcode build system
28-
// can be used to build for any Apple platform and it has its own
29-
// conventions for build subpaths based on platforms.
30-
buildSystem.usesXcodeBuildEngine ? "apple" : self.platformBuildPathComponent
27+
switch buildSystem {
28+
case .xcode:
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+
return "apple"
33+
case .swiftbuild, .native:
34+
return self.platformBuildPathComponent
35+
}
3136
}
3237
}

Sources/SwiftBuildSupport/SwiftBuildSystem.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,8 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
385385
} catch {
386386
throw error
387387
}
388+
389+
await service.close()
388390
}
389391

390392
func makeBuildParameters() throws -> SwiftBuild.SWBBuildParameters {

Sources/_InternalTestSupport/MockBuildTestHelper.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public func mockBuildParameters(
8282
config: BuildConfiguration = .debug,
8383
toolchain: PackageModel.Toolchain = MockToolchain(),
8484
flags: PackageModel.BuildFlags = PackageModel.BuildFlags(),
85+
buildSystemKind: BuildSystemProvider.Kind = .native,
8586
shouldLinkStaticSwiftStdlib: Bool = false,
8687
shouldDisableLocalRpath: Bool = false,
8788
canRenameEntrypointFunctionName: Bool = false,
@@ -100,6 +101,7 @@ public func mockBuildParameters(
100101
toolchain: toolchain,
101102
triple: triple,
102103
flags: flags,
104+
buildSystemKind: buildSystemKind,
103105
pkgConfigDirectories: [],
104106
workers: 3,
105107
indexStoreMode: indexStoreMode,

Sources/swift-bootstrap/main.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,8 +281,6 @@ struct SwiftBootstrapBuildTool: AsyncParsableCommand {
281281
shouldDisableLocalRpath: Bool,
282282
logLevel: Basics.Diagnostic.Severity
283283
) throws -> BuildSystem {
284-
var buildFlags = buildFlags
285-
286284
let dataPath = scratchDirectory.appending(
287285
component: self.targetToolchain.targetTriple.platformBuildPathComponent(buildSystem: buildSystem)
288286
)
@@ -294,8 +292,8 @@ struct SwiftBootstrapBuildTool: AsyncParsableCommand {
294292
toolchain: self.targetToolchain,
295293
triple: self.hostToolchain.targetTriple,
296294
flags: buildFlags,
295+
buildSystemKind: buildSystem,
297296
architectures: architectures,
298-
isXcodeBuildSystemEnabled: buildSystem.usesXcodeBuildEngine,
299297
driverParameters: .init(
300298
explicitTargetDependencyImportCheckingMode: explicitTargetDependencyImportCheck == .error ? .error : .none,
301299
useIntegratedSwiftDriver: useIntegratedSwiftDriver,

0 commit comments

Comments
 (0)