"use strict"; module.exports = exports = handle_gyp_opts; var fs = require('fs'); var versioning = require('./versioning.js'); var 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 var 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 var node_pre_gyp_options = []; // generate custom node-pre-gyp versioning info var napi_build_version = napi.get_napi_build_version_from_command_args(argv); var opts = versioning.evaluate(JSON.parse(fs.readFileSync('./package.json')), gyp.opts, napi_build_version); share_with_node_gyp.forEach(function(key) { var 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 var unparsed_options = []; var double_hyphen_found = false; gyp.opts.argv.original.forEach(function(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 var cooked = gyp.opts.argv.cooked; var node_gyp_options = []; cooked.forEach(function(value) { if (value.length > 2 && value.slice(0,2) == '--') { var key = value.slice(2); var 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); } } }); var result = {'opts':opts,'gyp':node_gyp_options,'pre':node_pre_gyp_options,'unparsed':unparsed_options}; return callback(null,result); }