Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion Sources/SwiftBuildSupport/SwiftBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,16 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
}
}

let swiftCompilerFlags = buildParameters.toolchain.extraFlags.swiftCompilerFlags + buildParameters.flags.swiftCompilerFlags
var swiftCompilerFlags = buildParameters.toolchain.extraFlags.swiftCompilerFlags + buildParameters.flags.swiftCompilerFlags
swiftCompilerFlags += buildParameters.toolchain.extraFlags.cCompilerFlags.asSwiftcCCompilerFlags()
// User arguments (from -Xcc) should follow generated arguments to allow user overrides
swiftCompilerFlags += buildParameters.flags.cCompilerFlags.asSwiftcCCompilerFlags()

// TODO: Pass -Xcxx flags to swiftc (#6491)
// Uncomment when downstream support arrives.
// swiftCompilerFlags += buildParameters.toolchain.extraFlags.cxxCompilerFlags.rawFlags.asSwiftcCXXCompilerFlags()
// // User arguments (from -Xcxx) should follow generated arguments to allow user overrides
// swiftCompilerFlags += buildParameters.flags.cxxCompilerFlags.rawFlags.asSwiftcCXXCompilerFlags()
let compilerAndLinkerFlags = [
"OTHER_CFLAGS": buildParameters.toolchain.extraFlags.cCompilerFlags + buildParameters.flags.cCompilerFlags,
"OTHER_CPLUSPLUSFLAGS": buildParameters.toolchain.extraFlags.cxxCompilerFlags + buildParameters.flags.cxxCompilerFlags,
Expand Down Expand Up @@ -1360,4 +1369,10 @@ fileprivate extension [BuildFlag] {
}
}.map { $0.value }
}

/// Converts a set of C compiler flags into an equivalent set to be
/// indirected through the Swift compiler instead.
func asSwiftcCCompilerFlags() -> [BuildFlag] {
self.flatMap { [BuildFlag(value: "-Xcc", source: $0.source), $0] }
}
}
26 changes: 26 additions & 0 deletions Tests/SwiftBuildSupportTests/SwiftBuildSystemTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,32 @@ struct SwiftBuildSystemTests {
}
}

@Test
func cFlagsAppliedToSwiftInBuildRequest() async throws {
try await withTemporaryDirectory { tempDir in
try await withInstantiatedSwiftBuildSystem(
fromFixture: "PIFBuilder/Simple",
buildParameters: mockBuildParameters(
destination: .host,
flags: .init(cCompilerFlags: [BuildFlag(value: "-DFoo", source: .commandLineOptions)]),
buildSystemKind: .swiftbuild
),
) { swiftBuild, service, session, observabilityScope, buildParameters in
let buildRequest = try await swiftBuild.makeBuildRequest(
service: service,
session: session,
configuredTargets: [],
derivedDataPath: tempDir,
symbolGraphOptions: nil,
setToolchainSetting: false
)

#expect(buildRequest.parameters.overrides.synthesized?.table["OTHER_CFLAGS"]?.contains("-DFoo") == true)
#expect(buildRequest.parameters.overrides.synthesized?.table["OTHER_SWIFT_FLAGS"]?.contains("-Xcc -DFoo") == true)
}
}
}

@Suite
struct DebuggingSettingsTests {

Expand Down
16 changes: 16 additions & 0 deletions Tests/SwiftPMBuildServerTests/BuildServerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -196,5 +196,21 @@ struct SwiftPMBuildServerTests {
}
}
}

@Test
func extraSwiftcArgs() async throws {
try await withSwiftPMBSP(fixtureName: "Miscellaneous/Simple", extraBSPArgs: ["-Xswiftc", "-DFoo", "-Xcc", "-DBar"]) { connection, _, _ in
let targetResponse = try await connection.send(WorkspaceBuildTargetsRequest())
let fooID = try #require(targetResponse.targets.first(where: { $0.displayName == "Foo" })).id
let sourcesResponse = try await connection.send(BuildTargetSourcesRequest(targets: [fooID]))
let item = try #require(sourcesResponse.items.only?.sources.only)

_ = try await connection.send(BuildTargetPrepareRequest(targets: [fooID]))

let settingsResponse = try #require(try await connection.send(TextDocumentSourceKitOptionsRequest(textDocument: TextDocumentIdentifier(item.uri), target: fooID, language: .swift)))
#expect(settingsResponse.compilerArguments.contains("-DFoo"))
#expect(settingsResponse.compilerArguments.contains(["-Xcc", "-DBar"]))
}
}
}
#endif
Loading