Security News
JSR Working Group Kicks Off with Ambitious Roadmap and Plans for Open Governance
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
The cmake-js npm package is a tool that simplifies the process of building native C++ addons for Node.js using CMake. It provides a seamless integration between Node.js and CMake, allowing developers to leverage the powerful build system of CMake while working within the Node.js ecosystem.
Building Native Addons
This feature allows you to build native C++ addons for Node.js using CMake. The code sample demonstrates how to use cmake-js to build a target named 'myAddon' in debug mode.
const cmake = require('cmake-js');
cmake.build({
target: 'myAddon',
debug: true
}).then(() => {
console.log('Build complete');
}).catch(err => {
console.error('Build failed', err);
});
Configuring Build Options
This feature allows you to configure various build options for your CMake project. The code sample shows how to set the build type to 'Release' and specify an installation prefix.
const cmake = require('cmake-js');
cmake.configure({
CMAKE_BUILD_TYPE: 'Release',
CMAKE_INSTALL_PREFIX: '/usr/local'
}).then(() => {
console.log('Configuration complete');
}).catch(err => {
console.error('Configuration failed', err);
});
Running CMake Commands
This feature allows you to run arbitrary CMake commands. The code sample demonstrates how to run a CMake build command to install the target.
const cmake = require('cmake-js');
cmake.run(['--build', '.', '--target', 'install']).then(() => {
console.log('CMake command executed successfully');
}).catch(err => {
console.error('CMake command failed', err);
});
node-gyp is a cross-platform command-line tool written in Node.js for compiling native addon modules for Node.js. It uses the gyp build system instead of CMake. While node-gyp is widely used and well-supported, it lacks the flexibility and advanced features of CMake, which cmake-js leverages.
node-pre-gyp is a tool that makes it easy to publish and install Node.js C++ addons from binaries. It is built on top of node-gyp and provides additional features like binary hosting and pre-built binary distribution. However, it does not offer the same level of integration with CMake as cmake-js.
neon-cli is a tool for building fast and safe native Node.js modules using Rust instead of C++. It provides a high-level abstraction over the Node.js C++ API and offers a more modern and safer language for writing native modules. While it is not directly comparable to cmake-js, it serves a similar purpose of enabling native module development for Node.js.
CMake.js is a Node.js/io.js native addon build tool which works exactly like node-gyp, but instead of gyp, it is based on CMake build system. It's compatible with the following runtimes:
Nearly every native addon is using node-gyp today, so what's wrong with it?
Fist of all, Google, the creator of the gyp platform is moving towards its new build system called gn, which means gyp's days of support are counted. (Just for the record, despite the announced gn switch, there is Bazel in the works, so sooner or later gn will be dropped in favor of it - IMHO.)
It uses Python 2 which is a huge PITA in the current century, and because of the above, there is no hope for upgrade, see: node-gyp Issue #193.
While gyp is very good in dependency management and project generation,
it still lacks features of essential build customization
(see: gyp wiki - Custom_build_steps).
Its wiki might be enough for an inhouse project, but far from what can be called for a good product documentation.
If you wanna port a native library to node as an addon, there is a (very-very) good chance that it doesn't use gyp for its build system, you have to make gyp binding by hand, which is really hard or nearly impossible considering the previous bulletpoint. Also you have to be an expert of the given build system and gyp to do it right.
There is no IDE that supports gyp as a native project format. Gyp can be used to generate IDE projects, but this is not a two way operation, if you tune your settings or setup in the IDE, you have to propagate changes back to gyp files by hand.
Gyp itself isn't capable to build node modules, there is fair amount custom JS code in node-gyp module to make it capable to doing so (that's why it named as Generate Your Project not Build Your Project). So supporting advanced build features like Ninja generators is impossible without extra development effort added to node-gyp (see node-gyp PR #429). It looks like node-gyp support itself eats up development resources, so there won't be new features like this added or merged in the near future. So with node-gyp you are stuck to good old Make which makes build times very long while working on large modules.
So, let's take a look at CMake compared to the above bulletpoints.
Cmake is quite mature and very widely used, making it quite stable and convenient. It's used by projects like Blender, LLVM, MySQL or Netflix, and it isn't likely to be abandoned in the near future.
It's a native software having no dependencies to any runtime.
Right now CMake have all of the features that was missing when development of gyp started, and on top of that it still have those features that gyp doesn't have since then. It has an own module ecosystem with internal modules, and with 3rd party gems like Compile Time Reducer (Cotire).
CMake have an excellent documentation, lots of tutorials, and examples.
If you pick a native cross platform library, there is a very good chance that is uses CMake as of its build system, or it has CMake build files somewhere, for example: Shark, Lua, SDL. If not, there are converters that helps you to create CMake files from other project formats.
CMake is widely supported by major cross platform C++ IDEs like: QtCreator, KDevelop and the upcoming CLion from JetBrains. With CMake.js you are gonna be able to develop Node.js addons by using those, even you have the ability to use features like integrated debugging.
CMake.js module doesn't build your project, CMake does. All of its commands (configure, build, clean, etc.) are simple CMake invocations without involving JS magic anywhere. Even you can print CMake command line with CMake.js module for each command (eg.: cmake-js print-configure, cmake-js print-build, cmake-js print-clean). This means supporting new features of a given native build system (like new version of Ninja or Visual Studio) won't involve developer efforts from CMake.js side, installing new versions of CMake will be enough.
npm install -g cmake-js
Help:
cmake-js --help
Requirements:
In a nutshell. (For more complete documentation please see the first tutorial.)
npm install --save cmake-js
project (your-addon-name-here)
include_directories(${CMAKE_JS_INC})
file(GLOB SOURCE_FILES "your-source files-location-here")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})
"scripts": {
"install": "node ./node_modules/cmake-js/bin/cmake-js rebuild"
}
In your module folder you can access cmake-js commands if you install cmake-js globally:
npm install -g cmake-js
Please refer to the --help
for the lists of available commands (they are like commands in node-gyp
).
You can configure runtimes for compiling target for all depending CMake.js modules in an application. Define a cmake-js
key in the application's root package.json
file, eg.:
{
"name": "ta-taram-taram",
"description": "pa-param-pam-pam",
"version": "1.0.0",
"main": "app.js",
"cmake-js": {
"runtime": "node",
"runtimeVersion": "0.12.0",
"arch": "ia32"
}
}
Available settings:
node
: Node.jsiojs
: io.jsnw
: nw.js0.12.1
x64
, ia32
, arm
). Notice: on non-Windows systems the C++ toolset's architecture's gonna be used despite of this setting. If you don't specify this on Windows, then architecture of the main node/io.js runtime is gonna be used, so you have to choose a matching nw.js runtime.To make compatible your nw.js application with any CMake.js based modules, write the following to your application's package.json file:
{
"cmake-js": {
"runtime": "nw",
"runtimeVersion": "nw.js-version-here",
"arch": "whatever-setting-is-appropriate-for-your-application's-windows-build"
}
}
That's it. There is nothing else to do either on the application's or on the module's side, CMake.js modules are compatible with nw.js out-of-the-box. For more complete documentation please see the third tutorial.
FAQs
CMake.js - a Node.js native addon build tool
The npm package cmake-js receives a total of 103,838 weekly downloads. As such, cmake-js popularity was classified as popular.
We found that cmake-js demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
Security News
Research
An advanced npm supply chain attack is leveraging Ethereum smart contracts for decentralized, persistent malware control, evading traditional defenses.
Security News
Research
Attackers are impersonating Sindre Sorhus on npm with a fake 'chalk-node' package containing a malicious backdoor to compromise developers' projects.