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.
		
		
		
		
		
			
		
			
				
					94 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					94 lines
				
				2.7 KiB
			| 
											3 years ago
										 | '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); | ||
|  |   }); | ||
|  | }; |