Skip to content

Commit dadb5c0

Browse files
build: add arm64 macOS support
1 parent e9071ec commit dadb5c0

File tree

6 files changed

+1835
-12
lines changed

6 files changed

+1835
-12
lines changed

.github/workflows/CI.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,14 @@ jobs:
2727
node-version: ${{ matrix.node_version }}
2828

2929
- name: Install dependencies and build
30-
run: npm install
30+
run: yarn
31+
32+
- name: Build altenative architecture
33+
if: matrix.os == 'macos-latest'
34+
run: MINIDUMP_BUILD_ARCH=arm64 node build.js
3135

3236
- name: Tests
33-
run: npm run test
37+
run: yarn test
3438

3539
- name: Upload artifacts
3640
uses: actions/upload-artifact@v2

build.js

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const fs = require('fs')
22
const path = require('path')
33
const childProcess = require('child_process')
4+
const { getEffectiveArch } = require('./lib/arch')
45

56
const exe = process.platform === 'win32' ? '.exe' : ''
6-
const binDir = path.join(__dirname, 'bin', `${process.platform}-${process.arch}`)
7+
const binDir = path.join(__dirname, 'bin', `${process.platform}-${getEffectiveArch()}`)
78

89
const minidumpStackwalkDest = path.join(binDir, 'minidump_stackwalk') + exe
910
const minidumpDumpDest = path.join(binDir, 'minidump_dump') + exe
@@ -26,16 +27,22 @@ function spawnSync (...args) {
2627
}
2728
}
2829

29-
const buildDir = path.join(__dirname, 'build')
30+
const buildDir = path.join(__dirname, 'build', getEffectiveArch())
3031
if (!fs.existsSync(buildDir)) {
3132
fs.mkdirSync(buildDir, { recursive: true })
3233
}
3334

34-
spawnSync(path.join(__dirname, 'deps', 'breakpad', 'configure'), [], {
35+
let overrideArch = '';
36+
if (getEffectiveArch() !== process.arch && process.platform === 'darwin') {
37+
overrideArch = getEffectiveArch() === 'arm64' ? 'arm64' : 'x86_64';
38+
}
39+
40+
spawnSync(path.join(__dirname, 'deps', 'breakpad', 'configure'), ['--host=x86_64-apple-darwin20.6.0'], {
3541
cwd: buildDir,
3642
env: {
3743
...process.env,
38-
CPPFLAGS: `-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`
44+
CPPFLAGS: [`-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`, ...(overrideArch ? [`-arch ${overrideArch}`] : [])].join(' '),
45+
LDFLAGS: overrideArch ? `-arch ${overrideArch}` : undefined,
3946
},
4047
stdio: 'inherit'
4148
})
@@ -59,23 +66,33 @@ if (!fs.existsSync(binDir)) {
5966
fs.mkdirSync(binDir, { recursive: true })
6067
}
6168

62-
const minidumpStackwalk = path.resolve(__dirname, 'build', 'src', 'processor', 'minidump_stackwalk') + exe
69+
const minidumpStackwalk = path.resolve(buildDir, 'src', 'processor', 'minidump_stackwalk') + exe
6370
fs.copyFileSync(minidumpStackwalk, minidumpStackwalkDest)
6471

65-
const minidumpDump = path.resolve(__dirname, 'build', 'src', 'processor', 'minidump_dump') + exe
72+
const minidumpDump = path.resolve(buildDir, 'src', 'processor', 'minidump_dump') + exe
6673
fs.copyFileSync(minidumpDump, minidumpDumpDest)
6774

6875
const dumpSyms = (() => {
6976
if (process.platform === 'darwin') {
7077
return path.resolve(__dirname, 'deps', 'breakpad', 'src', 'tools', 'mac', 'dump_syms', 'build', 'Release', 'dump_syms')
7178
} else if (process.platform === 'linux') {
72-
return path.resolve(__dirname, 'build', 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
79+
return path.resolve(buildDir, 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
7380
}
7481
})()
7582
fs.copyFileSync(dumpSyms, dumpSymsDest)
7683

77-
fs.readdirSync(binDir).forEach(file => stripBin(path.join(binDir, file)))
84+
fs.readdirSync(binDir).forEach(file => {
85+
const absFile = path.join(binDir, file)
86+
stripBin(absFile)
87+
maybeSignBin(absFile)
88+
})
7889

7990
function stripBin (file) {
8091
return childProcess.execFileSync(process.env.STRIP || 'strip', [file, process.platform === 'darwin' ? '-Sx' : '--strip-all'])
8192
}
93+
94+
function maybeSignBin (file) {
95+
if (process.platform !== 'darwin') return
96+
97+
return childProcess.execFileSync('codesign', ['--sign', '-', '--force', '--preserve-metadata=entitlements,requirements,flags,runtime', file])
98+
}

deps/breakpad

Submodule breakpad updated from b62101d to c85eb4a

lib/arch.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module.exports = {
2+
getEffectiveArch: () => {
3+
return process.env.MINIDUMP_BUILD_ARCH || process.arch
4+
}
5+
}

lib/minidump.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
const fs = require('fs')
22
const path = require('path')
33
const spawn = require('child_process').spawn
4+
const { getEffectiveArch } = require('./arch')
45
const format = require('./format')
56

67
const exe = process.platform === 'win32' ? '.exe' : ''
7-
const binDir = path.join(path.dirname(__dirname), 'bin', `${process.platform}-${process.arch}`)
8+
const binDir = path.join(path.dirname(__dirname), 'bin', `${process.platform}-${getEffectiveArch()}`)
89

910
const commands = {
1011
minidump_stackwalk: path.join(binDir, 'minidump_stackwalk') + exe,

0 commit comments

Comments
 (0)