diff --git a/README.md b/README.md index 98f2652..364386a 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ Options can be provided via (in order of precedence) the programmatic API, the C |:---------------------|:---------------------|:-------------------------------|:------------ | `--target -t` | - | Depends. | One or more targets\* | `--all -a` | - | `false` | Build all known targets.
Takes precedence over `--target`. -| `--napi` | - | `false` | Make [N-API][n-api] build(s).
Targets default to latest node which is compatible with Electron > 3, which can be overridden with `--target`. Note: `--all` should be avoided for now because it includes targets that don't support N-API. -| `--electron-compat` | - | `false` | Make two N-API builds, one for node and one for Electron. Useful if you support Electron <= 3. +| `--napi` | - | `false` | Make [N-API][n-api] build(s).
Targets default to latest node which is compatible with Electron > 3, which can be overridden with `--target`. +| `--electron-compat` | - | `false` | Make two N-API builds, one for node and one for Electron. Provide this to make sure Electron abi is supported. | `--debug` | - | `false` | Make Debug build(s) | `--arch` | `PREBUILD_ARCH` | [`os.arch()`]([os-arch]) | Target architecture\*\* | `--platform` | `PREBUILD_PLATFORM` | [`os.platform()`][os-platform] | Target platform\*\* @@ -106,8 +106,22 @@ Options can be provided via (in order of precedence) the programmatic API, the C \* A target takes the form of `(runtime@)?version`, where `runtime` defaults to `'node'`. For example: `-t 8.14.0 -t electron@3.0.0`. At least one of `--target`, `--all` or `--napi` must be specified. +``` +prebuildify --napi -all # all the napi versions that are supported by Node +prebuildify --napi --electron-compat -all # all the napi versions that are supported by Node or Electron +prebuildify --napi # last napi version supported by Node +prebuildify --napi --electron-compat # last napi version supported by Node +prebuildify --all # all the targets +prebuildify -t 8.14.0 -t electron@3.0.0 # specific targets +``` + \*\* The `arch` option is passed to [`node-gyp`][node-gyp] as `--target-arch`. Target architecture and platform (what you're building _for_) default to the host platform and architecture (what you're building _on_). They can be overridden for cross-compilation, in which case you'll likely also want to override the strip binary. The platform and architecture dictate the output folder. For example on Linux x64 prebuilds end up in `prebuilds/linux-x64`. +``` +prebuildify --napi --electron-compat # uses the architecture of running process +prebuildify --arch=ia32 --napi --electron-compat # windows x86 architecture +``` + \*\*\* The filenames of prebuilds are composed of _tags_ which by default include runtime and either `napi` or `abi`. For example: `electron.abi40.node`. To make more specific prebuilds (for `node-gyp-build` to select) you can add additional tags. Values for these tags are auto-detected. For example, `--napi --tag-uv --tag-armv` could result in a build called `node.napi.uv1.armv8.node` if the host machine has an ARM architecture. When cross-compiling you can override values either through the relevant option (`--tag-armv --armv 7`) or the tag (`--tag-armv 7`) as a shortcut. They're separate because you may want to build a certain version without tagging the prebuild as such, assuming that the prebuild is forward compatible. \*\*\*\* To enable the use of forks like [`nodejs-mobile-gyp`](https://www.npmjs.com/package/nodejs-mobile-gyp). diff --git a/index.js b/index.js index 005d8ab..625faf9 100644 --- a/index.js +++ b/index.js @@ -285,9 +285,16 @@ function resolveTargets (targets, all, napi, electronCompat) { } }) - // TODO: also support --lts and get versions from travis - if (all) { - targets = abi.supportedTargets.slice(0) + // napi and all + if (napi && all) { + targets = abi.supportedTargets.filter(onlyNapiNode) + + // add electron if --electron-compat is provided + if (electronCompat) { + targets.push(...abi.supportedTargets.filter(onlyNapiElectron)) + } + } else if (all) { // TODO: also support --lts and get versions from travis + targets = abi.supportedTargets } // Should be the default once napi is stable @@ -313,6 +320,16 @@ function onlyElectron (t) { return t.runtime === 'electron' } +function onlyNapiNode (t) { + // n-api is supported as of Node 8 which is abi 57 + // https://github.com/lgeiger/node-abi/blob/41217a504e4adb28a36a850c9981812c99086d3a/index.js#L96 + return t.runtime === 'node' && parseInt(t.abi, 10) > 57 +} + +function onlyNapiElectron (t) { + return t.runtime === 'electron' && parseInt(t.abi, 10) > 57 +} + function uv () { return (process.versions.uv || '').split('.')[0] }