forked from nodejs/node-v0.x-archive
/
installer.js
120 lines (101 loc) · 3.02 KB
/
installer.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
115
116
117
118
119
120
var fs = require('fs'),
path = require('path'),
exec = require('child_process').exec,
options = fs.readFileSync(process.argv[2]).toString(),
cmd = process.argv[3];
if (cmd !== 'install' && cmd !== 'uninstall') {
console.error('Unknown command: ' + cmd);
process.exit(1);
}
// Python pprint.pprint() uses single quotes instead of double.
// awful.
options = options.replace(/'/gi, '"')
// Parse options file and remove first comment line
options = JSON.parse(options.split('\n').slice(1).join(''));
var variables = options.variables,
node_prefix = variables.node_prefix || '/usr/local';
// Execution queue
var queue = [],
dirs = [];
// Copy file from src to dst
function copy(src, dst, callback) {
// If src is array - copy each file separately
if (Array.isArray(src)) {
src.forEach(function(src) {
copy(src, dst, callback);
});
return;
}
dst = path.join(node_prefix, dst);
var dir = dst.replace(/\/[^\/]*$/, '/');
// Create directory if hasn't done this yet
if (dirs.indexOf(dir) === -1) {
dirs.push(dir);
queue.push('mkdir -p ' + dir);
}
// Queue file/dir copy
queue.push('cp -rf ' + src + ' ' + dst);
}
// Remove files
function remove(files) {
files.forEach(function(file) {
file = path.join(node_prefix, file);
queue.push('rm -rf ' + file);
});
}
// Run every command in queue, one-by-one
function run() {
var cmd = queue.shift();
if (!cmd) return;
console.log(cmd);
exec(cmd, function(err, stdout, stderr) {
if (stderr) console.error(stderr);
if (err) process.exit(1);
run();
});
}
if (cmd === 'install') {
// Copy includes
copy([
// Node
'src/node.h', 'src/node_buffer.h', 'src/node_object_wrap.h',
'src/node_version.h',
// v8
'deps/v8/include/v8-debug.h', 'deps/v8/include/v8-preparser.h',
'deps/v8/include/v8-profiler.h', 'deps/v8/include/v8-testing.h',
'deps/v8/include/v8.h', 'deps/v8/include/v8stdint.h',
// uv
'deps/uv/include/uv.h'
], 'include/node/');
// Private uv headers
copy([
'deps/uv/include/uv-private/eio.h', 'deps/uv/include/uv-private/ev.h',
'deps/uv/include/uv-private/ngx-queue.h',
'deps/uv/include/uv-private/tree.h',
'deps/uv/include/uv-private/uv-unix.h',
'deps/uv/include/uv-private/uv-win.h',
], 'include/node/uv-private/');
copy([
'deps/uv/include/ares.h',
'deps/uv/include/ares_version.h'
], 'include/node/');
// Copy node-gyp files
copy('common.gypi', 'lib/node/');
copy('tools/*', 'lib/node/tools/');
queue.push('ln -sf ../lib/node/tools/node-gyp ' +
path.join(node_prefix, 'bin/node-gyp'));
// Copy binary file
copy('out/Release/node', 'bin/node');
// Install npm (eventually)
if (variables.node_install_npm == 'true') {
copy('deps/npm', 'lib/node_modules/npm');
queue.push('ln -sf ../lib/node_modules/npm/bin/npm-cli.js ' +
path.join(node_prefix, 'bin/npm'));
}
} else {
remove([
'bin/node', 'bin/npm', 'bin/node-gyp', 'include/node/*',
'lib/node', 'lib/node_modules'
]);
}
run();