src/plugman/variable-merge.js
function mergeVariables (plugin_dir, platform, options) {
    options.pluginInfoProvider = options.pluginInfoProvider || new PluginInfoProvider();
    var pluginInfoProvider = options.pluginInfoProvider;
    var pluginInfo = pluginInfoProvider.get(plugin_dir);
    var filtered_variables = {};

    var prefs = pluginInfo.getPreferences(platform);
    var keys = underscore.keys(prefs);

    options.cli_variables = options.cli_variables || {};
    var missing_vars = underscore.difference(keys, Object.keys(options.cli_variables));

    underscore.each(missing_vars, function (_key) {
        var def = prefs[_key];
        if (def) {
            options.cli_variables[_key] = def;
        }
    });

    // test missing vars once again after having default
    missing_vars = underscore.difference(keys, Object.keys(options.cli_variables));

    if (missing_vars.length > 0) {
        throw new Error('Variable(s) missing: ' + missing_vars.join(', '));
    }

    filtered_variables = underscore.pick(options.cli_variables, keys);
    return filtered_variables;
}
function mergeVariables (plugin_dir, platform, options) {
    options.pluginInfoProvider = options.pluginInfoProvider || new PluginInfoProvider();
    var pluginInfoProvider = options.pluginInfoProvider;
    var pluginInfo = pluginInfoProvider.get(plugin_dir);
    var filtered_variables = {};

    var prefs = pluginInfo.getPreferences(platform);
    var keys = underscore.keys(prefs);

    options.cli_variables = options.cli_variables || {};
    var missing_vars = underscore.difference(keys, Object.keys(options.cli_variables));

    underscore.each(missing_vars, function (_key) {
        var def = prefs[_key];
        if (def) {
            options.cli_variables[_key] = def;
        }
    });

    // test missing vars once again after having default
    missing_vars = underscore.difference(keys, Object.keys(options.cli_variables));

    if (missing_vars.length > 0) {
        throw new Error('Variable(s) missing: ' + missing_vars.join(', '));
    }

    filtered_variables = underscore.pick(options.cli_variables, keys);
    return filtered_variables;
}
/*
At this point, cli and config vars have already merged.
Merges those vars (cli and config) with plugin.xml variables.

@param   {string}    plugin directory
@param   {string}    platform
@param   {object}    options

@return  {object}    list of filtered variables