Skip to content

Commit 1d29fcd

Browse files
authored
SwiftBuild: expose STRIP_INSTALLED_PRODUCT setting (#10038)
Allow the STRIP_INSTALLED_PRODUCT build setting in the Swift Build settings to be configuration in SwiftPM. Add an "enable/disable" build options that will sets the settings value accordingly. When not set, the products are not stripped, matching the native build system. Fixes: #10037 Issue: rdar://176554583 Depends on: swiftlang/swift-build#1395
1 parent 2476586 commit 1d29fcd

15 files changed

Lines changed: 222 additions & 8 deletions

File tree

Sources/Build/BuildOperation.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,15 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
438438
return result
439439
}
440440

441+
if let stripProduct = self.config.destinationBuildParameters.stripProducts {
442+
self.observabilityScope.emit(
443+
Basics.Diagnostic.unsupportedStripProductsConfigurationFlag(
444+
isEnabled: stripProduct,
445+
with: .native,
446+
)
447+
)
448+
}
449+
441450
let buildStartTime = DispatchTime.now()
442451

443452
// Get the build description (either a cached one or newly created).

Sources/CoreCommands/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
add_library(CoreCommands
1010
BuildSystemSupport.swift
1111
SwiftCommandState.swift
12+
SwiftCommandState.swift
1213
SwiftCommandObservabilityHandler.swift
1314
Options.swift)
1415
target_link_libraries(CoreCommands PUBLIC

Sources/CoreCommands/Options.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,13 @@ public struct BuildOptions: ParsableArguments {
650650
/// See `BuildParameters.DebugInfoFormat.none` for details.
651651
case none
652652
}
653+
654+
@Flag(
655+
name: .customLong("experimental-strip-products"),
656+
inversion: .prefixedEnableDisable,
657+
help: "Whether or not to strip debug symbols from the final binary.",
658+
)
659+
public var stripProducts: Bool?
653660
}
654661

655662
public struct LinkerOptions: ParsableArguments {

Sources/CoreCommands/SwiftCommandState.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1063,7 +1063,8 @@ public final class SwiftCommandState {
10631063
forceTestDiscovery: self.options.build.enableTestDiscovery,
10641064
// backwards compatibility, remove with --enable-test-discovery
10651065
testEntryPointPath: self.options.build.testEntryPointPath
1066-
)
1066+
),
1067+
stripProducts: self.options.build.stripProducts,
10671068
)
10681069
}
10691070

