155 lines
6 KiB
JavaScript
155 lines
6 KiB
JavaScript
var semver = require('semver')
|
|
, url = require('url')
|
|
, path = require('path')
|
|
, log = require('npmlog')
|
|
|
|
// versions where -headers.tar.gz started shipping
|
|
, headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
|
|
, bitsre = /\/win-(x86|x64)\//
|
|
, bitsreV3 = /\/win-(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. Inputs come from command-line switches (--target, --dist-url),
|
|
// `process.version` and `process.release` where it exists.
|
|
function processRelease (argv, gyp, defaultVersion, defaultRelease) {
|
|
var version = (semver.valid(argv[0]) && argv[0]) || gyp.opts.target || defaultVersion
|
|
, versionSemver = semver.parse(version)
|
|
, overrideDistUrl = gyp.opts['dist-url'] || gyp.opts.disturl
|
|
, isDefaultVersion
|
|
, isIojs
|
|
, name
|
|
, distBaseUrl
|
|
, baseUrl
|
|
, libUrl32
|
|
, libUrl64
|
|
, tarballUrl
|
|
, canGetHeaders
|
|
|
|
if (!versionSemver) {
|
|
// not a valid semver string, nothing we can do
|
|
return { version: version }
|
|
}
|
|
// flatten version into String
|
|
version = versionSemver.version
|
|
|
|
// defaultVersion should come from process.version so ought to be valid semver
|
|
isDefaultVersion = version === semver.parse(defaultVersion).version
|
|
|
|
// can't use process.release if we're using --target=x.y.z
|
|
if (!isDefaultVersion)
|
|
defaultRelease = null
|
|
|
|
if (defaultRelease) {
|
|
// v3 onward, has process.release
|
|
name = defaultRelease.name.replace(/io\.js/, 'iojs') // remove the '.' for directory naming purposes
|
|
isIojs = name === 'iojs'
|
|
} else {
|
|
// old node or alternative --target=
|
|
// semver.satisfies() doesn't like prerelease tags so test major directly
|
|
isIojs = versionSemver.major >= 1 && versionSemver.major < 4
|
|
name = isIojs ? 'iojs' : 'node'
|
|
}
|
|
|
|
// check for the nvm.sh standard mirror env variables
|
|
if (!overrideDistUrl) {
|
|
if (isIojs) {
|
|
if (process.env.IOJS_ORG_MIRROR) {
|
|
overrideDistUrl = process.env.IOJS_ORG_MIRROR
|
|
} else if (process.env.NVM_IOJS_ORG_MIRROR) {// remove on next semver-major
|
|
overrideDistUrl = process.env.NVM_IOJS_ORG_MIRROR
|
|
log.warn('download',
|
|
'NVM_IOJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, ' +
|
|
'please use IOJS_ORG_MIRROR')
|
|
}
|
|
} else {
|
|
if (process.env.NODEJS_ORG_MIRROR) {
|
|
overrideDistUrl = process.env.NODEJS_ORG_MIRROR
|
|
} else if (process.env.NVM_NODEJS_ORG_MIRROR) {// remove on next semver-major
|
|
overrideDistUrl = process.env.NVM_NODEJS_ORG_MIRROR
|
|
log.warn('download',
|
|
'NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, ' +
|
|
'please use NODEJS_ORG_MIRROR')
|
|
}
|
|
}
|
|
}
|
|
|
|
if (overrideDistUrl)
|
|
log.verbose('download', 'using dist-url', overrideDistUrl)
|
|
|
|
if (overrideDistUrl)
|
|
distBaseUrl = overrideDistUrl.replace(/\/+$/, '')
|
|
else
|
|
distBaseUrl = isIojs ? 'https://iojs.org/download/release' : 'https://nodejs.org/dist'
|
|
distBaseUrl += '/v' + version + '/'
|
|
|
|
// 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 || distBaseUrl, 'x86', versionSemver.major)
|
|
libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major)
|
|
|
|
return {
|
|
version: version,
|
|
semver: versionSemver,
|
|
name: name,
|
|
baseUrl: baseUrl,
|
|
tarballUrl: defaultRelease.headersUrl,
|
|
shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
|
|
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, additionally if you --target=x.y.z then we can't use the
|
|
// current process.release
|
|
|
|
baseUrl = distBaseUrl
|
|
libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major)
|
|
libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major)
|
|
// making the bold assumption that anything with a version number >3.0.0 will
|
|
// have a *-headers.tar.gz file in its dist location, even some frankenstein
|
|
// custom version
|
|
canGetHeaders = semver.satisfies(versionSemver, headersTarballRange)
|
|
tarballUrl = url.resolve(baseUrl, name + '-v' + version + (canGetHeaders ? '-headers' : '') + '.tar.gz')
|
|
|
|
return {
|
|
version: version,
|
|
semver: versionSemver,
|
|
name: name,
|
|
baseUrl: baseUrl,
|
|
tarballUrl: tarballUrl,
|
|
shasumsUrl: url.resolve(baseUrl, 'SHASUMS256.txt'),
|
|
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, versionMajor) {
|
|
var base = url.resolve(defaultUrl, './')
|
|
, hasLibUrl = bitsre.test(defaultUrl) || (versionMajor === 3 && bitsreV3.test(defaultUrl))
|
|
|
|
if (!hasLibUrl) {
|
|
// let's assume it's a baseUrl then
|
|
if (versionMajor >= 1)
|
|
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(versionMajor === 3 ? bitsreV3 : bitsre, '/win-' + arch + '/')
|
|
}
|
|
|
|
module.exports = processRelease
|