| |
| /** |
| * Module exports. |
| */ |
| |
| module.exports = exports = gyp |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var fs = require('graceful-fs') |
| , path = require('path') |
| , nopt = require('nopt') |
| , log = require('npmlog') |
| , child_process = require('child_process') |
| , EE = require('events').EventEmitter |
| , inherits = require('util').inherits |
| , commands = [ |
| // Module build commands |
| 'build' |
| , 'clean' |
| , 'configure' |
| , 'rebuild' |
| // Development Header File management commands |
| , 'install' |
| , 'list' |
| , 'remove' |
| ] |
| , aliases = { |
| 'ls': 'list' |
| , 'rm': 'remove' |
| } |
| |
| // differentiate node-gyp's logs from npm's |
| log.heading = 'gyp' |
| |
| /** |
| * The `gyp` function. |
| */ |
| |
| function gyp () { |
| return new Gyp() |
| } |
| |
| function Gyp () { |
| var self = this |
| |
| this.devDir = '' |
| this.commands = {} |
| |
| commands.forEach(function (command) { |
| self.commands[command] = function (argv, callback) { |
| log.verbose('command', command, argv) |
| return require('./' + command)(self, argv, callback) |
| } |
| }) |
| } |
| inherits(Gyp, EE) |
| exports.Gyp = Gyp |
| var proto = Gyp.prototype |
| |
| /** |
| * Export the contents of the package.json. |
| */ |
| |
| proto.package = require('../package') |
| |
| /** |
| * nopt configuration definitions |
| */ |
| |
| proto.configDefs = { |
| help: Boolean // everywhere |
| , arch: String // 'configure' |
| , cafile: String // 'install' |
| , debug: Boolean // 'build' |
| , directory: String // bin |
| , make: String // 'build' |
| , msvs_version: String // 'configure' |
| , ensure: Boolean // 'install' |
| , solution: String // 'build' (windows only) |
| , proxy: String // 'install' |
| , devdir: String // everywhere |
| , nodedir: String // 'configure' |
| , loglevel: String // everywhere |
| , python: String // 'configure' |
| , 'dist-url': String // 'install' |
| , 'tarball': String // 'install' |
| , jobs: String // 'build' |
| , thin: String // 'configure' |
| } |
| |
| /** |
| * nopt shorthands |
| */ |
| |
| proto.shorthands = { |
| release: '--no-debug' |
| , C: '--directory' |
| , debug: '--debug' |
| , j: '--jobs' |
| , silly: '--loglevel=silly' |
| , verbose: '--loglevel=verbose' |
| , silent: '--loglevel=silent' |
| } |
| |
| /** |
| * expose the command aliases for the bin file to use. |
| */ |
| |
| proto.aliases = aliases |
| |
| /** |
| * Parses the given argv array and sets the 'opts', |
| * 'argv' and 'command' properties. |
| */ |
| |
| proto.parseArgv = function parseOpts (argv) { |
| this.opts = nopt(this.configDefs, this.shorthands, argv) |
| this.argv = this.opts.argv.remain.slice() |
| |
| var commands = this.todo = [] |
| |
| // create a copy of the argv array with aliases mapped |
| argv = this.argv.map(function (arg) { |
| // is this an alias? |
| if (arg in this.aliases) { |
| arg = this.aliases[arg] |
| } |
| return arg |
| }, this) |
| |
| // process the mapped args into "command" objects ("name" and "args" props) |
| argv.slice().forEach(function (arg) { |
| if (arg in this.commands) { |
| var args = argv.splice(0, argv.indexOf(arg)) |
| argv.shift() |
| if (commands.length > 0) { |
| commands[commands.length - 1].args = args |
| } |
| commands.push({ name: arg, args: [] }) |
| } |
| }, this) |
| if (commands.length > 0) { |
| commands[commands.length - 1].args = argv.splice(0) |
| } |
| |
| // support for inheriting config env variables from npm |
| var npm_config_prefix = 'npm_config_' |
| Object.keys(process.env).forEach(function (name) { |
| if (name.indexOf(npm_config_prefix) !== 0) return |
| var val = process.env[name] |
| if (name === npm_config_prefix + 'loglevel') { |
| log.level = val |
| } else { |
| // add the user-defined options to the config |
| name = name.substring(npm_config_prefix.length) |
| // gyp@741b7f1 enters an infinite loop when it encounters |
| // zero-length options so ensure those don't get through. |
| if (name) this.opts[name] = val |
| } |
| }, this) |
| |
| if (this.opts.loglevel) { |
| log.level = this.opts.loglevel |
| } |
| log.resume() |
| } |
| |
| /** |
| * Spawns a child process and emits a 'spawn' event. |
| */ |
| |
| proto.spawn = function spawn (command, args, opts) { |
| if (!opts) opts = {} |
| if (!opts.silent && !opts.stdio) { |
| opts.stdio = [ 0, 1, 2 ] |
| } |
| var cp = child_process.spawn(command, args, opts) |
| log.info('spawn', command) |
| log.info('spawn args', args) |
| return cp |
| } |
| |
| /** |
| * Returns the usage instructions for node-gyp. |
| */ |
| |
| proto.usage = function usage () { |
| var str = [ |
| '' |
| , ' Usage: node-gyp <command> [options]' |
| , '' |
| , ' where <command> is one of:' |
| , commands.map(function (c) { |
| return ' - ' + c + ' - ' + require('./' + c).usage |
| }).join('\n') |
| , '' |
| , 'node-gyp@' + this.version + ' ' + path.resolve(__dirname, '..') |
| , 'node@' + process.versions.node |
| ].join('\n') |
| return str |
| } |
| |
| /** |
| * Version number getter. |
| */ |
| |
| Object.defineProperty(proto, 'version', { |
| get: function () { |
| return this.package.version |
| } |
| , enumerable: true |
| }) |
| |