94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| 'use strict';
 | |
| 
 | |
| module.exports = exports;
 | |
| 
 | |
| const fs = require('fs');
 | |
| const path = require('path');
 | |
| const win = process.platform === 'win32';
 | |
| const existsSync = fs.existsSync || path.existsSync;
 | |
| const cp = require('child_process');
 | |
| 
 | |
| // try to build up the complete path to node-gyp
 | |
| /* priority:
 | |
|   - node-gyp on ENV:npm_config_node_gyp (https://github.com/npm/npm/pull/4887)
 | |
|   - node-gyp on NODE_PATH
 | |
|   - node-gyp inside npm on NODE_PATH (ignore on iojs)
 | |
|   - node-gyp inside npm beside node exe
 | |
| */
 | |
| function which_node_gyp() {
 | |
|   let node_gyp_bin;
 | |
|   if (process.env.npm_config_node_gyp) {
 | |
|     try {
 | |
|       node_gyp_bin = process.env.npm_config_node_gyp;
 | |
|       if (existsSync(node_gyp_bin)) {
 | |
|         return node_gyp_bin;
 | |
|       }
 | |
|     } catch (err) {
 | |
|       // do nothing
 | |
|     }
 | |
|   }
 | |
|   try {
 | |
|     const node_gyp_main = require.resolve('node-gyp'); // eslint-disable-line node/no-missing-require
 | |
|     node_gyp_bin = path.join(path.dirname(
 | |
|       path.dirname(node_gyp_main)),
 | |
|     'bin/node-gyp.js');
 | |
|     if (existsSync(node_gyp_bin)) {
 | |
|       return node_gyp_bin;
 | |
|     }
 | |
|   } catch (err) {
 | |
|     // do nothing
 | |
|   }
 | |
|   if (process.execPath.indexOf('iojs') === -1) {
 | |
|     try {
 | |
|       const npm_main = require.resolve('npm'); // eslint-disable-line node/no-missing-require
 | |
|       node_gyp_bin = path.join(path.dirname(
 | |
|         path.dirname(npm_main)),
 | |
|       'node_modules/node-gyp/bin/node-gyp.js');
 | |
|       if (existsSync(node_gyp_bin)) {
 | |
|         return node_gyp_bin;
 | |
|       }
 | |
|     } catch (err) {
 | |
|       // do nothing
 | |
|     }
 | |
|   }
 | |
|   const npm_base = path.join(path.dirname(
 | |
|     path.dirname(process.execPath)),
 | |
|   'lib/node_modules/npm/');
 | |
|   node_gyp_bin = path.join(npm_base, 'node_modules/node-gyp/bin/node-gyp.js');
 | |
|   if (existsSync(node_gyp_bin)) {
 | |
|     return node_gyp_bin;
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports.run_gyp = function(args, opts, callback) {
 | |
|   let shell_cmd = '';
 | |
|   const cmd_args = [];
 | |
|   if (opts.runtime && opts.runtime === 'node-webkit') {
 | |
|     shell_cmd = 'nw-gyp';
 | |
|     if (win) shell_cmd += '.cmd';
 | |
|   } else {
 | |
|     const node_gyp_path = which_node_gyp();
 | |
|     if (node_gyp_path) {
 | |
|       shell_cmd = process.execPath;
 | |
|       cmd_args.push(node_gyp_path);
 | |
|     } else {
 | |
|       shell_cmd = 'node-gyp';
 | |
|       if (win) shell_cmd += '.cmd';
 | |
|     }
 | |
|   }
 | |
|   const final_args = cmd_args.concat(args);
 | |
|   const cmd = cp.spawn(shell_cmd, final_args, { cwd: undefined, env: process.env, stdio: [0, 1, 2] });
 | |
|   cmd.on('error', (err) => {
 | |
|     if (err) {
 | |
|       return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + err + ')'));
 | |
|     }
 | |
|     callback(null, opts);
 | |
|   });
 | |
|   cmd.on('close', (code) => {
 | |
|     if (code && code !== 0) {
 | |
|       return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + code + ')'));
 | |
|     }
 | |
|     callback(null, opts);
 | |
|   });
 | |
| };
 |