Skip to content

Commit 05b010e

Browse files
build: add arm64 macOS support (#50)
1 parent e9071ec commit 05b010e

File tree

6 files changed

+1837
-12
lines changed

6 files changed

+1837
-12
lines changed

.github/workflows/CI.yml

+6-2
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

+27-8
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,24 @@ 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+
let crossCompileHost = ''
37+
if (getEffectiveArch() !== process.arch && process.platform === 'darwin') {
38+
overrideArch = getEffectiveArch() === 'arm64' ? 'arm64' : 'x86_64'
39+
crossCompileHost = 'x86_64-apple-darwin20.6.0'
40+
}
41+
42+
spawnSync(path.join(__dirname, 'deps', 'breakpad', 'configure'), crossCompileHost ? [`--host=${crossCompileHost}`] : [], {
3543
cwd: buildDir,
3644
env: {
3745
...process.env,
38-
CPPFLAGS: `-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`
46+
CPPFLAGS: [`-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`, ...(overrideArch ? [`-arch ${overrideArch}`] : [])].join(' '),
47+
LDFLAGS: overrideArch ? `-arch ${overrideArch}` : undefined
3948
},
4049
stdio: 'inherit'
4150
})
@@ -59,23 +68,33 @@ if (!fs.existsSync(binDir)) {
5968
fs.mkdirSync(binDir, { recursive: true })
6069
}
6170

62-
const minidumpStackwalk = path.resolve(__dirname, 'build', 'src', 'processor', 'minidump_stackwalk') + exe
71+
const minidumpStackwalk = path.resolve(buildDir, 'src', 'processor', 'minidump_stackwalk') + exe
6372
fs.copyFileSync(minidumpStackwalk, minidumpStackwalkDest)
6473

65-
const minidumpDump = path.resolve(__dirname, 'build', 'src', 'processor', 'minidump_dump') + exe
74+
const minidumpDump = path.resolve(buildDir, 'src', 'processor', 'minidump_dump') + exe
6675
fs.copyFileSync(minidumpDump, minidumpDumpDest)
6776

6877
const dumpSyms = (() => {
6978
if (process.platform === 'darwin') {
7079
return path.resolve(__dirname, 'deps', 'breakpad', 'src', 'tools', 'mac', 'dump_syms', 'build', 'Release', 'dump_syms')
7180
} else if (process.platform === 'linux') {
72-
return path.resolve(__dirname, 'build', 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
81+
return path.resolve(buildDir, 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
7382
}
7483
})()
7584
fs.copyFileSync(dumpSyms, dumpSymsDest)
7685

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

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

deps/breakpad

Submodule breakpad updated from b62101d to c85eb4a

lib/arch.js

+5
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

+2-1
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)