-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathinstall.cjs
More file actions
executable file
·113 lines (97 loc) · 3.12 KB
/
install.cjs
File metadata and controls
executable file
·113 lines (97 loc) · 3.12 KB
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
// Copyright (c) 2025, The Robot Web Tools Contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const { detectUbuntuCodename } = require('../lib/utils');
function getRosDistro() {
return process.env.ROS_DISTRO || null;
}
function checkPrebuiltBinary() {
const platform = process.platform;
const arch = process.arch;
// Only Linux has prebuilt binaries
if (platform !== 'linux') {
console.log(
`Platform ${platform} does not have prebuilt binaries, will build from source`
);
return false;
}
const ubuntuCodename = detectUbuntuCodename();
const rosDistro = getRosDistro();
if (!ubuntuCodename || !rosDistro) {
console.log(
'Cannot detect Ubuntu codename or ROS distribution, will build from source'
);
return false;
}
// Check for the specific prebuilt binary
const prebuildDir = path.join(
__dirname,
'..',
'prebuilds',
`${platform}-${arch}`
);
const expectedBinary = `${rosDistro}-${ubuntuCodename}-${arch}-rclnodejs.node`;
const binaryPath = path.join(prebuildDir, expectedBinary);
if (fs.existsSync(binaryPath)) {
console.log(`✓ Found prebuilt binary: ${expectedBinary}`);
console.log(` Platform: ${platform}, Arch: ${arch}`);
console.log(` Ubuntu: ${ubuntuCodename}, ROS: ${rosDistro}`);
return true;
}
console.log(
`✗ No prebuilt binary found for ${rosDistro}-${ubuntuCodename}-${arch}`
);
// List available binaries for debugging
if (fs.existsSync(prebuildDir)) {
const availableBinaries = fs
.readdirSync(prebuildDir)
.filter((f) => f.endsWith('.node'));
if (availableBinaries.length > 0) {
console.log(
' Available prebuilt binaries:',
availableBinaries.join(', ')
);
}
}
return false;
}
function buildFromSource() {
console.log('\n=== Building rclnodejs from source ===');
try {
execSync('npm run rebuild', {
stdio: 'inherit',
cwd: path.join(__dirname, '..'),
timeout: 600000, // 10 minute timeout
});
console.log('✓ Successfully built from source\n');
} catch (error) {
console.error('✗ Failed to build from source:', error.message);
process.exit(1);
}
}
function main() {
console.log('\n=== Installing rclnodejs ===\n');
if (checkPrebuiltBinary()) {
console.log('✓ Installation complete - using prebuilt binary\n');
} else {
console.log('→ Building from source...\n');
buildFromSource();
}
}
if (require.main === module) {
main();
}
module.exports = { checkPrebuiltBinary, buildFromSource };