Skip to content

Commit 22dc745

Browse files
committed
Catch the error when loading library failed (#1071)
Currently, `interfaces.d.ts`, a declaration file for ROS2 messages, will be generated when running `npm install`, which needs to require the `.js` files of messages and the `ref-napi` C++ addon gets loaded. There could be a corner case that the `ref-napi` C++ addon is cross-compiled for arm arch, so loading `binding.node` dynamically failed on x86 platform, see details #1066. This patch catches the error when loading the library failed, and if it happens, we will use a prebuild `interfaces.d.ts` instead. Meanwhiles, this patch moves out generating `interfaces.d.ts` file out of `generate-messages` command because it already executed. Fix: #1066
1 parent cbee43b commit 22dc745

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

.npmignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ CONTRIBUTORS.md
1010
Dockerfile
1111
cpplint.py
1212
suppr.txt
13-
types/interfaces.d.ts
1413
generated/
1514
build/
1615
coverage/

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,16 @@
1717
"build:dev": "node-gyp -j 16 build --debug",
1818
"rebuild": "npm run clean && node-gyp -j 16 rebuild",
1919
"rebuild:dev": "npm run clean && node-gyp -j 16 rebuild --debug",
20-
"generate-messages": "node scripts/generate_messages.js && node scripts/generate_tsd.js",
21-
"generate-messages:dev": "node scripts/generate_messages.js --debug && node scripts/generate_tsd.js",
20+
"generate-messages": "node scripts/generate_messages.js",
21+
"generate-messages:dev": "node scripts/generate_messages.js --debug",
22+
"generate-tsd-messages": "node scripts/generate_tsd.js",
2223
"clean": "node-gyp clean && rimraf ./generated",
2324
"install": "npm run rebuild",
2425
"postinstall": "npm run generate-messages",
2526
"docs": "cd docs && make",
2627
"test": "nyc node --expose-gc ./scripts/run_test.js && npx tsd",
2728
"lint": "eslint && node ./scripts/cpplint.js",
28-
"format": "clang-format -i -style=file ./src/*.cpp ./src/*.hpp && prettier --write \"{lib,rosidl_gen,rostsd_gen,rosidl_parser,types,example,test,scripts,benchmark}/**/*.{js,md,ts}\" ./*.{js,md,ts}",
29+
"format": "clang-format -i -style=file ./src/*.cpp ./src/*.hpp && prettier --write \"{lib,rosidl_gen,rostsd_gen,rosidl_parser,types,example,test,scripts,benchmark,rostsd_gen}/**/*.{js,md,ts}\" ./*.{js,md,ts}",
2930
"prepare": "husky",
3031
"coverage": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"
3132
},

rostsd_gen/index.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ declare module "rclnodejs" {
2525

2626
'use strict';
2727

28+
const os = require('os');
2829
const path = require('path');
2930
const fs = require('fs');
3031
const loader = require('../lib/interface_loader.js');
@@ -34,7 +35,10 @@ async function generateAll() {
3435
// load pkg and interface info (msgs and srvs)
3536
const generatedPath = path.join(__dirname, '../generated/');
3637
const pkgInfos = getPkgInfos(generatedPath);
37-
38+
if (pkgInfos.length === 0) {
39+
console.log('No package found, prebuild interfaces.d.ts will be used.');
40+
return;
41+
}
3842
// write interfaces.d.ts file
3943
const interfacesFilePath = path.join(__dirname, '../types/interfaces.d.ts');
4044
const fd = fs.openSync(interfacesFilePath, 'w');
@@ -69,8 +73,15 @@ function getPkgInfos(rootDir) {
6973
})
7074
)
7175
continue;
72-
73-
const rosInterface = loader.loadInterface(typeClass);
76+
let rosInterface = null;
77+
try {
78+
rosInterface = loader.loadInterface(typeClass);
79+
} catch (e) {
80+
console.log(
81+
`${e.message}, please make sure it's built for ${os.arch()} platform correctly.`
82+
);
83+
return pkgInfos;
84+
}
7485

7586
if (!pkgInfo.subfolders.has(typeClass.type)) {
7687
pkgInfo.subfolders.set(typeClass.type, []);

0 commit comments

Comments
 (0)