Skip to content

Commit 5871dcf

Browse files
richard-townsend-armrvagg
authored andcommitted
src,win: add support for fetching arm64 node.lib
Windows on Arm support is available in some versions of Node.js v12 and Electron v6. This update allows node-gyp to fetch the appropriate node.lib to build native modules. If an arm64 binary is not available for the target node version, it's logged but ignored. arm64 is not expected to work in very old node.lib distribution formats, the test URLs in these cases are added to be consistent with x64. PR-URL: #1875 Reviewed-By: João Reis <[email protected]>
1 parent b887c40 commit 5871dcf

File tree

3 files changed

+103
-20
lines changed

3 files changed

+103
-20
lines changed

lib/install.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ function install (fs, gyp, argv, callback) {
298298

299299
function downloadNodeLib (done) {
300300
log.verbose('on Windows; need to download `' + release.name + '.lib`...')
301-
var archs = [ 'ia32', 'x64' ]
301+
var archs = [ 'ia32', 'x64', 'arm64' ]
302302
var async = archs.length
303303
archs.forEach(function (arch) {
304304
var dir = path.resolve(devDir, arch)
@@ -323,7 +323,15 @@ function install (fs, gyp, argv, callback) {
323323

324324
req.on('error', done)
325325
req.on('response', function (res) {
326-
if (res.statusCode !== 200) {
326+
if (res.statusCode === 404) {
327+
if (arch === 'arm64') {
328+
// Arm64 is a newer platform on Windows and not all node distributions provide it.
329+
log.verbose(`${name} was not found in ${libUrl}`)
330+
} else {
331+
log.warn(`${name} was not found in ${libUrl}`)
332+
}
333+
return
334+
} else if (res.statusCode !== 200) {
327335
done(new Error(res.statusCode + ' status code downloading ' + name))
328336
return
329337
}

lib/process-release.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const log = require('npmlog')
77

88
// versions where -headers.tar.gz started shipping
99
const headersTarballRange = '>= 3.0.0 || ~0.12.10 || ~0.10.42'
10-
const bitsre = /\/win-(x86|x64)\//
10+
const bitsre = /\/win-(x86|x64|arm64)\//
1111
const bitsreV3 = /\/win-(x86|ia32|x64)\// // io.js v3.x.x shipped with "ia32" but should
1212
// have been "x86"
1313

@@ -25,6 +25,7 @@ function processRelease (argv, gyp, defaultVersion, defaultRelease) {
2525
var baseUrl
2626
var libUrl32
2727
var libUrl64
28+
var libUrlArm64
2829
var tarballUrl
2930
var canGetHeaders
3031

@@ -79,6 +80,7 @@ function processRelease (argv, gyp, defaultVersion, defaultRelease) {
7980
baseUrl = url.resolve(defaultRelease.headersUrl, './')
8081
libUrl32 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x86', versionSemver.major)
8182
libUrl64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'x64', versionSemver.major)
83+
libUrlArm64 = resolveLibUrl(name, defaultRelease.libUrl || baseUrl || distBaseUrl, 'arm64', versionSemver.major)
8284
tarballUrl = defaultRelease.headersUrl
8385
} else {
8486
// older versions without process.release are captured here and we have to make
@@ -87,6 +89,7 @@ function processRelease (argv, gyp, defaultVersion, defaultRelease) {
8789
baseUrl = distBaseUrl
8890
libUrl32 = resolveLibUrl(name, baseUrl, 'x86', versionSemver.major)
8991
libUrl64 = resolveLibUrl(name, baseUrl, 'x64', versionSemver.major)
92+
libUrlArm64 = resolveLibUrl(name, baseUrl, 'arm64', versionSemver.major)
9093

9194
// making the bold assumption that anything with a version number >3.0.0 will
9295
// have a *-headers.tar.gz file in its dist location, even some frankenstein
@@ -110,6 +113,10 @@ function processRelease (argv, gyp, defaultVersion, defaultRelease) {
110113
x64: {
111114
libUrl: libUrl64,
112115
libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrl64).path))
116+
},
117+
arm64: {
118+
libUrl: libUrlArm64,
119+
libPath: normalizePath(path.relative(url.parse(baseUrl).path, url.parse(libUrlArm64).path))
113120
}
114121
}
115122
}
@@ -128,7 +135,7 @@ function resolveLibUrl (name, defaultUrl, arch, versionMajor) {
128135
return url.resolve(base, 'win-' + arch + '/' + name + '.lib')
129136
}
130137
// prior to [email protected] 32-bit node.lib lives in /, 64-bit lives in /x64/
131-
return url.resolve(base, (arch === 'x64' ? 'x64/' : '') + name + '.lib')
138+
return url.resolve(base, (arch === 'x86' ? '' : arch + '/') + name + '.lib')
132139
}
133140

134141
// else we have a proper url to a .lib, just make sure it's the right arch

test/test-process-release.js

+84-16
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ test('test process release - process.version = 0.8.20', function (t) {
1919
shasumsUrl: 'https://nodejs.org/dist/v0.8.20/SHASUMS256.txt',
2020
versionDir: '0.8.20',
2121
ia32: { libUrl: 'https://nodejs.org/dist/v0.8.20/node.lib', libPath: 'node.lib' },
22-
x64: { libUrl: 'https://nodejs.org/dist/v0.8.20/x64/node.lib', libPath: 'x64/node.lib' }
22+
x64: { libUrl: 'https://nodejs.org/dist/v0.8.20/x64/node.lib', libPath: 'x64/node.lib' },
23+
arm64: { libUrl: 'https://nodejs.org/dist/v0.8.20/arm64/node.lib', libPath: 'arm64/node.lib' }
2324
})
2425
})
2526

@@ -39,7 +40,8 @@ test('test process release - process.version = 0.10.21', function (t) {
3940
shasumsUrl: 'https://nodejs.org/dist/v0.10.21/SHASUMS256.txt',
4041
versionDir: '0.10.21',
4142
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.21/node.lib', libPath: 'node.lib' },
42-
x64: { libUrl: 'https://nodejs.org/dist/v0.10.21/x64/node.lib', libPath: 'x64/node.lib' }
43+
x64: { libUrl: 'https://nodejs.org/dist/v0.10.21/x64/node.lib', libPath: 'x64/node.lib' },
44+
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.21/arm64/node.lib', libPath: 'arm64/node.lib' }
4345
})
4446
})
4547

@@ -60,7 +62,8 @@ test('test process release - process.version = 0.12.9', function (t) {
6062
shasumsUrl: 'https://nodejs.org/dist/v0.12.9/SHASUMS256.txt',
6163
versionDir: '0.12.9',
6264
ia32: { libUrl: 'https://nodejs.org/dist/v0.12.9/node.lib', libPath: 'node.lib' },
63-
x64: { libUrl: 'https://nodejs.org/dist/v0.12.9/x64/node.lib', libPath: 'x64/node.lib' }
65+
x64: { libUrl: 'https://nodejs.org/dist/v0.12.9/x64/node.lib', libPath: 'x64/node.lib' },
66+
arm64: { libUrl: 'https://nodejs.org/dist/v0.12.9/arm64/node.lib', libPath: 'arm64/node.lib' }
6467
})
6568
})
6669

