diff --git a/Documentation/Configuration File.md b/Documentation/Configuration File.md index 8ded0ba47..88dd00e2a 100644 --- a/Documentation/Configuration File.md +++ b/Documentation/Configuration File.md @@ -20,10 +20,12 @@ The structure of the file is currently not guaranteed to be stable. Options may - `swiftSDKsDirectory: string`: Equivalent to SwiftPM's `--swift-sdks-path` option. - `swiftSDK: string`: Equivalent to SwiftPM's `--swift-sdk` option. - `triple: string`: Equivalent to SwiftPM's `--triple` option. + - `traits: string[]`: Traits to enable for the package. Equivalent to SwiftPM's `--traits` option. - `cCompilerFlags: string[]`: Extra arguments passed to the compiler for C files. Equivalent to SwiftPM's `-Xcc` option. - `cxxCompilerFlags: string[]`: Extra arguments passed to the compiler for C++ files. Equivalent to SwiftPM's `-Xcxx` option. - `swiftCompilerFlags: string[]`: Extra arguments passed to the compiler for Swift files. Equivalent to SwiftPM's `-Xswiftc` option. - `linkerFlags: string[]`: Extra arguments passed to the linker. Equivalent to SwiftPM's `-Xlinker` option. + - `buildToolsSwiftCompilerFlags: string[]`: Extra arguments passed to the compiler for Swift files or plugins. Equivalent to SwiftPM's `-Xbuild-tools-swiftc` option. - `disableSandbox: boolean`: Disables running subprocesses from SwiftPM in a sandbox. Equivalent to SwiftPM's `--disable-sandbox` option. Useful when running `sourcekit-lsp` in a sandbox because nested sandboxes are not supported. - `compilationDatabase`: Dictionary with the following keys, defining options for workspaces with a compilation database. - `searchPaths: string[]`: Additional paths to search for a compilation database, relative to a workspace root. diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index 1979a4288..f9c9ce458 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -132,6 +132,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { private let swiftPMWorkspace: Workspace private let pluginConfiguration: PluginConfiguration + private let traitConfiguration: TraitConfiguration /// A `ObservabilitySystem` from `SwiftPM` that logs. private let observabilitySystem: ObservabilitySystem @@ -249,6 +250,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { toolchain: hostSwiftPMToolchain, isManifestSandboxEnabled: !(options.swiftPMOrDefault.disableSandbox ?? false), cacheDir: location.sharedManifestsCacheDirectory, + extraManifestFlags: options.swiftPMOrDefault.buildToolsSwiftCompilerFlags, importRestrictions: configuration.manifestImportRestrictions ) ) @@ -294,7 +296,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { fileSystem: localFileSystem, cacheDir: location.pluginWorkingDirectory.appending("cache"), toolchain: hostSwiftPMToolchain, - extraPluginSwiftCFlags: [], + extraPluginSwiftCFlags: options.swiftPMOrDefault.buildToolsSwiftCompilerFlags ?? [], enableSandbox: !(options.swiftPMOrDefault.disableSandbox ?? false) ) self.pluginConfiguration = PluginConfiguration( @@ -303,6 +305,10 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { disableSandbox: options.swiftPMOrDefault.disableSandbox ?? false ) + self.traitConfiguration = TraitConfiguration( + enabledTraits: options.swiftPMOrDefault.traits.flatMap(Set.init) + ) + packageLoadingQueue.async { await orLog("Initial package loading") { // Schedule an initial generation of the build graph. Once the build graph is loaded, the build system will send @@ -355,6 +361,7 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { toolsBuildParameters: toolsBuildParameters, packageGraph: modulesGraph, pluginConfiguration: pluginConfiguration, + traitConfiguration: traitConfiguration, disableSandbox: options.swiftPMOrDefault.disableSandbox ?? false, scratchDirectory: swiftPMWorkspace.location.scratchDirectory.asURL, fileSystem: localFileSystem, @@ -635,10 +642,14 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem { if let swiftSDK = options.swiftPMOrDefault.swiftSDK { arguments += ["--swift-sdk", swiftSDK] } + if let traits = options.swiftPMOrDefault.traits { + arguments += ["--traits", traits.joined(separator: ",")] + } arguments += options.swiftPMOrDefault.cCompilerFlags?.flatMap { ["-Xcc", $0] } ?? [] arguments += options.swiftPMOrDefault.cxxCompilerFlags?.flatMap { ["-Xcxx", $0] } ?? [] arguments += options.swiftPMOrDefault.swiftCompilerFlags?.flatMap { ["-Xswiftc", $0] } ?? [] arguments += options.swiftPMOrDefault.linkerFlags?.flatMap { ["-Xlinker", $0] } ?? [] + arguments += options.swiftPMOrDefault.buildToolsSwiftCompilerFlags?.flatMap { ["-Xbuild-tools-swiftc", $0] } ?? [] switch options.backgroundPreparationModeOrDefault { case .build: break case .noLazy: arguments += ["--experimental-prepare-for-indexing", "--experimental-prepare-for-indexing-no-lazy"] diff --git a/Sources/SKOptions/SourceKitLSPOptions.swift b/Sources/SKOptions/SourceKitLSPOptions.swift index c2a21c67c..cf2085a6c 100644 --- a/Sources/SKOptions/SourceKitLSPOptions.swift +++ b/Sources/SKOptions/SourceKitLSPOptions.swift @@ -53,6 +53,9 @@ public struct SourceKitLSPOptions: Sendable, Codable, Equatable { /// Equivalent to SwiftPM's `--triple` option. public var triple: String? + /// Traits to enable for the package. Equivalent to SwiftPM's `--traits` option. + public var traits: [String]? + /// Extra arguments passed to the compiler for C files. Equivalent to SwiftPM's `-Xcc` option. public var cCompilerFlags: [String]? @@ -65,6 +68,10 @@ public struct SourceKitLSPOptions: Sendable, Codable, Equatable { /// Extra arguments passed to the linker. Equivalent to SwiftPM's `-Xlinker` option. public var linkerFlags: [String]? + /// Extra arguments passed to the compiler for Swift files or plugins. Equivalent to SwiftPM's + /// `-Xbuild-tools-swiftc` option. + public var buildToolsSwiftCompilerFlags: [String]? + /// Disables running subprocesses from SwiftPM in a sandbox. Equivalent to SwiftPM's `--disable-sandbox` option. /// Useful when running `sourcekit-lsp` in a sandbox because nested sandboxes are not supported. public var disableSandbox: Bool? @@ -75,10 +82,12 @@ public struct SourceKitLSPOptions: Sendable, Codable, Equatable { swiftSDKsDirectory: String? = nil, swiftSDK: String? = nil, triple: String? = nil, + traits: [String]? = nil, cCompilerFlags: [String]? = nil, cxxCompilerFlags: [String]? = nil, swiftCompilerFlags: [String]? = nil, linkerFlags: [String]? = nil, + buildToolsSwiftCompilerFlags: [String]? = nil, disableSandbox: Bool? = nil ) { self.configuration = configuration @@ -86,10 +95,12 @@ public struct SourceKitLSPOptions: Sendable, Codable, Equatable { self.swiftSDKsDirectory = swiftSDKsDirectory self.swiftSDK = swiftSDK self.triple = triple + self.traits = traits self.cCompilerFlags = cCompilerFlags self.cxxCompilerFlags = cxxCompilerFlags self.swiftCompilerFlags = swiftCompilerFlags self.linkerFlags = linkerFlags + self.buildToolsSwiftCompilerFlags = buildToolsSwiftCompilerFlags self.disableSandbox = disableSandbox } @@ -100,10 +111,12 @@ public struct SourceKitLSPOptions: Sendable, Codable, Equatable { swiftSDKsDirectory: override?.swiftSDKsDirectory ?? base.swiftSDKsDirectory, swiftSDK: override?.swiftSDK ?? base.swiftSDK, triple: override?.triple ?? base.triple, + traits: override?.traits ?? base.traits, cCompilerFlags: override?.cCompilerFlags ?? base.cCompilerFlags, cxxCompilerFlags: override?.cxxCompilerFlags ?? base.cxxCompilerFlags, swiftCompilerFlags: override?.swiftCompilerFlags ?? base.swiftCompilerFlags, linkerFlags: override?.linkerFlags ?? base.linkerFlags, + buildToolsSwiftCompilerFlags: override?.buildToolsSwiftCompilerFlags ?? base.buildToolsSwiftCompilerFlags, disableSandbox: override?.disableSandbox ?? base.disableSandbox ) } diff --git a/config.schema.json b/config.schema.json index 2fa0e6835..cfafbade0 100644 --- a/config.schema.json +++ b/config.schema.json @@ -217,6 +217,14 @@ "description" : "Options for SwiftPM workspaces.", "markdownDescription" : "Options for SwiftPM workspaces.", "properties" : { + "buildToolsSwiftCompilerFlags" : { + "description" : "Extra arguments passed to the compiler for Swift files or plugins. Equivalent to SwiftPM's `-Xbuild-tools-swiftc` option.", + "items" : { + "type" : "string" + }, + "markdownDescription" : "Extra arguments passed to the compiler for Swift files or plugins. Equivalent to SwiftPM's `-Xbuild-tools-swiftc` option.", + "type" : "array" + }, "cCompilerFlags" : { "description" : "Extra arguments passed to the compiler for C files. Equivalent to SwiftPM's `-Xcc` option.", "items" : { @@ -278,6 +286,14 @@ "markdownDescription" : "Equivalent to SwiftPM's `--swift-sdks-path` option.", "type" : "string" }, + "traits" : { + "description" : "Traits to enable for the package. Equivalent to SwiftPM's `--traits` option.", + "items" : { + "type" : "string" + }, + "markdownDescription" : "Traits to enable for the package. Equivalent to SwiftPM's `--traits` option.", + "type" : "array" + }, "triple" : { "description" : "Equivalent to SwiftPM's `--triple` option.", "markdownDescription" : "Equivalent to SwiftPM's `--triple` option.",