forked from bvibber/emsdk-npm
-
Notifications
You must be signed in to change notification settings - Fork 3
/
common.js
114 lines (100 loc) · 3.79 KB
/
common.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// emsdk-npm - common.js
// Copyright 2019-2020 Brion Vibber and the emsdk-npm contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
const path = require('path');
const fs = require('fs');
const GetEmsdkPath = require('./path.js').getEmsdkPath;
const spawn = require('cross-spawn-promise');
function moduleBase() {
// Top-level dir for this module
const srcdir = path.dirname(module.filename);
const basedir = path.dirname(srcdir);
return basedir;
}
function emsdkBase() {
// Do sanity checks on the location and prints warning messages
let testPath = GetEmsdkPath();
return testPath;
}
function run(command, args, opts = {}) {
return spawn(
command,
args,
{
stdio: [
'inherit',
'inherit',
'inherit'
],
...opts
}
);
}
////////////////////////////////////////////////////////////////////////
// install() helpers
// Retrieve release tags and detect whether our requested version
// is already active as indicated by `.emsdk_version`
////////////////////////////////////////////////////////////////////////
function getReleaseTags() {
let tagsFile = path.join(emsdkBase(), 'emscripten-releases-tags.txt');
let rawData = fs.readFileSync(tagsFile);
return JSON.parse(rawData);
}
function getTotHash() {
let totFile = path.join(emsdkBase(), 'emscripten-releases-tot.txt');
return fs.readFileSync(totFile);
}
function getInstalled(version) {
// Set lookup defaults in case of exception
let which = (version.includes('fastcomp')) ? 'fastcomp' : 'upstream';
let hash = version;
let versionData = '';
try {
// Get hash from version
// Version hash is the same regardless if -fastcomp is in the string
if (version.includes('tot'))
hash = getTotHash();
else {
let tags = getReleaseTags();
if (version.includes('latest'))
hash = tags.releases[tags.latest];
else {
let versionTest = version.replace('-fastcomp', '');
if (versionTest in tags.releases)
hash = tags.releases[versionTest];
// else, user may have passed a complete hash string already
}
}
// Get currently installed hash
let versionFile = path.join(emsdkBase(), which, '.emsdk_version');
versionData = fs.readFileSync(versionFile);
} catch (e) {
console.warn('Error retrieving installed EMSDK version: ' + e.message);
}
return versionData.includes(hash);
}
module.exports = {
moduleBase: moduleBase,
emsdkBase: emsdkBase,
run: run,
getReleaseTags: getReleaseTags,
getTotHash: getTotHash,
getInstalled: getInstalled
};