@@ -81,7 +84,8 @@ test('test process release - process.version = 0.10.41', function (t) {
8184
shasumsUrl: 'https://nodejs.org/dist/v0.10.41/SHASUMS256.txt',
8285
versionDir: '0.10.41',
8386
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.41/node.lib', libPath: 'node.lib' },
84-
x64: { libUrl: 'https://nodejs.org/dist/v0.10.41/x64/node.lib', libPath: 'x64/node.lib' }
87+
x64: { libUrl: 'https://nodejs.org/dist/v0.10.41/x64/node.lib', libPath: 'x64/node.lib' },
88+
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.41/arm64/node.lib', libPath: 'arm64/node.lib' }
8589
})
8690
})
8791

@@ -102,7 +106,8 @@ test('test process release - process.release ~ [email protected]', function (t) {
102106
shasumsUrl: 'https://nodejs.org/dist/v0.10.42/SHASUMS256.txt',
103107
versionDir: '0.10.42',
104108
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.42/node.lib', libPath: 'node.lib' },
105-
x64: { libUrl: 'https://nodejs.org/dist/v0.10.42/x64/node.lib', libPath: 'x64/node.lib' }
109+
x64: { libUrl: 'https://nodejs.org/dist/v0.10.42/x64/node.lib', libPath: 'x64/node.lib' },
110+
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.42/arm64/node.lib', libPath: 'arm64/node.lib' }
106111
})
107112
})
108113

@@ -123,7 +128,8 @@ test('test process release - process.release ~ [email protected]', function (t) {
123128
shasumsUrl: 'https://nodejs.org/dist/v0.12.10/SHASUMS256.txt',
124129
versionDir: '0.12.10',
125130
ia32: { libUrl: 'https://nodejs.org/dist/v0.12.10/node.lib', libPath: 'node.lib' },
126-
x64: { libUrl: 'https://nodejs.org/dist/v0.12.10/x64/node.lib', libPath: 'x64/node.lib' }
131+
x64: { libUrl: 'https://nodejs.org/dist/v0.12.10/x64/node.lib', libPath: 'x64/node.lib' },
132+
arm64: { libUrl: 'https://nodejs.org/dist/v0.12.10/arm64/node.lib', libPath: 'arm64/node.lib' }
127133
})
128134
})
129135

@@ -146,7 +152,8 @@ test('test process release - process.release ~ [email protected]', function (t) {
146152
shasumsUrl: 'https://nodejs.org/dist/v4.1.23/SHASUMS256.txt',
147153
versionDir: '4.1.23',
148154
ia32: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
149-
x64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' }
155+
x64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
156+
arm64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
150157
})
151158
})
152159

