Skip to content

Commit 58ab687

Browse files
committed
More Emscripten support
1 parent 86e346f commit 58ab687

3 files changed

Lines changed: 60 additions & 2 deletions

File tree

Sources/Basics/Vendor/Triple+Platforms.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
// Changes:
1919
// - Replaced usage of `\(_:or:)` string interpolation.
2020
// - Replaced usage of `self.isDarwin` with `self.os?.isDarwin ?? false`.
21+
// - Added `.emscripten` case to `platformName(conflatingDarwin:)` so
22+
// `BuildParameters.buildPath` can derive the Products-dir suffix
23+
// from the triple without hardcoding the platform name. Swift Build
24+
// depends on the returned "emscripten" string matching its
25+
// `EFFECTIVE_PLATFORM_NAME`. Re-vendor from swift-driver once the
26+
// upstream file adopts the same case.
2127
//
2228
//===----------------------------------------------------------------------===//
2329

@@ -329,14 +335,16 @@ extension Triple {
329335
return "haiku"
330336
case .wasi:
331337
return "wasi"
338+
case .emscripten:
339+
return "emscripten"
332340
case .noneOS:
333341
return nil
334342

335343
// Explicitly spell out the remaining cases to force a compile error when
336344
// Triple updates
337345
case .ananas, .cloudABI, .dragonFly, .fuchsia, .kfreebsd, .lv2, .netbsd,
338346
.solaris, .minix, .rtems, .nacl, .cnk, .aix, .cuda, .nvcl, .amdhsa,
339-
.elfiamcu, .mesa3d, .contiki, .amdpal, .hermitcore, .hurd, .emscripten:
347+
.elfiamcu, .mesa3d, .contiki, .amdpal, .hermitcore, .hurd:
340348
return nil
341349
}
342350
}

Sources/SPMBuildCore/BuildParameters/BuildParameters.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,11 @@ public struct BuildParameters: Encodable {
265265
// no suffix
266266
} else if self.triple.isAndroid() {
267267
configDir += "-android"
268-
} else if self.triple.isWasm {
268+
} else if self.triple.isWasm && self.triple.isNoneOS() {
269+
// Legacy suffix for bare-metal wasm (wasm32-unknown-none-wasm).
270+
// All other wasm triples (wasi*, emscripten) fall through
271+
// to `osNameUnversioned` below, which must match swift-build's
272+
// `WebAssemblyPlatformExtension.platformName(triple:)` output.
269273
configDir += "-webassembly"
270274
} else {
271275
configDir += "-" + (self.triple.darwinPlatform?.platformName ?? self.triple.osNameUnversioned)

Tests/SPMBuildCoreTests/BuildParametersTests.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
@testable import SPMBuildCore
1414
import Basics
1515
import struct PackageModel.BuildEnvironment
16+
import enum PackageModel.BuildConfiguration
1617
import _InternalTestSupport
1718
import Testing
1819

@@ -28,4 +29,49 @@ struct BuildParametersTests {
2829
parameters.configuration = .release
2930
#expect(!parameters.enableTestability)
3031
}
32+
33+
@Test(arguments: [
34+
(triple: "wasm32-unknown-wasi", suffix: "-wasi"),
35+
(triple: "wasm32-unknown-wasip1", suffix: "-wasi"),
36+
(triple: "wasm32-unknown-wasip1-threads", suffix: "-wasi"),
37+
(triple: "wasm32-unknown-wasip2", suffix: "-wasi"),
38+
(triple: "wasm64-unknown-wasi", suffix: "-wasi"),
39+
(triple: "wasm32-unknown-emscripten", suffix: "-emscripten"),
40+
(triple: "wasm32-unknown-none-wasm", suffix: "-webassembly"),
41+
] as [(triple: String, suffix: String)],
42+
[
43+
(config: BuildConfiguration.debug, buildSystem: BuildSystemProvider.Kind.swiftbuild),
44+
(config: .debug, buildSystem: .xcode),
45+
(config: .release, buildSystem: .swiftbuild),
46+
(config: .release, buildSystem: .xcode),
47+
] as [(config: BuildConfiguration, buildSystem: BuildSystemProvider.Kind)])
48+
func productsDirSuffixIsDerivedFromTriple(
49+
tripleAndSuffix: (triple: String, suffix: String),
50+
configAndBuildSystem: (config: BuildConfiguration, buildSystem: BuildSystemProvider.Kind),
51+
) throws {
52+
// The expected-suffix column must stay byte-exact with swift-build's
53+
// `WebAssemblyPlatformExtension.platformName(triple:)` (wasi, emscripten)
54+
// and with swift-build's pre-#1335 legacy "webassembly" platform name
55+
// (bare-metal wasm). A mismatch breaks `swift build --show-bin-path` /
56+
// `swift run` path resolution under `.swiftbuild` — the exact regression
57+
// that caused PR #1335 to be reverted.
58+
let parsedTriple = try Basics.Triple(tripleAndSuffix.triple)
59+
let parameters = mockBuildParameters(
60+
destination: .target,
61+
config: configAndBuildSystem.config,
62+
buildSystemKind: configAndBuildSystem.buildSystem,
63+
triple: parsedTriple,
64+
)
65+
let configDir = parameters.buildPath.basename
66+
let expectedConfigPrefix = configAndBuildSystem.config.dirname.capitalized
67+
#expect(
68+
configDir == expectedConfigPrefix + tripleAndSuffix.suffix,
69+
"""
70+
triple \(tripleAndSuffix.triple) / config \(configAndBuildSystem.config) / \
71+
buildSystem \(configAndBuildSystem.buildSystem) must yield \
72+
Products/\(expectedConfigPrefix)\(tripleAndSuffix.suffix) \
73+
(got \"\(configDir)\")
74+
""",
75+
)
76+
}
3177
}

0 commit comments

Comments
 (0)