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.

53 lines
1.3 KiB

var gypinstall = require('./gypinstall')
var util = require('./util')
var error = require('./error')
function getAbi (opts, version, cb) {
var log = opts.log
var install = opts.install || gypinstall
version = version.replace('v', '')
tryReadFiles(function (err, abi) {
if (err && err.code === 'ENOENT') {
return install({
log: log,
force: true,
backend: opts.backend
}, version, function (err) {
if (err) return cb(err)
tryReadFiles(function (err, abi) {
if (!err || err.code !== 'ENOENT') return cb(err, abi)
cb(error.missingHeaders())
})
})
}
cb(err, abi)
})
function tryReadFiles (readCb) {
util.readGypFile({
backend: opts.backend,
version: version,
file: 'node_version.h'
}, function (err, a) {
if (err) return readCb(err)
util.readGypFile({
backend: opts.backend,
version: version,
file: 'node.h'
}, function (err, b) {
if (err) return readCb(err)
var abi = parse(a) || parse(b)
if (!abi) return readCb(error.noAbi(version))
readCb(null, abi)
})
})
}
function parse (file) {
var res = file.match(/#define\s+NODE_MODULE_VERSION\s+\(?(\d+)/)
return (res && res[1])
}
}
module.exports = getAbi