You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
8.9 KiB
245 lines
8.9 KiB
# prebuild |
|
|
|
A command line tool for easily doing prebuilds for multiple version of node/iojs on a specific platform. |
|
|
|
``` |
|
$ npm install -g prebuild |
|
``` |
|
|
|
[![build status](http://img.shields.io/travis/mafintosh/prebuild.svg?style=flat)](http://travis-ci.org/mafintosh/prebuild) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) |
|
|
|
## Features |
|
|
|
* Builds native modules for any version of node/iojs, without having to switch between different versions of node/iojs to do so. This works by only downloading the correct headers and telling `node-gyp` to use those instead of the ones installed on your system. |
|
* Upload (`--upload`) prebuilt binaries to GitHub. |
|
* Installs (`--install`) prebuilt binaries from GitHub by default or from a host of your choice. The url format can be customized as you see fit. |
|
* Installed binaries are cached in `~/.npm/_prebuilds/` so you only need to download them once. |
|
* Support for stripping (`--strip`) debug information. |
|
|
|
## Building |
|
|
|
Building is only required for targets with different [ABI](https://en.wikipedia.org/wiki/Application_binary_interface) versions. To build for all *supported* abi versions greater than `0.8` ([example from leveldown](https://github.com/Level/leveldown/blob/ea5999dbd5fddf8f811b6c14162a3282b24ef7a9/package.json#L55)): |
|
|
|
``` |
|
prebuild --all |
|
``` |
|
|
|
Alternatively, to build for some specific versions you can do: |
|
|
|
``` |
|
prebuild -b 0.10.42 -b 0.12.10 -b 4.3.0 |
|
``` |
|
|
|
See [`targets.js`](https://github.com/mafintosh/prebuild/blob/master/targets.js) for currently available versions. |
|
|
|
For more options run `prebuild --help`. The prebuilds created are compatible with [node-pre-gyp](https://github.com/mapbox/node-pre-gyp) |
|
|
|
|
|
## Uploading |
|
|
|
`prebuild` supports uploading prebuilds to GitHub releases. If the release doesn't exist, it will be created for you. To upload prebuilds simply add the `-u <github-token>` option: |
|
|
|
``` |
|
$ prebuild --all -u <github-token> |
|
``` |
|
|
|
If you don't want to use the token on cli you can put it in `~/.prebuildrc`: |
|
|
|
``` |
|
upload=<github-token> |
|
``` |
|
|
|
Note that `--upload` will only upload the targets that was built and stored in `./prebuilds`, so `prebuild -u <github-token> -b 4.3.0` will only upload the binary for the `4.3.0` target. |
|
|
|
You can use `prebuild --upload-all` to upload all files from the `./prebuilds` folder. |
|
|
|
## Installing |
|
|
|
`prebuild` supports installing prebuilt binaries from GitHub by default. To install for your platform, use the `--install` flag. |
|
|
|
``` |
|
$ prebuild --install |
|
``` |
|
|
|
If no suitable binary can be found, `prebuild` will fallback to `node-gyp rebuild`. Native modules that have a javascript fallback can use `--no-compile` to prevent this. |
|
|
|
Once a binary has been downloaded `prebuild` will `require()` the module and if that fails it will also fallback to building it. |
|
|
|
Installed binaries are cached in your npm cache meaning you'll only have to download them once. |
|
|
|
Add `prebuild --install` to your `package.json` so the binaries will be installed when the module is installed |
|
|
|
```json |
|
{ |
|
"name": "a-native-module", |
|
"scripts": { |
|
"install": "prebuild --install" |
|
}, |
|
"dependencies": { |
|
"prebuild": "^4.0.0" |
|
} |
|
} |
|
``` |
|
|
|
If you are hosting your binaries elsewhere you can provide a host to the `--install` flag. The host string can also be a template for constructing more intrinsic urls. Install from `example.com` with a custom format for the binary name: |
|
|
|
``` |
|
$ prebuild --install https://example.com/{name}-{version}-{abi}-{platform}{libc}-{arch}.tar.gz |
|
``` |
|
|
|
`--install` will download binaries when installing from npm and compile in other cases. If you want `prebuild` to always download binaries you can use `--download` instead of `--install`. Either way, if downloading fails for any reason, it will fallback to compiling the code. |
|
|
|
There's also support for `node-pre-gyp` style by utilizing the `binary` property in `package.json`. |
|
|
|
### Formatting urls |
|
|
|
The following placeholders can be used: |
|
|
|
* `{name}` or `{package_name}`: the package name taken from `package.json` |
|
* `{version}`: package version taken from `package.json` |
|
* `{major}`: major version taken from `version` |
|
* `{minor}`: minor version taken from `version` |
|
* `{patch}`: patch version taken from `version` |
|
* `{prerelease}`: prelease version taken from `version` |
|
* `{build}`: build version taken from `version` |
|
* `{abi}` or `{node_abi}`: ABI version of node/iojs taken from current `--target` or `process.version` if not specified, see `ABI` section below for more information |
|
* `{platform}`: platform taken from `--platform` or `process.platform` if not specified |
|
* `{arch}`: architecture taken from `--arch` or `process.arch` if not specified |
|
* `{libc}`: libc setting for alternative libc taken from `--libc` or LIBC env var or blank if not specified |
|
* `{configuration}`: `'Debug'` if `--debug` is specified, otherwise `'Release'` |
|
* `{module_name}`: taken from `binary.module_name` property from `package.json` |
|
|
|
## Create GitHub Token |
|
|
|
A GitHub token is needed for two reasons: |
|
|
|
* Create a GitHub release ([leveldown example](https://github.com/Level/leveldown/releases/tag/v1.4.4)) |
|
* Upload the prebuilt binaries to that release |
|
|
|
To create a token: |
|
|
|
* Go to [this page](https://github.com/settings/tokens) |
|
* Click the `Generate new token` button |
|
* Give the token a name and click the `Generate token` button, see below |
|
|
|
![create token](images/create-token.png) |
|
|
|
The default scopes should be fine. |
|
|
|
## Help |
|
|
|
``` |
|
$ prebuild -h |
|
prebuild [options] |
|
|
|
--path -p path (make a prebuild here) |
|
--target -t version (version to build or install for) |
|
--prebuild -b version (version to prebuild against) |
|
--all (prebuild for all known abi versions) |
|
--install (download when using npm, compile otherwise) |
|
--download -d [url] (download prebuilds, no url means github) |
|
--upload -u [gh-token] (upload prebuilds to github) |
|
--upload-all -u [gh-token] (upload all files from ./prebuilds folder to github) |
|
--preinstall -i script (run this script before prebuilding) |
|
--compile -c (compile your project using node-gyp) |
|
--no-compile (skip compile fallback when downloading) |
|
--abi (use provided abi rather than system abi) |
|
--libc (use provided libc rather than system default) |
|
--backend (specify build backend, default is 'node-gyp') |
|
--strip (strip debug information) |
|
--debug (set Debug or Release configuration) |
|
--verbose (log verbosely) |
|
--version (print prebuild version and exit) |
|
``` |
|
|
|
## JavaScript API |
|
|
|
```js |
|
var prebuild = require('prebuild') |
|
``` |
|
|
|
### .download(opts, cb) |
|
|
|
Options: |
|
|
|
- `.pkg` the parsed `package.json` |
|
- `.log` (optional) |
|
- `.nolocal` Don't check for cached builds (optional) |
|
- `.updateName` Function to update the binary name (optional) |
|
- `.path` Location of the module (default: `"."`) |
|
- `.abi` Node ABI version (default: `process.versions.modules`) |
|
- `.libc` OS libc (default: blank) |
|
- `.platform` OS platform (default: `process.platform`) |
|
- `.download` Precomputed url to download the binary from (optional) |
|
- `.all` (default: `false`) |
|
- `.force` (default: `false`) |
|
- `.proxy` (default: `process.env['HTTP_PROXY']`) |
|
- `.https-proxy` (default: `process.env['HTTP-PROXY']`)` |
|
|
|
Example: |
|
|
|
```js |
|
prebuild.download({ |
|
pkg: require('./package.json') |
|
}, function (err) { |
|
// ... |
|
}) |
|
``` |
|
|
|
### .build(opts, version, cb) |
|
|
|
Options: |
|
|
|
- `.log` (optional) |
|
- `.preinstall` (optional) |
|
- `.gyp` Provide a custom `node-gyp` instance (optional) |
|
- `.backend` Provide a custom `node-gyp` instance via string. Alternatives are `'node-gyp'` and `'node-ninja'` (optional, defaults to `'node-gyp'`) |
|
- `.args` Additional command line arguments to `node-gyp` (optional) |
|
- `.debug` Pass in `--debug` on command line to gyp backend (optional) |
|
|
|
Example: |
|
|
|
```js |
|
prebuild.build({}, version, function (err) { |
|
// ... |
|
}) |
|
``` |
|
### Global options: |
|
|
|
- `.debug` Download or build a debug build (default: `false`) |
|
- `.arch` Processor architecture (default: `process.arch`) |
|
|
|
## Develop `prebuild` |
|
|
|
If you want to hack on `prebuild` you need an environment to play around with. We recommend a setup similar |
|
to the following: |
|
|
|
* A fork of `prebuild` |
|
* A GitHub token (see above) |
|
* A native node module |
|
|
|
```bash |
|
$ git clone git@github.com:<your-nick>/prebuild |
|
$ cd prebuild && npm link && cd .. |
|
$ git clone git@github.com:<your-nick>/some-native-module |
|
``` |
|
|
|
Since you did `npm link` on `prebuild` it will be installed globally. Now you can go ahead and try things out. |
|
|
|
```bash |
|
$ cd some-native-module |
|
$ prebuild --all --strip -u <github-token> |
|
``` |
|
|
|
This command would: |
|
|
|
* Build `some-native-module` for all targets listed in `targets.js` and store them in `./prebuilds/` |
|
* Strip binaries from debug information |
|
* Create a release on GitHub, if needed |
|
* Upload all binaries to that release, if not already uploaded |
|
|
|
Before you commit your changes and send us a pull request, do run `npm test`. |
|
|
|
## License |
|
|
|
MIT
|
|
|