Skip to content

Commit 45a402b

Browse files
authored
fix(mac): only fuse macOS universal builds on the combined universal package (#8799)
1 parent 121b473 commit 45a402b

File tree

4 files changed

+71
-32
lines changed

4 files changed

+71
-32
lines changed

.changeset/eighty-swans-hang.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"app-builder-lib": patch
3+
---
4+
5+
fix(mac): only fuse macOS universal builds on the combined universal package

packages/app-builder-lib/src/macPackager.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { DIR_TARGET, Platform, Target } from "./core"
1010
import { AfterPackContext, ElectronPlatformName } from "./index"
1111
import { MacConfiguration, MasConfiguration } from "./options/macOptions"
1212
import { Packager } from "./packager"
13-
import { chooseNotNull, PlatformPackager } from "./platformPackager"
13+
import { chooseNotNull, DoPackOptions, PlatformPackager } from "./platformPackager"
1414
import { ArchiveTarget } from "./targets/ArchiveTarget"
1515
import { PkgTarget, prepareProductBuildArgs } from "./targets/pkg"
1616
import { createCommonTarget, NoOpTarget } from "./targets/targetFactory"
@@ -107,32 +107,35 @@ export class MacPackager extends PlatformPackager<MacConfiguration> {
107107
}
108108
}
109109