@@ -169,7 +176,60 @@ test('test process release - process.release ~ [email protected] / corp build', functi
169176
shasumsUrl: 'https://some.custom.location/SHASUMS256.txt',
170177
versionDir: '4.1.23',
171178
ia32: { libUrl: 'https://some.custom.location/win-x86/node.lib', libPath: 'win-x86/node.lib' },
172-
x64: { libUrl: 'https://some.custom.location/win-x64/node.lib', libPath: 'win-x64/node.lib' }
179+
x64: { libUrl: 'https://some.custom.location/win-x64/node.lib', libPath: 'win-x64/node.lib' },
180+
arm64: { libUrl: 'https://some.custom.location/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
181+
})
182+
})
183+
184+
test('test process release - process.release ~ [email protected] Windows', function (t) {
185+
t.plan(2)
186+
187+
var release = processRelease([], { opts: {} }, 'v12.8.0', {
188+
name: 'node',
189+
sourceUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
190+
headersUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
191+
libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib'
192+
})
193+
194+
t.equal(release.semver.version, '12.8.0')
195+
delete release.semver
196+
197+
t.deepEqual(release, {
198+
version: '12.8.0',
199+
name: 'node',
200+
baseUrl: 'https://nodejs.org/download/release/v12.8.0/',
201+
tarballUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
202+
shasumsUrl: 'https://nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
203+
versionDir: '12.8.0',
204+
ia32: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
205+
x64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
206+
arm64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
207+
})
208+
})
209+
210+
test('test process release - process.release ~ [email protected] Windows ARM64', function (t) {
211+
t.plan(2)
212+
213+
var release = processRelease([], { opts: {} }, 'v12.8.0', {
214+
name: 'node',
215+
sourceUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
216+
headersUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
217+
libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib'
218+
})
219+
220+
t.equal(release.semver.version, '12.8.0')
221+
delete release.semver
222+
223+
t.deepEqual(release, {
224+
version: '12.8.0',
225+
name: 'node',
226+
baseUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/',
227+
tarballUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
228+
shasumsUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
229+
versionDir: '12.8.0',
230+
ia32: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
231+
x64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
232+
arm64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
173233
})
174234
})
175235

@@ -192,7 +252,8 @@ test('test process release - process.release ~ [email protected] --target=0.10.40', fu
192252
shasumsUrl: 'https://nodejs.org/dist/v0.10.40/SHASUMS256.txt',
193253
versionDir: '0.10.40',
194254
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.40/node.lib', libPath: 'node.lib' },
195-
x64: { libUrl: 'https://nodejs.org/dist/v0.10.40/x64/node.lib', libPath: 'x64/node.lib' }
255+
x64: { libUrl: 'https://nodejs.org/dist/v0.10.40/x64/node.lib', libPath: 'x64/node.lib' },
256+
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.40/arm64/node.lib', libPath: 'arm64/node.lib' }
196257
})
197258
})
198259

@@ -215,7 +276,8 @@ test('test process release - process.release ~ [email protected] --dist-url=https://fo
215276
shasumsUrl: 'https://foo.bar/baz/v4.1.23/SHASUMS256.txt',
216277
versionDir: '4.1.23',
217278
ia32: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
218-
x64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' }
279+
x64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
280+
arm64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
219281
})
220282
})
221283

@@ -238,7 +300,8 @@ test('test process release - process.release ~ [email protected]', function (t
238300
shasumsUrl: 'https://frankensteinjs.org/dist/v4.1.23/SHASUMS256.txt',
239301
versionDir: 'frankenstein-4.1.23',
240302
ia32: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
241-
x64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' }
303+
x64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
304+
arm64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
242305
})
243306
})
244307

@@ -261,7 +324,8 @@ test('test process release - process.release ~ [email protected] --dist-url=ht
261324
shasumsUrl: 'http://foo.bar/baz/v4.1.23/SHASUMS256.txt',
262325
versionDir: 'frankenstein-4.1.23',
263326
ia32: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
264-
x64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' }
327+
x64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
328+
arm64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
265329
})
266330
})
267331

@@ -284,7 +348,8 @@ test('test process release - process.release ~ [email protected]', function (t) {
284348
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
285349
versionDir: '4.0.0-rc.4',
286350
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
287-
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' }
351+
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
352+
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
288353
})
289354
})
290355

@@ -309,7 +374,8 @@ test('test process release - process.release ~ [email protected] passed as argv[0]
309374
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
310375
versionDir: '4.0.0-rc.4',
311376
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
312-
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' }
377+
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
378+
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
313379
})
314380
})
315381

@@ -334,7 +400,8 @@ test('test process release - process.release ~ [email protected] - bogus string pa
334400
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
335401
versionDir: '4.0.0-rc.4',
336402
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
337-
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' }
403+
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
404+
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
338405
})
339406
})
340407

@@ -359,7 +426,8 @@ test('test process release - NODEJS_ORG_MIRROR', function (t) {
359426
shasumsUrl: 'http://foo.bar/v4.1.23/SHASUMS256.txt',
360427
versionDir: '4.1.23',
361428
ia32: { libUrl: 'http://foo.bar/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
362-
x64: { libUrl: 'http://foo.bar/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' }
429+
x64: { libUrl: 'http://foo.bar/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
430+
arm64: { libUrl: 'http://foo.bar/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
363431
})
364432

365433
delete process.env.NODEJS_ORG_MIRROR

0 commit comments

Comments
 (0)