mirror of
https://github.com/electron/node-gyp.git
synced 2025-08-15 12:58:19 +02:00
use process.release, make aware of io.js & node v4 differences
PR-URL: https://github.com/nodejs/node-gyp/pull/711 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
1ea7ed01f4
commit
9e9df66a06
10 changed files with 565 additions and 120 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
|||
gyp/test
|
||||
node_modules
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
'product_prefix': '',
|
||||
|
||||
'include_dirs': [
|
||||
'<(node_root_dir)/include/node',
|
||||
'<(node_root_dir)/src',
|
||||
'<(node_root_dir)/deps/uv/include',
|
||||
'<(node_root_dir)/deps/v8/include'
|
||||
|
@ -78,7 +79,7 @@
|
|||
'-luuid.lib',
|
||||
'-lodbc32.lib',
|
||||
'-lDelayImp.lib',
|
||||
'-l"<(node_root_dir)/$(ConfigurationName)/node.lib"'
|
||||
'-l"<(node_root_dir)/$(ConfigurationName)/<(node_lib_file)"'
|
||||
],
|
||||
'msvs_disabled_warnings': [
|
||||
# warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
|
||||
|
|
11
lib/build.js
11
lib/build.js
|
@ -13,13 +13,14 @@ var fs = require('graceful-fs')
|
|||
, which = require('which')
|
||||
, mkdirp = require('mkdirp')
|
||||
, exec = require('child_process').exec
|
||||
, processRelease = require('./process-release')
|
||||
, win = process.platform == 'win32'
|
||||
|
||||
exports.usage = 'Invokes `' + (win ? 'msbuild' : 'make') + '` and builds the module'
|
||||
|
||||
function build (gyp, argv, callback) {
|
||||
|
||||
var makeCommand = gyp.opts.make || process.env.MAKE
|
||||
var release = processRelease(argv, gyp, process.version, process.release)
|
||||
, makeCommand = gyp.opts.make || process.env.MAKE
|
||||
|| (process.platform.indexOf('bsd') != -1 && process.platform.indexOf('kfreebsd') == -1 ? 'gmake' : 'make')
|
||||
, command = win ? 'msbuild' : makeCommand
|
||||
, buildDir = path.resolve('build')
|
||||
|
@ -181,15 +182,15 @@ function build (gyp, argv, callback) {
|
|||
if (!win || !copyDevLib) return doBuild()
|
||||
|
||||
var buildDir = path.resolve(nodeDir, buildType)
|
||||
, archNodeLibPath = path.resolve(nodeDir, arch, 'node.lib')
|
||||
, buildNodeLibPath = path.resolve(buildDir, 'node.lib')
|
||||
, archNodeLibPath = path.resolve(nodeDir, arch, release.name + '.lib')
|
||||
, buildNodeLibPath = path.resolve(buildDir, release.name + '.lib')
|
||||
|
||||
mkdirp(buildDir, function (err, isNew) {
|
||||
if (err) return callback(err)
|
||||
log.verbose('"' + buildType + '" dir needed to be created?', isNew)
|
||||
var rs = fs.createReadStream(archNodeLibPath)
|
||||
, ws = fs.createWriteStream(buildNodeLibPath)
|
||||
log.verbose('copying "node.lib" for ' + arch, buildNodeLibPath)
|
||||
log.verbose('copying "' + release.name + '.lib" for ' + arch, buildNodeLibPath)
|
||||
rs.pipe(ws)
|
||||
rs.on('error', callback)
|
||||
ws.on('error', callback)
|
||||
|
|
|
@ -15,6 +15,7 @@ var fs = require('graceful-fs')
|
|||
, cp = require('child_process')
|
||||
, PathArray = require('path-array')
|
||||
, extend = require('util')._extend
|
||||
, processRelease = require('./process-release')
|
||||
, spawn = cp.spawn
|
||||
, execFile = cp.execFile
|
||||
, win = process.platform == 'win32'
|
||||
|
@ -28,6 +29,7 @@ function configure (gyp, argv, callback) {
|
|||
, configNames = [ 'config.gypi', 'common.gypi' ]
|
||||
, configs = []
|
||||
, nodeDir
|
||||
, release = processRelease(argv, gyp, process.version, process.release)
|
||||
|
||||
checkPython()
|
||||
|
||||
|
@ -135,35 +137,25 @@ function configure (gyp, argv, callback) {
|
|||
|
||||
} else {
|
||||
// if no --nodedir specified, ensure node dependencies are installed
|
||||
var version
|
||||
var versionStr
|
||||
|
||||
if (gyp.opts.target) {
|
||||
if ('v' + release.version !== process.version) {
|
||||
// if --target was given, then determine a target version to compile for
|
||||
versionStr = gyp.opts.target
|
||||
log.verbose('get node dir', 'compiling against --target node version: %s', versionStr)
|
||||
log.verbose('get node dir', 'compiling against --target node version: %s', release.version)
|
||||
} else {
|
||||
// if no --target was specified then use the current host node version
|
||||
versionStr = process.version
|
||||
log.verbose('get node dir', 'no --target version specified, falling back to host node version: %s', versionStr)
|
||||
log.verbose('get node dir', 'no --target version specified, falling back to host node version: %s', release.version)
|
||||
}
|
||||
|
||||
// make sure we have a valid version
|
||||
try {
|
||||
version = semver.parse(versionStr)
|
||||
} catch (e) {
|
||||
return callback(e)
|
||||
}
|
||||
if (!version) {
|
||||
return callback(new Error('Invalid version number: ' + versionStr))
|
||||
if (!release.semver) {
|
||||
return callback(new Error('Invalid version number: ' + release.version))
|
||||
}
|
||||
|
||||
// ensure that the target node version's dev files are installed
|
||||
gyp.opts.ensure = true
|
||||
gyp.commands.install([ versionStr ], function (err, version) {
|
||||
gyp.commands.install([ release.version ], function (err, version) {
|
||||
if (err) return callback(err)
|
||||
log.verbose('get node dir', 'target node version installed:', version)
|
||||
nodeDir = path.resolve(gyp.devDir, version)
|
||||
log.verbose('get node dir', 'target node version installed:', release.versionDir)
|
||||
nodeDir = path.resolve(gyp.devDir, release.versionDir)
|
||||
createBuildDir()
|
||||
})
|
||||
}
|
||||
|
@ -310,42 +302,49 @@ function configure (gyp, argv, callback) {
|
|||
// this logic ported from the old `gyp_addon` python file
|
||||
var gyp_script = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
|
||||
var addon_gypi = path.resolve(__dirname, '..', 'addon.gypi')
|
||||
var common_gypi = path.resolve(nodeDir, 'common.gypi')
|
||||
var output_dir = 'build'
|
||||
if (win) {
|
||||
// Windows expects an absolute path
|
||||
output_dir = buildDir
|
||||
}
|
||||
var nodeGypDir = path.resolve(__dirname, '..')
|
||||
var common_gypi = path.resolve(nodeDir, 'include/node/common.gypi')
|
||||
fs.stat(common_gypi, function (err, stat) {
|
||||
if (err || !stat.isFile()) {
|
||||
common_gypi = path.resolve(nodeDir, 'common.gypi')
|
||||
}
|
||||
|
||||
argv.push('-I', addon_gypi)
|
||||
argv.push('-I', common_gypi)
|
||||
argv.push('-Dlibrary=shared_library')
|
||||
argv.push('-Dvisibility=default')
|
||||
argv.push('-Dnode_root_dir=' + nodeDir)
|
||||
argv.push('-Dnode_gyp_dir=' + nodeGypDir)
|
||||
argv.push('-Dmodule_root_dir=' + process.cwd())
|
||||
argv.push('--depth=.')
|
||||
argv.push('--no-parallel')
|
||||
var output_dir = 'build'
|
||||
if (win) {
|
||||
// Windows expects an absolute path
|
||||
output_dir = buildDir
|
||||
}
|
||||
var nodeGypDir = path.resolve(__dirname, '..')
|
||||
|
||||
// tell gyp to write the Makefile/Solution files into output_dir
|
||||
argv.push('--generator-output', output_dir)
|
||||
argv.push('-I', addon_gypi)
|
||||
argv.push('-I', common_gypi)
|
||||
argv.push('-Dlibrary=shared_library')
|
||||
argv.push('-Dvisibility=default')
|
||||
argv.push('-Dnode_root_dir=' + nodeDir)
|
||||
argv.push('-Dnode_gyp_dir=' + nodeGypDir)
|
||||
argv.push('-Dnode_lib_file=' + release.name + '.lib')
|
||||
argv.push('-Dmodule_root_dir=' + process.cwd())
|
||||
argv.push('--depth=.')
|
||||
argv.push('--no-parallel')
|
||||
|
||||
// tell make to write its output into the same dir
|
||||
argv.push('-Goutput_dir=.')
|
||||
// tell gyp to write the Makefile/Solution files into output_dir
|
||||
argv.push('--generator-output', output_dir)
|
||||
|
||||
// enforce use of the "binding.gyp" file
|
||||
argv.unshift('binding.gyp')
|
||||
// tell make to write its output into the same dir
|
||||
argv.push('-Goutput_dir=.')
|
||||
|
||||
// execute `gyp` from the current target nodedir
|
||||
argv.unshift(gyp_script)
|
||||
// enforce use of the "binding.gyp" file
|
||||
argv.unshift('binding.gyp')
|
||||
|
||||
// make sure python uses files that came with this particular node package
|
||||
var pypath = new PathArray(process.env, 'PYTHONPATH')
|
||||
pypath.unshift(path.join(__dirname, '..', 'gyp', 'pylib'))
|
||||
// execute `gyp` from the current target nodedir
|
||||
argv.unshift(gyp_script)
|
||||
|
||||
var cp = gyp.spawn(python, argv)
|
||||
cp.on('exit', onCpExit)
|
||||
// make sure python uses files that came with this particular node package
|
||||
var pypath = new PathArray(process.env, 'PYTHONPATH')
|
||||
pypath.unshift(path.join(__dirname, '..', 'gyp', 'pylib'))
|
||||
|
||||
var cp = gyp.spawn(python, argv)
|
||||
cp.on('exit', onCpExit)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
101
lib/install.js
101
lib/install.js
|
@ -20,10 +20,13 @@ var fs = require('graceful-fs')
|
|||
, request = require('request')
|
||||
, minimatch = require('minimatch')
|
||||
, mkdir = require('mkdirp')
|
||||
, processRelease = require('./process-release')
|
||||
, win = process.platform == 'win32'
|
||||
|
||||
function install (gyp, argv, callback) {
|
||||
|
||||
var release = processRelease(argv, gyp, process.version, process.release)
|
||||
|
||||
// ensure no double-callbacks happen
|
||||
function cb (err) {
|
||||
if (cb.done) return
|
||||
|
@ -31,34 +34,29 @@ function install (gyp, argv, callback) {
|
|||
if (err) {
|
||||
log.warn('install', 'got an error, rolling back install')
|
||||
// roll-back the install if anything went wrong
|
||||
gyp.commands.remove([ version ], function (err2) {
|
||||
gyp.commands.remove([ release.versionDir ], function (err2) {
|
||||
callback(err)
|
||||
})
|
||||
} else {
|
||||
callback(null, version)
|
||||
callback(null, release.version)
|
||||
}
|
||||
}
|
||||
|
||||
var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'https://nodejs.org/dist'
|
||||
|
||||
|
||||
// Determine which node dev files version we are installing
|
||||
var versionStr = argv[0] || gyp.opts.target || process.version
|
||||
log.verbose('install', 'input version string %j', versionStr)
|
||||
log.verbose('install', 'input version string %j', release.version)
|
||||
|
||||
// parse the version to normalize and ensure it's valid
|
||||
var version = semver.parse(versionStr)
|
||||
if (!version) {
|
||||
return callback(new Error('Invalid version number: ' + versionStr))
|
||||
if (!release.semver) {
|
||||
return callback(new Error('Invalid version number: ' + release.version))
|
||||
}
|
||||
|
||||
if (semver.lt(versionStr, '0.8.0')) {
|
||||
return callback(new Error('Minimum target version is `0.8.0` or greater. Got: ' + versionStr))
|
||||
if (semver.lt(release.version, '0.8.0')) {
|
||||
return callback(new Error('Minimum target version is `0.8.0` or greater. Got: ' + release.version))
|
||||
}
|
||||
|
||||
// 0.x.y-pre versions are not published yet and cannot be installed. Bail.
|
||||
if (version.prerelease[0] === 'pre') {
|
||||
log.verbose('detected "pre" node version', versionStr)
|
||||
if (release.semver.prerelease[0] === 'pre') {
|
||||
log.verbose('detected "pre" node version', release.version)
|
||||
if (gyp.opts.nodedir) {
|
||||
log.verbose('--nodedir flag was passed; skipping install', gyp.opts.nodedir)
|
||||
callback()
|
||||
|
@ -69,14 +67,10 @@ function install (gyp, argv, callback) {
|
|||
}
|
||||
|
||||
// flatten version into String
|
||||
version = version.version
|
||||
log.verbose('install', 'installing version: %s', version)
|
||||
|
||||
// distributions starting with 0.10.0 contain sha256 checksums
|
||||
var checksumAlgo = semver.gte(version, '0.10.0') ? 'sha256' : 'sha1'
|
||||
log.verbose('install', 'installing version: %s', release.versionDir)
|
||||
|
||||
// the directory where the dev files will be installed
|
||||
var devDir = path.resolve(gyp.devDir, version)
|
||||
var devDir = path.resolve(gyp.devDir, release.versionDir)
|
||||
|
||||
// If '--ensure' was passed, then don't *always* install the version;
|
||||
// check if it is already installed, and only install when needed
|
||||
|
@ -85,7 +79,7 @@ function install (gyp, argv, callback) {
|
|||
fs.stat(devDir, function (err, stat) {
|
||||
if (err) {
|
||||
if (err.code == 'ENOENT') {
|
||||
log.verbose('install', 'version not already installed, continuing with install', version)
|
||||
log.verbose('install', 'version not already installed, continuing with install', release.version)
|
||||
go()
|
||||
} else if (err.code == 'EACCES') {
|
||||
eaccesFallback()
|
||||
|
@ -156,7 +150,7 @@ function install (gyp, argv, callback) {
|
|||
}
|
||||
|
||||
function getContentSha(res, callback) {
|
||||
var shasum = crypto.createHash(checksumAlgo)
|
||||
var shasum = crypto.createHash(release.checksumAlgo)
|
||||
res.on('data', function (chunk) {
|
||||
shasum.update(chunk)
|
||||
}).on('end', function () {
|
||||
|
@ -184,9 +178,8 @@ function install (gyp, argv, callback) {
|
|||
}
|
||||
|
||||
// now download the node tarball
|
||||
var tarPath = gyp.opts['tarball']
|
||||
var tarballUrl = tarPath ? tarPath : distUrl + '/v' + version + '/node-v' + version + '.tar.gz'
|
||||
, badDownload = false
|
||||
var tarPath = gyp.opts.tarball
|
||||
var badDownload = false
|
||||
, extractCount = 0
|
||||
, gunzip = zlib.createGunzip()
|
||||
, extracter = tar.Extract({ path: devDir, strip: 1, filter: isValid })
|
||||
|
@ -220,12 +213,12 @@ function install (gyp, argv, callback) {
|
|||
// download the tarball, gunzip and extract!
|
||||
|
||||
if (tarPath) {
|
||||
var input = fs.createReadStream(tarballUrl)
|
||||
var input = fs.createReadStream(tarPath)
|
||||
input.pipe(gunzip).pipe(extracter)
|
||||
return
|
||||
}
|
||||
|
||||
var req = download(tarballUrl)
|
||||
var req = download(release.tarballUrl)
|
||||
if (!req) return
|
||||
|
||||
// something went wrong downloading the tarball?
|
||||
|
@ -248,12 +241,12 @@ function install (gyp, argv, callback) {
|
|||
req.on('response', function (res) {
|
||||
if (res.statusCode !== 200) {
|
||||
badDownload = true
|
||||
cb(new Error(res.statusCode + ' response downloading ' + tarballUrl))
|
||||
cb(new Error(res.statusCode + ' response downloading ' + release.tarballUrl))
|
||||
return
|
||||
}
|
||||
// content checksum
|
||||
getContentSha(res, function (_, checksum) {
|
||||
var filename = path.basename(tarballUrl).trim()
|
||||
var filename = path.basename(release.tarballUrl).trim()
|
||||
contentShasums[filename] = checksum
|
||||
log.verbose('content checksum', filename, checksum)
|
||||
})
|
||||
|
@ -314,13 +307,11 @@ function install (gyp, argv, callback) {
|
|||
}
|
||||
|
||||
function downloadShasums(done) {
|
||||
var shasumsFile = (checksumAlgo === 'sha256') ? 'SHASUMS256.txt' : 'SHASUMS.txt'
|
||||
log.verbose('check download content checksum, need to download `' + shasumsFile + '`...')
|
||||
var shasumsPath = path.resolve(devDir, shasumsFile)
|
||||
, shasumsUrl = distUrl + '/v' + version + '/' + shasumsFile
|
||||
log.verbose('check download content checksum, need to download `' + release.shasumsFile + '`...')
|
||||
var shasumsPath = path.resolve(devDir, release.shasumsFile)
|
||||
|
||||
log.verbose('checksum url', shasumsUrl)
|
||||
var req = download(shasumsUrl)
|
||||
log.verbose('checksum url', release.shasumsUrl)
|
||||
var req = download(release.shasumsUrl)
|
||||
if (!req) return
|
||||
req.on('error', done)
|
||||
req.on('response', function (res) {
|
||||
|
@ -351,39 +342,37 @@ function install (gyp, argv, callback) {
|
|||
}
|
||||
|
||||
function downloadNodeLib (done) {
|
||||
log.verbose('on Windows; need to download `node.lib`...')
|
||||
log.verbose('on Windows; need to download `' + release.name + '.lib`...')
|
||||
var dir32 = path.resolve(devDir, 'ia32')
|
||||
, dir64 = path.resolve(devDir, 'x64')
|
||||
, nodeLibPath32 = path.resolve(dir32, 'node.lib')
|
||||
, nodeLibPath64 = path.resolve(dir64, 'node.lib')
|
||||
, nodeLibUrl32 = distUrl + '/v' + version + '/node.lib'
|
||||
, nodeLibUrl64 = distUrl + '/v' + version + '/x64/node.lib'
|
||||
, libPath32 = path.resolve(dir32, release.name + '.lib')
|
||||
, libPath64 = path.resolve(dir64, release.name + '.lib')
|
||||
|
||||
log.verbose('32-bit node.lib dir', dir32)
|
||||
log.verbose('64-bit node.lib dir', dir64)
|
||||
log.verbose('`node.lib` 32-bit url', nodeLibUrl32)
|
||||
log.verbose('`node.lib` 64-bit url', nodeLibUrl64)
|
||||
log.verbose('32-bit ' + release.name + '.lib dir', dir32)
|
||||
log.verbose('64-bit ' + release.name + '.lib dir', dir64)
|
||||
log.verbose('`' + release.name + '.lib` 32-bit url', release.libUrl32)
|
||||
log.verbose('`' + release.name + '.lib` 64-bit url', release.libUrl64)
|
||||
|
||||
var async = 2
|
||||
mkdir(dir32, function (err) {
|
||||
if (err) return done(err)
|
||||
log.verbose('streaming 32-bit node.lib to:', nodeLibPath32)
|
||||
log.verbose('streaming 32-bit ' + release.name + '.lib to:', libPath32)
|
||||
|
||||
var req = download(nodeLibUrl32)
|
||||
var req = download(release.libUrl32)
|
||||
if (!req) return
|
||||
req.on('error', done)
|
||||
req.on('response', function (res) {
|
||||
if (res.statusCode !== 200) {
|
||||
done(new Error(res.statusCode + ' status code downloading 32-bit node.lib'))
|
||||
done(new Error(res.statusCode + ' status code downloading 32-bit ' + release.name + '.lib'))
|
||||
return
|
||||
}
|
||||
|
||||
getContentSha(res, function (_, checksum) {
|
||||
contentShasums['node.lib'] = checksum
|
||||
log.verbose('content checksum', 'node.lib', checksum)
|
||||
contentShasums[release.libPath32] = checksum
|
||||
log.verbose('content checksum', release.libPath32, checksum)
|
||||
})
|
||||
|
||||
var ws = fs.createWriteStream(nodeLibPath32)
|
||||
var ws = fs.createWriteStream(libPath32)
|
||||
ws.on('error', cb)
|
||||
req.pipe(ws)
|
||||
})
|
||||
|
@ -393,23 +382,23 @@ function install (gyp, argv, callback) {
|
|||
})
|
||||
mkdir(dir64, function (err) {
|
||||
if (err) return done(err)
|
||||
log.verbose('streaming 64-bit node.lib to:', nodeLibPath64)
|
||||
log.verbose('streaming 64-bit ' + release.name + '.lib to:', libPath64)
|
||||
|
||||
var req = download(nodeLibUrl64)
|
||||
var req = download(release.libUrl64)
|
||||
if (!req) return
|
||||
req.on('error', done)
|
||||
req.on('response', function (res) {
|
||||
if (res.statusCode !== 200) {
|
||||
done(new Error(res.statusCode + ' status code downloading 64-bit node.lib'))
|
||||
done(new Error(res.statusCode + ' status code downloading 64-bit ' + release.name + '.lib'))
|
||||
return
|
||||
}
|
||||
|
||||
getContentSha(res, function (_, checksum) {
|
||||
contentShasums['x64/node.lib'] = checksum
|
||||
log.verbose('content checksum', 'x64/node.lib', checksum)
|
||||
contentShasums[release.libPath64] = checksum
|
||||
log.verbose('content checksum', release.libPath64, checksum)
|
||||
})
|
||||
|
||||
var ws = fs.createWriteStream(nodeLibPath64)
|
||||
var ws = fs.createWriteStream(libPath64)
|
||||
ws.on('error', cb)
|
||||
req.pipe(ws)
|
||||
})
|
||||
|
|
103
lib/process-release.js
Normal file
103
lib/process-release.js
Normal file
|
@ -0,0 +1,103 @@
|
|||
var semver = require('semver')
|
||||
var url = require('url')
|
||||
var path = require('path')
|
||||
|
||||
var bitsre = /(x86|x64)/
|
||||
var bitsreV3 = /(x86|ia32|x64)/ // io.js v3.x.x shipped with "ia32" but should
|
||||
// have been "x86"
|
||||
|
||||
// Captures all the logic required to determine download URLs, local directory and
|
||||
// file names and whether we need to use SHA-1 or 2. Inputs come from command-line
|
||||
// switches (--target), `process.version` and `process.release` where it exists.
|
||||
function processRelease (argv, gyp, defaultVersion, defaultRelease) {
|
||||
var version = argv[0] || gyp.opts.target || defaultVersion
|
||||
|
||||
// parse the version to normalize and ensure it's valid
|
||||
var versionSemver = semver.parse(version)
|
||||
if (!versionSemver) {
|
||||
return { version: version }
|
||||
}
|
||||
// flatten version into String
|
||||
version = versionSemver.version
|
||||
|
||||
var overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
|
||||
var iojs = !overrideDistUrl && !defaultRelease && semver.satisfies(version, '>=1.0.0 <4.0.0')
|
||||
var name = (defaultRelease && defaultRelease.name.replace(/\./g, '')) || (iojs ? 'iojs' : 'node') // io.js -> iojs
|
||||
var defaultDirUrl = (overrideDistUrl || iojs ? 'https://iojs.org/download/release' : 'https://nodejs.org/dist') + '/v' + version + '/'
|
||||
var baseUrl
|
||||
var libUrl32
|
||||
var libUrl64
|
||||
|
||||
// new style, based on process.release so we have a lot of the data we need
|
||||
if (defaultRelease && defaultRelease.headersUrl && !overrideDistUrl) {
|
||||
baseUrl = url.resolve(defaultRelease.headersUrl, './')
|
||||
libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || defaultDirUrl, 'x86', version)
|
||||
libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || defaultDirUrl, 'x64', version)
|
||||
|
||||
return {
|
||||
version: version,
|
||||
semver: versionSemver,
|
||||
name: name,
|
||||
baseUrl: baseUrl,
|
||||
tarballUrl: defaultRelease.headersUrl,
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: (name !== 'node' ? name + '-' : '') + version,
|
||||
libUrl32: libUrl32,
|
||||
libUrl64: libUrl64,
|
||||
libPath32: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path)),
|
||||
libPath64: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
|
||||
}
|
||||
}
|
||||
|
||||
// older versions without process.release are captured here and we have to make
|
||||
// a lot of assumptions
|
||||
|
||||
// distributions starting with 0.10.0 contain sha256 checksums
|
||||
var checksumAlgo = semver.gte(version, '0.10.0') ? 'sha256' : 'sha1'
|
||||
var shasumsFile = (checksumAlgo === 'sha256') ? 'SHASUMS256.txt' : 'SHASUMS.txt'
|
||||
|
||||
baseUrl = defaultDirUrl
|
||||
libUrl32 = resolveLibUrl(name, baseUrl, 'x86', version)
|
||||
libUrl64 = resolveLibUrl(name, baseUrl, 'x64', version)
|
||||
|
||||
return {
|
||||
version: version,
|
||||
semver: versionSemver,
|
||||
name: name,
|
||||
baseUrl: baseUrl,
|
||||
tarballUrl: baseUrl + name + '-v' + version + '.tar.gz',
|
||||
shasumsFile: shasumsFile,
|
||||
shasumsUrl: baseUrl + shasumsFile,
|
||||
checksumAlgo: checksumAlgo,
|
||||
versionDir: (name !== 'node' ? name + '-' : '') + version,
|
||||
libUrl32: libUrl32,
|
||||
libUrl64: libUrl64,
|
||||
libPath32: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl32).path)),
|
||||
libPath64: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
|
||||
}
|
||||
}
|
||||
|
||||
function normalizePath (p) {
|
||||
return path.normalize(p).replace(/\\/g, '/')
|
||||
}
|
||||
|
||||
function resolveLibUrl (name, defaultUrl, arch, version) {
|
||||
var base = url.resolve(defaultUrl, './')
|
||||
var isV3 = semver.satisfies(version, '^3')
|
||||
var hasLibUrl = bitsre.test(defaultUrl) || (isV3 && bitsreV3.test(defaultUrl))
|
||||
|
||||
if (!hasLibUrl) {
|
||||
// let's assume it's a baseUrl then
|
||||
if (semver.gte(version, '1.0.0'))
|
||||
return url.resolve(base, 'win-' + arch +'/' + name + '.lib')
|
||||
// prior to io.js@1.0.0 32-bit node.lib lives in /, 64-bit lives in /x64/
|
||||
return url.resolve(base, (arch == 'x64' ? 'x64/' : '') + name + '.lib')
|
||||
}
|
||||
|
||||
// else we have a proper url to a .lib, just make sure it's the right arch
|
||||
return defaultUrl.replace(isV3 ? bitsreV3 : bitsre, arch)
|
||||
}
|
||||
|
||||
module.exports = processRelease
|
|
@ -19,23 +19,19 @@ function remove (gyp, argv, callback) {
|
|||
log.verbose('remove', 'using node-gyp dir:', devDir)
|
||||
|
||||
// get the user-specified version to remove
|
||||
var v = argv[0] || gyp.opts.target
|
||||
log.verbose('remove', 'removing target version:', v)
|
||||
var version = argv[0] || gyp.opts.target
|
||||
log.verbose('remove', 'removing target version:', version)
|
||||
|
||||
if (!v) {
|
||||
if (!version) {
|
||||
return callback(new Error('You must specify a version number to remove. Ex: "' + process.version + '"'))
|
||||
}
|
||||
|
||||
// parse the version to normalize and make sure it's valid
|
||||
var version = semver.parse(v)
|
||||
|
||||
if (!version) {
|
||||
return callback(new Error('Invalid version number: ' + v))
|
||||
var versionSemver = semver.parse(version)
|
||||
if (versionSemver) {
|
||||
// flatten the version Array into a String
|
||||
version = versionSemver.version
|
||||
}
|
||||
|
||||
// flatten the version Array into a String
|
||||
version = version.version
|
||||
|
||||
var versionPath = path.resolve(gyp.devDir, version)
|
||||
log.verbose('remove', 'removing development files for version:', version)
|
||||
|
||||
|
|
|
@ -39,5 +39,11 @@
|
|||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tape": "~4.2.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tape test/test-*"
|
||||
}
|
||||
}
|
||||
|
|
86
test/docker.sh
Executable file
86
test/docker.sh
Executable file
|
@ -0,0 +1,86 @@
|
|||
#!/bin/bash
|
||||
|
||||
#set -e
|
||||
|
||||
test_node_versions="0.8.28 0.10.40 0.12.7"
|
||||
test_iojs_versions="1.8.4 2.4.0 3.3.0"
|
||||
|
||||
# borrows from https://github.com/rvagg/dnt/
|
||||
|
||||
# Simple setup function for a container:
|
||||
# setup_container(image id, base image, commands to run to set up)
|
||||
setup_container() {
|
||||
local ID=$1
|
||||
local BASE=$2
|
||||
local RUN=$3
|
||||
|
||||
# Does this image exist? If yes, ignore
|
||||
docker inspect "$ID" &> /dev/null
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "Found existing container [$ID]"
|
||||
else
|
||||
# No such image, so make it
|
||||
echo "Did not find container [$ID], creating..."
|
||||
docker run -i $BASE /bin/bash -c "$RUN"
|
||||
sleep 2
|
||||
docker commit $(docker ps -l -q) $ID
|
||||
fi
|
||||
}
|
||||
|
||||
# Run tests inside each of the versioned containers, copy cwd into npm's copy of node-gyp
|
||||
# so it'll be invoked by npm when a compile is needed
|
||||
# run_tests(version, test-commands)
|
||||
run_tests() {
|
||||
local VERSION=$1
|
||||
local RUN=$2
|
||||
|
||||
RUN="rsync -aAXx --delete --exclude .git --exclude build /node-gyp-src/ /usr/lib/node_modules/npm/node_modules/node-gyp/;
|
||||
/bin/su -s /bin/bash node-gyp -c 'cd && ${RUN}'"
|
||||
|
||||
docker run --rm -v ~/.npm/:/dnt/.npm/ -v $(pwd):/node-gyp-src/:ro -i node-gyp-test/${VERSION} /bin/bash -c "$RUN"
|
||||
}
|
||||
|
||||
|
||||
# A base image with build tools and a user account
|
||||
setup_container "node-gyp-test/base" "ubuntu:14.04" "
|
||||
apt-get update &&
|
||||
apt-get install -y build-essential python git rsync curl &&
|
||||
adduser --gecos node-gyp --home /node-gyp/ --disabled-login node-gyp &&
|
||||
echo "node-gyp:node-gyp" | chpasswd
|
||||
"
|
||||
|
||||
# An image on top of the base containing clones of repos we want to use for testing
|
||||
setup_container "node-gyp-test/clones" "node-gyp-test/base" "
|
||||
cd /node-gyp/ && git clone https://github.com/justmoon/node-bignum.git &&
|
||||
cd /node-gyp/ && git clone https://github.com/bnoordhuis/node-buffertools.git &&
|
||||
chown -R node-gyp.node-gyp /node-gyp/
|
||||
"
|
||||
|
||||
# An image for each of the node versions we want to test with that version installed and the latest npm
|
||||
for v in $test_node_versions; do
|
||||
setup_container "node-gyp-test/${v}" "node-gyp-test/clones" "
|
||||
curl -sL https://nodejs.org/dist/v${v}/node-v${v}-linux-x64.tar.gz | tar -zxv --strip-components=1 -C /usr/ &&
|
||||
npm install npm@latest -g &&
|
||||
node -v && npm -v
|
||||
"
|
||||
done
|
||||
|
||||
# An image for each of the io.js versions we want to test with that version installed and the latest npm
|
||||
for v in $test_iojs_versions; do
|
||||
setup_container "node-gyp-test/${v}" "node-gyp-test/clones" "
|
||||
curl -sL https://iojs.org/dist/v${v}/iojs-v${v}-linux-x64.tar.gz | tar -zxv --strip-components=1 -C /usr/ &&
|
||||
npm install npm@latest -g &&
|
||||
node -v && npm -v
|
||||
"
|
||||
done
|
||||
|
||||
|
||||
# Run the tests for all of the test images we've created,
|
||||
# we should see node-gyp doing its download, configure and run thing
|
||||
# _NOTE: bignum doesn't compile on 0.8 currently so it'll fail for that version only_
|
||||
for v in $test_node_versions $test_iojs_versions; do
|
||||
run_tests $v "
|
||||
cd node-buffertools && npm install --loglevel=info && npm test && cd &&
|
||||
cd node-bignum && npm install --loglevel=info && npm test
|
||||
"
|
||||
done
|
263
test/test-process-release.js
Normal file
263
test/test-process-release.js
Normal file
|
@ -0,0 +1,263 @@
|
|||
var test = require('tape')
|
||||
var processRelease = require('../lib/process-release')
|
||||
|
||||
test('test process release - process.version = 0.8.20', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v0.8.20', null)
|
||||
|
||||
t.equal(release.semver.version, '0.8.20')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '0.8.20',
|
||||
name: 'node',
|
||||
baseUrl: 'https://nodejs.org/dist/v0.8.20/',
|
||||
tarballUrl: 'https://nodejs.org/dist/v0.8.20/node-v0.8.20.tar.gz',
|
||||
shasumsFile: 'SHASUMS.txt',
|
||||
shasumsUrl: 'https://nodejs.org/dist/v0.8.20/SHASUMS.txt',
|
||||
checksumAlgo: 'sha1',
|
||||
versionDir: '0.8.20',
|
||||
libUrl32: 'https://nodejs.org/dist/v0.8.20/node.lib',
|
||||
libUrl64: 'https://nodejs.org/dist/v0.8.20/x64/node.lib',
|
||||
libPath32: 'node.lib',
|
||||
libPath64: 'x64/node.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.version = 0.10.21', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v0.10.21', null)
|
||||
|
||||
t.equal(release.semver.version, '0.10.21')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '0.10.21',
|
||||
name: 'node',
|
||||
baseUrl: 'https://nodejs.org/dist/v0.10.21/',
|
||||
tarballUrl: 'https://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://nodejs.org/dist/v0.10.21/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: '0.10.21',
|
||||
libUrl32: 'https://nodejs.org/dist/v0.10.21/node.lib',
|
||||
libUrl64: 'https://nodejs.org/dist/v0.10.21/x64/node.lib',
|
||||
libPath32: 'node.lib',
|
||||
libPath64: 'x64/node.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.version = 0.12.22', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v0.12.22', null)
|
||||
|
||||
t.equal(release.semver.version, '0.12.22')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '0.12.22',
|
||||
name: 'node',
|
||||
baseUrl: 'https://nodejs.org/dist/v0.12.22/',
|
||||
tarballUrl: 'https://nodejs.org/dist/v0.12.22/node-v0.12.22.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://nodejs.org/dist/v0.12.22/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: '0.12.22',
|
||||
libUrl32: 'https://nodejs.org/dist/v0.12.22/node.lib',
|
||||
libUrl64: 'https://nodejs.org/dist/v0.12.22/x64/node.lib',
|
||||
libPath32: 'node.lib',
|
||||
libPath64: 'x64/node.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ node@4.1.23', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v4.1.23', {
|
||||
name: 'node',
|
||||
headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '4.1.23')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '4.1.23',
|
||||
name: 'node',
|
||||
baseUrl: 'https://nodejs.org/dist/v4.1.23/',
|
||||
tarballUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://nodejs.org/dist/v4.1.23/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: '4.1.23',
|
||||
libUrl32: 'https://nodejs.org/dist/v4.1.23/win-x86/node.lib',
|
||||
libUrl64: 'https://nodejs.org/dist/v4.1.23/win-x64/node.lib',
|
||||
libPath32: 'win-x86/node.lib',
|
||||
libPath64: 'win-x64/node.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ node@4.1.23 / corp build', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v4.1.23', {
|
||||
name: 'node',
|
||||
headersUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz'
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '4.1.23')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '4.1.23',
|
||||
name: 'node',
|
||||
baseUrl: 'https://some.custom.location/',
|
||||
tarballUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://some.custom.location/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: '4.1.23',
|
||||
libUrl32: 'https://some.custom.location/win-x86/node.lib',
|
||||
libUrl64: 'https://some.custom.location/win-x64/node.lib',
|
||||
libPath32: 'win-x86/node.lib',
|
||||
libPath64: 'win-x64/node.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.version = 1.8.4', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v1.8.4', null)
|
||||
|
||||
t.equal(release.semver.version, '1.8.4')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '1.8.4',
|
||||
name: 'iojs',
|
||||
baseUrl: 'https://iojs.org/download/release/v1.8.4/',
|
||||
tarballUrl: 'https://iojs.org/download/release/v1.8.4/iojs-v1.8.4.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://iojs.org/download/release/v1.8.4/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: 'iojs-1.8.4',
|
||||
libUrl32: 'https://iojs.org/download/release/v1.8.4/win-x86/iojs.lib',
|
||||
libUrl64: 'https://iojs.org/download/release/v1.8.4/win-x64/iojs.lib',
|
||||
libPath32: 'win-x86/iojs.lib',
|
||||
libPath64: 'win-x64/iojs.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ iojs@3.2.24', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v3.2.24', {
|
||||
name: 'io.js',
|
||||
headersUrl: 'https://iojs.org/download/release/v3.2.24/iojs-v3.2.24-headers.tar.gz'
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '3.2.24')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '3.2.24',
|
||||
name: 'iojs',
|
||||
baseUrl: 'https://iojs.org/download/release/v3.2.24/',
|
||||
tarballUrl: 'https://iojs.org/download/release/v3.2.24/iojs-v3.2.24-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://iojs.org/download/release/v3.2.24/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: 'iojs-3.2.24',
|
||||
libUrl32: 'https://iojs.org/download/release/v3.2.24/win-x86/iojs.lib',
|
||||
libUrl64: 'https://iojs.org/download/release/v3.2.24/win-x64/iojs.lib',
|
||||
libPath32: 'win-x86/iojs.lib',
|
||||
libPath64: 'win-x64/iojs.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ iojs@3.2.11 +libUrl32', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v3.2.11', {
|
||||
name: 'io.js',
|
||||
headersUrl: 'https://iojs.org/download/release/v3.2.11/iojs-v3.2.11-headers.tar.gz',
|
||||
libUrl: 'https://iojs.org/download/release/v3.2.11/libdir-x86/iojs.lib' // custom
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '3.2.11')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '3.2.11',
|
||||
name: 'iojs',
|
||||
baseUrl: 'https://iojs.org/download/release/v3.2.11/',
|
||||
tarballUrl: 'https://iojs.org/download/release/v3.2.11/iojs-v3.2.11-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://iojs.org/download/release/v3.2.11/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: 'iojs-3.2.11',
|
||||
libUrl32: 'https://iojs.org/download/release/v3.2.11/libdir-x86/iojs.lib',
|
||||
libUrl64: 'https://iojs.org/download/release/v3.2.11/libdir-x64/iojs.lib',
|
||||
libPath32: 'libdir-x86/iojs.lib',
|
||||
libPath64: 'libdir-x64/iojs.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ iojs@3.2.101 +libUrl64', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v3.2.101', {
|
||||
name: 'io.js',
|
||||
headersUrl: 'https://iojs.org/download/release/v3.2.101/iojs-v3.2.101-headers.tar.gz',
|
||||
libUrl: 'https://iojs.org/download/release/v3.2.101/libdir-x64/iojs.lib' // custom
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '3.2.101')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '3.2.101',
|
||||
name: 'iojs',
|
||||
baseUrl: 'https://iojs.org/download/release/v3.2.101/',
|
||||
tarballUrl: 'https://iojs.org/download/release/v3.2.101/iojs-v3.2.101-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://iojs.org/download/release/v3.2.101/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: 'iojs-3.2.101',
|
||||
libUrl32: 'https://iojs.org/download/release/v3.2.101/libdir-x86/iojs.lib',
|
||||
libUrl64: 'https://iojs.org/download/release/v3.2.101/libdir-x64/iojs.lib',
|
||||
libPath32: 'libdir-x86/iojs.lib',
|
||||
libPath64: 'libdir-x64/iojs.lib'
|
||||
})
|
||||
})
|
||||
|
||||
test('test process release - process.release ~ iojs@3.3.0 - borked libdir', function (t) {
|
||||
t.plan(2)
|
||||
|
||||
var release = processRelease([], { opts: {} }, 'v3.2.101', {
|
||||
name: 'io.js',
|
||||
headersUrl: 'https://iojs.org/download/release/v3.2.101/iojs-v3.2.101-headers.tar.gz',
|
||||
libUrl: 'https://iojs.org/download/release/v3.2.101/win-ia32/iojs.lib' // custom
|
||||
})
|
||||
|
||||
t.equal(release.semver.version, '3.2.101')
|
||||
delete release.semver
|
||||
|
||||
t.deepEqual(release, {
|
||||
version: '3.2.101',
|
||||
name: 'iojs',
|
||||
baseUrl: 'https://iojs.org/download/release/v3.2.101/',
|
||||
tarballUrl: 'https://iojs.org/download/release/v3.2.101/iojs-v3.2.101-headers.tar.gz',
|
||||
shasumsFile: 'SHASUMS256.txt',
|
||||
shasumsUrl: 'https://iojs.org/download/release/v3.2.101/SHASUMS256.txt',
|
||||
checksumAlgo: 'sha256',
|
||||
versionDir: 'iojs-3.2.101',
|
||||
libUrl32: 'https://iojs.org/download/release/v3.2.101/win-x86/iojs.lib',
|
||||
libUrl64: 'https://iojs.org/download/release/v3.2.101/win-x64/iojs.lib',
|
||||
libPath32: 'win-x86/iojs.lib',
|
||||
libPath64: 'win-x64/iojs.lib'
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue