diff options
Diffstat (limited to 'node_modules/node-gyp/lib/configure.js')
-rw-r--r-- | node_modules/node-gyp/lib/configure.js | 74 |
1 files changed, 61 insertions, 13 deletions
diff --git a/node_modules/node-gyp/lib/configure.js b/node_modules/node-gyp/lib/configure.js index 4e0652961..4543bce7d 100644 --- a/node_modules/node-gyp/lib/configure.js +++ b/node_modules/node-gyp/lib/configure.js @@ -1,5 +1,6 @@ module.exports = exports = configure -module.exports.test = { findPython: findPython } +module.exports.test = { findAccessibleSync: findAccessibleSync, + findPython: findPython } /** * Module dependencies. @@ -7,7 +8,6 @@ module.exports.test = { findPython: findPython } var fs = require('graceful-fs') , path = require('path') - , glob = require('glob') , log = require('npmlog') , osenv = require('osenv') , which = require('which') @@ -21,6 +21,7 @@ var fs = require('graceful-fs') , execFile = cp.execFile , win = process.platform == 'win32' , findNodeDirectory = require('./find-node-directory') + , msgFormat = require('util').format exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module' @@ -227,22 +228,21 @@ function configure (gyp, argv, callback) { // - the out/Release directory // - the out/Debug directory // - the root directory - var node_exp_file = '' + var node_exp_file = undefined if (process.platform === 'aix') { var node_root_dir = findNodeDirectory() var candidates = ['include/node/node.exp', 'out/Release/node.exp', 'out/Debug/node.exp', 'node.exp'] - for (var next = 0; next < candidates.length; next++) { - node_exp_file = path.resolve(node_root_dir, candidates[next]) - try { - fs.accessSync(node_exp_file, fs.R_OK) - // exp file found, stop looking - break - } catch (exception) { - // this candidate was not found or not readable, do nothing - } + var logprefix = 'find exports file' + node_exp_file = findAccessibleSync(logprefix, node_root_dir, candidates) + if (node_exp_file !== undefined) { + log.verbose(logprefix, 'Found exports file: %s', node_exp_file) + } else { + var msg = msgFormat('Could not find node.exp file in %s', node_root_dir) + log.error(logprefix, 'Could not find exports file') + return callback(new Error(msg)) } } @@ -311,6 +311,29 @@ function configure (gyp, argv, callback) { } +/** + * Returns the first file or directory from an array of candidates that is + * readable by the current user, or undefined if none of the candidates are + * readable. + */ +function findAccessibleSync (logprefix, dir, candidates) { + for (var next = 0; next < candidates.length; next++) { + var candidate = path.resolve(dir, candidates[next]) + try { + var fd = fs.openSync(candidate, 'r') + } catch (e) { + // this candidate was not found or not readable, do nothing + log.silly(logprefix, 'Could not open %s: %s', candidate, e.message) + continue + } + fs.closeSync(fd) + log.silly(logprefix, 'Found readable %s', candidate) + return candidate + } + + return undefined +} + function findPython (python, callback) { checkPython() @@ -325,7 +348,7 @@ function findPython (python, callback) { return checkPython() } if (win) { - guessPython() + checkPythonLauncher() } else { failNoPython() } @@ -340,6 +363,31 @@ function findPython (python, callback) { }) } + // Distributions of Python on Windows by default install with the "py.exe" + // Python launcher which is more likely to exist than the Python executable + // being in the $PATH. + // Because the Python launcher supports all versions of Python, we have to + // explicitly request a Python 2 version. This is done by supplying "-2" as + // the first command line argument. Since "py.exe -2" would be an invalid + // executable for "execFile", we have to use the launcher to figure out + // where the actual "python.exe" executable is located. + function checkPythonLauncher () { + log.verbose('could not find "' + python + '". checking python launcher') + var env = extend({}, process.env) + env.TERM = 'dumb' + + var launcherArgs = ['-2', '-c', 'import sys; print sys.executable'] + execFile('py.exe', launcherArgs, { env: env }, function (err, stdout) { + if (err) { + guessPython() + return + } + python = stdout.trim() + log.verbose('check python launcher', 'python executable found: %j', python) + checkPythonVersion() + }) + } + // Called on Windows when "python" isn't available in the current $PATH. // We're gonna check if "%SystemDrive%\python27\python.exe" exists. function guessPython () { |