@mapbox/cmake-node-module

Build Node.js C++ modules with CMake

Stats

StarsIssuesVersionUpdatedCreatedSize
@mapbox/cmake-node-module
1.2.03 years ago3 years agoMinified + gzip package size for @mapbox/cmake-node-module in KB

Readme

This project helps you build C++ modules for Node.js using the CMake meta build system.

NPM

While the default way of building Node.js C++ modules is to use node-gyp, there's no requirement to do so. If your project already uses CMake, for example, you can use this project to directly build C++ Node.js modules.

Unlike other CMake-based Node.js module build scripts, this project allows you to generate multiple ABI version of a Node.js module within the same build through the use of interface targets.

Getting started

Add the @mapbox/cmake-node-module as a dependency to your package.json file.

In your CMakeLists.txt file, add this to get a very simple Node.js module to build

include(node_modules/@mapbox/cmake-node-module/module.cmake)

add_node_module(module)

target_sources(module INTERFACE
    ${CMAKE_CURRENT_SOURCE_DIR}/module.cpp
)

To support building multiple ABIs, add_node_module creates a number of different targets: One interface target with the name you pass to the function, and one shared library target for every Node.js ABI. By default, add_node_module creates targets for all ABIs >= 46 (Node.js 4).

ABIs vs. versions

Note that this module works with ABI versions, not Node.js versions: Multiple Node.js versions can support the same ABI, so it's not necessary to create a separate Node.js module per version, only per ABI. The Node.js website has an overview of all versions and how they map to ABIs. This means that this CMake script may download headers that are newer than the Node.js version you have installed on your computer. It'll also download headers that are older than the version you have installed to support building for older ABIs.

Documentation

Global variables

  • NODE_MODULE_MINIMUM_ABI (defaults to 46): Determines the minimum ABI that this script will generate targets for.
  • NODE_MODULE_CACHE_DIR (defaults to ${CMAKE_BINARY_DIR}): Determines where the Node.js and Nan headers should be cached.

You can change these variables before or after you've included the .cmake file, or pass them on the command line when invoking CMake. However, in most cases it is not necessary since you can also override them for every Node.js module target that you create.

Functions

add_node_module(<name>
                [ NAN_VERSION <version> ]
                [ MINIMUM_NODE_ABI <number> ]
                [ INSTALL_PATH <path> ]
                [ CACHE_DIR <directory> ]
                [ EXCLUDE_NODE_ABIS <number> [<number>...] ]
               )

Use this function to create a new Node.js module target. It will create a target with the specified name that is an interface target. Those targets are special and only allow certain properties to be set. Those properties, however, will be inherited by the ABI-specific targets, which is what we want here, since it means that you'll only have to modify one target and the respective ABIs are built automatically.

  • NAN_VERSION (unset by default): Semver of the Nan abstraction library module. This CMake script will download the headers separately and won't install them as an NPM module. It will only add the Nan headers to the build if this variable is set.
  • MINIMUM_NODE_ABI (defaults to 46: Specify the minimum ABI that your module supports. This script will generate targets for all ABIs that are equal or newer to this ABI. The Node.js website has an overview of all versions and how they map to ABIs.
  • INSTALL_PATH (defaults to lib/{node_abi}/<name>.node): The finished node modules will be copied to this path. The path is relative to the directory of the CMakeLists.txt file that you call the add_node_module function from. Specify "module_path": "./lib/{node_abi}" in your package.json to have node-pre-gyp package the correct folder.
  • CACHE_DIR (defaults to the value of NODE_MODULE_CACHE_DIR): directory where the Node.js and Nan headers are cached to avoid redownloading them. The directory is relative to the directory of the CMakeLists.txt file that you call the add_node_module function from. By default, they will be stored in the build directory. However, if you have multiple builds (e.g. for different platforms), you can specify a common directory to share them.
  • EXCLUDE_NODE_ABIS: A list of Node.js ABIs that won't be built. You can use this to exclude old unstable versions (e.g. 5.x = 47, and 7.x = 51). See https://nodejs.org/en/download/releases/ for a list of ABIs (NODE_MODULE_VERSION).

This function adds another custom target called <name>.all that you can use to request builds for all selected ABIs in your build system scripts.

It sets the variables <name>::abis, and <name>::targets that contain a list of all selected ABI versions, as well as all generated targets. You can use these variables to iterate over these like this:

foreach(ABI IN LISTS targetname::abis)
    # Use ${ABI}    
endforeach()

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.