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.
		
		
		
		
		
			
		
			
				
					
					
						
							216 lines
						
					
					
						
							4.8 KiB
						
					
					
				
			
		
		
	
	
							216 lines
						
					
					
						
							4.8 KiB
						
					
					
				
 | 
						|
/** | 
						|
 * 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 | 
						|
}) | 
						|
 | 
						|
 |