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.
		
		
		
		
		
			
		
			
				
					103 lines
				
				3.4 KiB
			
		
		
			
		
	
	
					103 lines
				
				3.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | module.exports = exports = handle_gyp_opts; | ||
|  | 
 | ||
|  | const versioning = require('./versioning.js'); | ||
|  | const napi = require('./napi.js'); | ||
|  | 
 | ||
|  | /* | ||
|  | 
 | ||
|  | Here we gather node-pre-gyp generated options (from versioning) and pass them along to node-gyp. | ||
|  | 
 | ||
|  | We massage the args and options slightly to account for differences in what commands mean between | ||
|  | node-pre-gyp and node-gyp (e.g. see the difference between "build" and "rebuild" below) | ||
|  | 
 | ||
|  | Keep in mind: the values inside `argv` and `gyp.opts` below are different depending on whether | ||
|  | node-pre-gyp is called directory, or if it is called in a `run-script` phase of npm. | ||
|  | 
 | ||
|  | We also try to preserve any command line options that might have been passed to npm or node-pre-gyp. | ||
|  | But this is fairly difficult without passing way to much through. For example `gyp.opts` contains all | ||
|  | the process.env and npm pushes a lot of variables into process.env which node-pre-gyp inherits. So we have | ||
|  | to be very selective about what we pass through. | ||
|  | 
 | ||
|  | For example: | ||
|  | 
 | ||
|  | `npm install --build-from-source` will give: | ||
|  | 
 | ||
|  | argv == [ 'rebuild' ] | ||
|  | gyp.opts.argv == { remain: [ 'install' ], | ||
|  |   cooked: [ 'install', '--fallback-to-build' ], | ||
|  |   original: [ 'install', '--fallback-to-build' ] } | ||
|  | 
 | ||
|  | `./bin/node-pre-gyp build` will give: | ||
|  | 
 | ||
|  | argv == [] | ||
|  | gyp.opts.argv == { remain: [ 'build' ], | ||
|  |   cooked: [ 'build' ], | ||
|  |   original: [ '-C', 'test/app1', 'build' ] } | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | // select set of node-pre-gyp versioning info
 | ||
|  | // to share with node-gyp
 | ||
|  | const share_with_node_gyp = [ | ||
|  |   'module', | ||
|  |   'module_name', | ||
|  |   'module_path', | ||
|  |   'napi_version', | ||
|  |   'node_abi_napi', | ||
|  |   'napi_build_version', | ||
|  |   'node_napi_label' | ||
|  | ]; | ||
|  | 
 | ||
|  | function handle_gyp_opts(gyp, argv, callback) { | ||
|  | 
 | ||
|  |   // Collect node-pre-gyp specific variables to pass to node-gyp
 | ||
|  |   const node_pre_gyp_options = []; | ||
|  |   // generate custom node-pre-gyp versioning info
 | ||
|  |   const napi_build_version = napi.get_napi_build_version_from_command_args(argv); | ||
|  |   const opts = versioning.evaluate(gyp.package_json, gyp.opts, napi_build_version); | ||
|  |   share_with_node_gyp.forEach((key) => { | ||
|  |     const val = opts[key]; | ||
|  |     if (val) { | ||
|  |       node_pre_gyp_options.push('--' + key + '=' + val); | ||
|  |     } else if (key === 'napi_build_version') { | ||
|  |       node_pre_gyp_options.push('--' + key + '=0'); | ||
|  |     } else { | ||
|  |       if (key !== 'napi_version' && key !== 'node_abi_napi') | ||
|  |         return callback(new Error('Option ' + key + ' required but not found by node-pre-gyp')); | ||
|  |     } | ||
|  |   }); | ||
|  | 
 | ||
|  |   // Collect options that follow the special -- which disables nopt parsing
 | ||
|  |   const unparsed_options = []; | ||
|  |   let double_hyphen_found = false; | ||
|  |   gyp.opts.argv.original.forEach((opt) => { | ||
|  |     if (double_hyphen_found) { | ||
|  |       unparsed_options.push(opt); | ||
|  |     } | ||
|  |     if (opt === '--') { | ||
|  |       double_hyphen_found = true; | ||
|  |     } | ||
|  |   }); | ||
|  | 
 | ||
|  |   // We try respect and pass through remaining command
 | ||
|  |   // line options (like --foo=bar) to node-gyp
 | ||
|  |   const cooked = gyp.opts.argv.cooked; | ||
|  |   const node_gyp_options = []; | ||
|  |   cooked.forEach((value) => { | ||
|  |     if (value.length > 2 && value.slice(0, 2) === '--') { | ||
|  |       const key = value.slice(2); | ||
|  |       const val = cooked[cooked.indexOf(value) + 1]; | ||
|  |       if (val && val.indexOf('--') === -1) { // handle '--foo=bar' or ['--foo','bar']
 | ||
|  |         node_gyp_options.push('--' + key + '=' + val); | ||
|  |       } else { // pass through --foo
 | ||
|  |         node_gyp_options.push(value); | ||
|  |       } | ||
|  |     } | ||
|  |   }); | ||
|  | 
 | ||
|  |   const result = { 'opts': opts, 'gyp': node_gyp_options, 'pre': node_pre_gyp_options, 'unparsed': unparsed_options }; | ||
|  |   return callback(null, result); | ||
|  | } |