Built motion from commit 6a09e18b.|2.6.11
[motion2.git] / legacy-libs / node-pre-gyp / lib / util / handle_gyp_opts.js
diff --git a/legacy-libs/node-pre-gyp/lib/util/handle_gyp_opts.js b/legacy-libs/node-pre-gyp/lib/util/handle_gyp_opts.js
new file mode 100644 (file)
index 0000000..9f76ea3
--- /dev/null
@@ -0,0 +1,103 @@
+"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);
+}