| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 | 
/** * 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'slog.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 = Gypvar 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})
 |