Sources/SPMBuildCore/BuildParameters/BuildParameters.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public struct BuildParameters: Encodable {
9494
/// Whether to create dylibs for dynamic library products.
9595
public var shouldCreateDylibForDynamicProducts: Bool
9696

97+
/// Whether to strip debug symbols from the final binary
98+
public var stripProducts: Bool?
99+
97100
/// The current build environment.
98101
public var buildEnvironment: BuildEnvironment {
99102
BuildEnvironment(platform: currentPlatform, configuration: configuration)
@@ -187,7 +190,8 @@ public struct BuildParameters: Encodable {
187190
linkingParameters: Linking = .init(),
188191
outputParameters: Output = .init(),
189192
testingParameters: Testing = .init(),
190-
apiDigesterMode: APIDigesterMode? = nil
193+
apiDigesterMode: APIDigesterMode? = nil,
194+
stripProducts: Bool? = nil,
191195
) throws {
192196
// Default to the unversioned triple if none is provided so that we defer to the package's requested deployment target, for Darwin platforms. For other platforms, continue to include the version since those don't have the concept of a package-specified version, and the version is meaningful for some platforms including Android and FreeBSD.
193197
let triple = try triple ?? {
@@ -253,6 +257,7 @@ public struct BuildParameters: Encodable {
253257
self.outputParameters = outputParameters
254258
self.testingParameters = testingParameters
255259
self.apiDigesterMode = apiDigesterMode
260+
self.stripProducts = stripProducts
256261
}
257262

258263
/// The path to the build directory (inside the data directory).

Sources/SPMBuildCore/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ add_library(SPMBuildCore
2020
BuildSystem/BuildSystemDelegate.swift
2121
BuildSystem/DiagnosticsCapturingBuildSystemDelegate.swift
2222
BuiltTestProduct.swift
23+
Diagnostics+Extensions.swift
2324
Plugins/DefaultPluginScriptRunner.swift
2425
Plugins/PluginContextSerializer.swift
2526
Plugins/PluginInvocation.swift
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// This source file is part of the Swift open source project
4+
//
5+
// Copyright (c) 2026 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See http://swift.org/LICENSE.txt for license information
9+
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
import struct Basics.Diagnostic
13+
import struct SPMBuildCore.BuildSystemProvider
14+
import enum PackageModel.BuildConfiguration
15+
16+
extension Basics.Diagnostic {
17+
18+
package static func unsupportedStripProductsConfigurationFlag(
19+
isEnabled: Bool,
20+
with selectedBuildSystem: BuildSystemProvider.Kind,
21+
) -> Self {
22+
return .error("Command line option '--\(isEnabled ? "enable": "--disable")--experimental-strip-products' is unsupported with build system '\(selectedBuildSystem)'. Only use with '\(BuildSystemProvider.Kind.swiftbuild)' build system with configuration '\(BuildConfiguration.release)'")
23+
}
24+
}

Sources/SwiftBuildSupport/PIFBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ public final class PIFBuilder {
442442
packageDisplayVersion: package.manifest.displayName,
443443
pkgConfigDirectories: self.parameters.pkgConfigDirectories,
444444
fileSystem: self.fileSystem,
445-
observabilityScope: self.observabilityScope
445+
observabilityScope: self.observabilityScope,
446446
)
447447

448448
packagesAndBuilders.append((package, packagePIFBuilder, packagePIFBuilderDelegate))

Sources/SwiftBuildSupport/SwiftBuildSystem.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
@_spi(SwiftPMInternal)
1414
import Basics
15+
import SPMBuildCore // for the Basics.Diagnostic extension
1516
import Dispatch
1617
import class Foundation.FileManager
1718
import class Foundation.JSONEncoder
@@ -448,6 +449,15 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
448449
return result
449450
}
450451

452+
if let stripProdduct = self.buildParameters.stripProducts, self.buildParameters.configuration != .release {
453+
self.observabilityScope.emit(
454+
Basics.Diagnostic.unsupportedStripProductsConfigurationFlag(
455+
isEnabled: stripProdduct,
456+
with: .swiftbuild,
457+
)
458+
)
459+
}
460+
451461
guard try await self.compilePlugins(in: subset) else {
452462
result.serializedDiagnosticPathsByTargetName = .failure(StringError("Plugin compilation failed"))
453463
return result
@@ -888,6 +898,12 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
888898
}
889899
}
890900

901+
settings["STRIP_INSTALLED_PRODUCT"] = if let stripInstalledProducts = self.buildParameters.stripProducts {
902+
stripInstalledProducts ? "YES" : "NO"
903+
} else {
904+
"NO"
905+
}
906+
891907
// FIXME: workaround for old Xcode installations such as what is in CI
892908
settings["LM_SKIP_METADATA_EXTRACTION"] = "YES"
893909
if let symbolGraphOptions {

Sources/XCBuildSupport/XcodeBuildSystem.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
@_spi(SwiftPMInternal)
1414
import Basics
1515
import Dispatch
16+
import SPMBuildCore // for the Basics.Diagnostic extension
1617
import class Foundation.JSONEncoder
1718
import class Foundation.NSArray
1819
import class Foundation.NSDictionary
@@ -186,6 +187,15 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
186187
return buildResult
187188
}
188189

190+
if let stripProdduct = self.buildParameters.stripProducts {
191+
self.observabilityScope.emit(
192+
Basics.Diagnostic.unsupportedStripProductsConfigurationFlag(
193+
isEnabled: stripProdduct,
194+
with: .xcode,
195+
)
196+
)
197+
}
198+
189199
let pifBuilder = try await getPIFBuilder()
190200
let pif = try pifBuilder.generatePIF()
191201
try self.fileSystem.writeIfChanged(path: buildParameters.pifManifest, string: pif)

0 commit comments

Comments
 (0)