Skip to content

Commit

Permalink
build: add arm64 macOS support (#50)
Browse files Browse the repository at this point in the history
  • Loading branch information
MarshallOfSound committed Apr 22, 2022
1 parent e9071ec commit 05b010e
Show file tree
Hide file tree
Showing 6 changed files with 1,837 additions and 12 deletions.
8 changes: 6 additions & 2 deletions .github/workflows/CI.yml
Expand Up @@ -27,10 +27,14 @@ jobs:
node-version: ${{ matrix.node_version }}

- name: Install dependencies and build
run: npm install
run: yarn

- name: Build altenative architecture
if: matrix.os == 'macos-latest'
run: MINIDUMP_BUILD_ARCH=arm64 node build.js

- name: Tests
run: npm run test
run: yarn test

- name: Upload artifacts
uses: actions/upload-artifact@v2
Expand Down
35 changes: 27 additions & 8 deletions build.js
@@ -1,9 +1,10 @@
const fs = require('fs')
const path = require('path')
const childProcess = require('child_process')
const { getEffectiveArch } = require('./lib/arch')

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

const minidumpStackwalkDest = path.join(binDir, 'minidump_stackwalk') + exe
const minidumpDumpDest = path.join(binDir, 'minidump_dump') + exe
Expand All @@ -26,16 +27,24 @@ function spawnSync (...args) {
}
}

const buildDir = path.join(__dirname, 'build')
const buildDir = path.join(__dirname, 'build', getEffectiveArch())
if (!fs.existsSync(buildDir)) {
fs.mkdirSync(buildDir, { recursive: true })
}

spawnSync(path.join(__dirname, 'deps', 'breakpad', 'configure'), [], {
let overrideArch = ''
let crossCompileHost = ''
if (getEffectiveArch() !== process.arch && process.platform === 'darwin') {
overrideArch = getEffectiveArch() === 'arm64' ? 'arm64' : 'x86_64'
crossCompileHost = 'x86_64-apple-darwin20.6.0'
}

spawnSync(path.join(__dirname, 'deps', 'breakpad', 'configure'), crossCompileHost ? [`--host=${crossCompileHost}`] : [], {
cwd: buildDir,
env: {
...process.env,
CPPFLAGS: `-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`
CPPFLAGS: [`-I${path.relative(buildDir, path.join(__dirname, 'deps'))}`, ...(overrideArch ? [`-arch ${overrideArch}`] : [])].join(' '),
LDFLAGS: overrideArch ? `-arch ${overrideArch}` : undefined
},
stdio: 'inherit'
})
Expand All @@ -59,23 +68,33 @@ if (!fs.existsSync(binDir)) {
fs.mkdirSync(binDir, { recursive: true })
}

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

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

const dumpSyms = (() => {
if (process.platform === 'darwin') {
return path.resolve(__dirname, 'deps', 'breakpad', 'src', 'tools', 'mac', 'dump_syms', 'build', 'Release', 'dump_syms')
} else if (process.platform === 'linux') {
return path.resolve(__dirname, 'build', 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
return path.resolve(buildDir, 'src', 'tools', 'linux', 'dump_syms', 'dump_syms')
}
})()
fs.copyFileSync(dumpSyms, dumpSymsDest)

fs.readdirSync(binDir).forEach(file => stripBin(path.join(binDir, file)))
fs.readdirSync(binDir).forEach(file => {
const absFile = path.join(binDir, file)
stripBin(absFile)
maybeSignBin(absFile)
})

function stripBin (file) {
return childProcess.execFileSync(process.env.STRIP || 'strip', [file, process.platform === 'darwin' ? '-Sx' : '--strip-all'])
}

function maybeSignBin (file) {
if (process.platform !== 'darwin') return

return childProcess.execFileSync('codesign', ['--sign', '-', '--force', '--preserve-metadata=entitlements,requirements,flags,runtime', file])
}
2 changes: 1 addition & 1 deletion deps/breakpad
Submodule breakpad updated from b62101 to c85eb4
5 changes: 5 additions & 0 deletions lib/arch.js
@@ -0,0 +1,5 @@
module.exports = {
getEffectiveArch: () => {
return process.env.MINIDUMP_BUILD_ARCH || process.arch
}
}
3 changes: 2 additions & 1 deletion lib/minidump.js
@@ -1,10 +1,11 @@
const fs = require('fs')
const path = require('path')
const spawn = require('child_process').spawn
const { getEffectiveArch } = require('./arch')
const format = require('./format')

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

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

0 comments on commit 05b010e

Please sign in to comment.