110-
protected async doPack(
111-
outDir: string,
112-
appOutDir: string,
113-
platformName: ElectronPlatformName,
114-
arch: Arch,
115-
platformSpecificBuildOptions: MacConfiguration,
116-
targets: Array<Target>
117-
): Promise<any> {
110+
protected async doPack(config: DoPackOptions<MacConfiguration>): Promise<any> {
111+
const { outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets } = config
112+
118113
switch (arch) {
119114
default: {
120-
return super.doPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets)
115+
return super.doPack(config)
121116
}
122117
case Arch.universal: {
123118
const outDirName = (arch: Arch) => `${appOutDir}-${Arch[arch]}-temp`
119+
const options = {
120+
...config,
121+
options: {
122+
sign: false,
123+
disableAsarIntegrity: true,
124+
disableFuses: true,
125+
},
126+
}
124127

125128
const x64Arch = Arch.x64
126129
const x64AppOutDir = outDirName(x64Arch)
127-
await super.doPack(outDir, x64AppOutDir, platformName, x64Arch, platformSpecificBuildOptions, targets, false, true)
130+
await super.doPack({ ...options, appOutDir: x64AppOutDir, arch: x64Arch })
128131

129132
if (this.info.cancellationToken.cancelled) {
130133
return
131134
}
132135

133136
const arm64Arch = Arch.arm64
134137
const arm64AppOutPath = outDirName(arm64Arch)
135-
await super.doPack(outDir, arm64AppOutPath, platformName, arm64Arch, platformSpecificBuildOptions, targets, false, true)
138+
await super.doPack({ ...options, appOutDir: arm64AppOutPath, arch: arm64Arch })
136139

137140
if (this.info.cancellationToken.cancelled) {
138141
return
@@ -177,6 +180,8 @@ export class MacPackager extends PlatformPackager<MacConfiguration> {
177180
return
178181
}
179182

183+
await this.doAddElectronFuses(packContext)
184+
180185
await this.doSignAfterPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets)
181186
break
182187
}
@@ -202,7 +207,7 @@ export class MacPackager extends PlatformPackager<MacConfiguration> {
202207

203208
const targetOutDir = path.join(outDir, `${targetName}${getArchSuffix(arch, this.platformSpecificBuildOptions.defaultArch)}`)
204209
if (prepackaged == null) {
205-
await this.doPack(outDir, targetOutDir, "mas", arch, masBuildOptions, [target])
210+
await this.doPack({ outDir, appOutDir: targetOutDir, platformName: "mas", arch, platformSpecificBuildOptions: masBuildOptions, targets: [target] })
206211
await this.sign(path.join(targetOutDir, `${this.appInfo.productFilename}.app`), targetOutDir, masBuildOptions, arch)
207212
} else {
208213
await this.sign(prepackaged, targetOutDir, masBuildOptions, arch)
@@ -212,7 +217,14 @@ export class MacPackager extends PlatformPackager<MacConfiguration> {
212217
if (!hasMas || targets.length > 1) {
213218
const appPath = prepackaged == null ? path.join(this.computeAppOutDir(outDir, arch), `${this.appInfo.productFilename}.app`) : prepackaged
214219
if (prepackaged == null) {
215-
await this.doPack(outDir, path.dirname(appPath), this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets)
220+
await this.doPack({
221+
outDir,
222+
appOutDir: path.dirname(appPath),
223+
platformName: this.platform.nodeName as ElectronPlatformName,
224+
arch,
225+
platformSpecificBuildOptions: this.platformSpecificBuildOptions,
226+
targets,
227+
})
216228
}
217229
this.packageInDistributableFormat(appPath, arch, targets, taskManager)
218230
}

packages/app-builder-lib/src/platformPackager.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,20 @@ import { resolveFunction } from "./util/resolve"
3434
import { flipFuses, FuseConfig, FuseV1Config, FuseV1Options, FuseVersion } from "@electron/fuses"
3535
import { FuseOptionsV1 } from "./configuration"
3636

37+
export type DoPackOptions<DC extends PlatformSpecificBuildOptions> = {
38+
outDir: string
39+
appOutDir: string
40+
platformName: ElectronPlatformName
41+
arch: Arch
42+
platformSpecificBuildOptions: DC
43+
targets: Array<Target>
44+
options?: {
45+
sign?: boolean
46+
disableAsarIntegrity?: boolean
47+
disableFuses?: boolean
48+
}
49+
}
50+
3751
export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions> {
3852
get packagerOptions(): PackagerOptions {
3953
return this.info.options
@@ -138,7 +152,14 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
138152

139153
async pack(outDir: string, arch: Arch, targets: Array<Target>, taskManager: AsyncTaskManager): Promise<any> {
140154
const appOutDir = this.computeAppOutDir(outDir, arch)
141-
await this.doPack(outDir, appOutDir, this.platform.nodeName as ElectronPlatformName, arch, this.platformSpecificBuildOptions, targets)
155+
await this.doPack({
156+
outDir,
157+
appOutDir,
158+
platformName: this.platform.nodeName as ElectronPlatformName,
159+
arch,
160+
platformSpecificBuildOptions: this.platformSpecificBuildOptions,
161+
targets,
162+
})
142163
this.packageInDistributableFormat(appOutDir, arch, targets, taskManager)
143164
}
144165

@@ -188,16 +209,7 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
188209
}
189210
}
190211

191-
protected async doPack(
192-
outDir: string,
193-
appOutDir: string,
194-
platformName: ElectronPlatformName,
195-
arch: Arch,
196-
platformSpecificBuildOptions: DC,
197-
targets: Array<Target>,
198-
sign = true,
199-
disableAsarIntegrity = false
200-
) {
212+
protected async doPack(packOptions: DoPackOptions<DC>) {
201213
if (this.packagerOptions.prepackaged != null) {
202214
return
203215
}
@@ -209,6 +221,8 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
209221
// Due to node-gyp rewriting GYP_MSVS_VERSION when reused across the same session, we must reset the env var: https://github.com/electron-userland/electron-builder/issues/7256
210222
delete process.env.GYP_MSVS_VERSION
211223

224+
const { outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets, options } = packOptions
225+
212226
const beforePack = await resolveFunction(this.appInfo.type, this.config.beforePack, "beforePack")
213227
if (beforePack != null) {
214228
await beforePack({
@@ -305,7 +319,7 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
305319
await framework.beforeCopyExtraFiles({
306320
packager: this,
307321
appOutDir,
308-
asarIntegrity: asarOptions == null || disableAsarIntegrity ? null : await computeData({ resourcesPath, resourcesRelativePath }),
322+
asarIntegrity: asarOptions == null || options?.disableAsarIntegrity ? null : await computeData({ resourcesPath, resourcesRelativePath }),
309323
platformName,
310324
})
311325
}
@@ -331,16 +345,23 @@ export abstract class PlatformPackager<DC extends PlatformSpecificBuildOptions>
331345
const isAsar = asarOptions != null
332346
await this.sanityCheckPackage(appOutDir, isAsar, framework, !!this.config.disableSanityCheckAsar)
333347

334-
// the fuses MUST be flipped right before signing
335-
if (this.config.electronFuses != null) {
336-
const fuseConfig = this.generateFuseConfig(this.config.electronFuses)
337-
await this.addElectronFuses(packContext, fuseConfig)
348+
if (!options?.disableFuses) {
349+
await this.doAddElectronFuses(packContext)
338350
}
339-
if (sign) {
351+
if (options?.sign ?? true) {
340352
await this.doSignAfterPack(outDir, appOutDir, platformName, arch, platformSpecificBuildOptions, targets)
341353
}
342354
}
343355

356+
// the fuses MUST be flipped right before signing
357+
protected async doAddElectronFuses(packContext: AfterPackContext) {
358+
if (this.config.electronFuses == null) {
359+
return
360+
}
361+
const fuseConfig = this.generateFuseConfig(this.config.electronFuses)
362+
await this.addElectronFuses(packContext, fuseConfig)
363+
}
364+
344365
private generateFuseConfig(fuses: FuseOptionsV1): FuseV1Config {
345366
const config: FuseV1Config = {
346367
version: FuseVersion.V1,

test/src/helpers/CheckingPackager.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { MacPackager } from "app-builder-lib/out/macPackager"
66
import { DmgTarget } from "dmg-builder"
77
import { WinPackager } from "app-builder-lib/out/winPackager"
88
import { SignOptions as MacSignOptions } from "@electron/osx-sign/dist/cjs/types"
9+
import { DoPackOptions } from "app-builder-lib/out/platformPackager"
910

1011
export class CheckingWinPackager extends WinPackager {
1112
effectiveDistOptions: any
@@ -50,7 +51,7 @@ export class CheckingMacPackager extends MacPackager {
5051
}
5152

5253
//noinspection JSUnusedLocalSymbols
53-
async doPack(outDir: string, appOutDir: string, platformName: string, arch: Arch, customBuildOptions: MacConfiguration, targets: Array<Target>) {
54+
async doPack(_options: DoPackOptions<MacConfiguration>) {
5455
// skip
5556
}
5657

0 commit comments

Comments
 (0)