На этой странице

CMake.js — хорошая альтернатива инструменту сборки node-gyp. CMake.js основан на инструменте CMake, который должен быть установлен.

  • Использует инструмент CMake, широко принятый в open source сообществе.
  • Идеален для существующих C/C++-библиотек, уже основанных на CMake.
  • Не очень широко принят в сообществе Node.

CMake.js требует, чтобы CMake был уже установлен. Установщики доступны на сайте CMake.

Разработчикам на macOS может быть удобнее установить CMake через Homebrew. С установленным Homebrew CMake можно установить командой brew install cmake.

Проверить установку CMake можно командой:

Как разработчику нативных модулей Node вам может быть удобно установить CMake.js как глобальный инструмент командной строки:

Проверить установку CMake.js можно командой:

Вашему файлу package.json нужна пара записей, чтобы нативный модуль работал с CMake.js.

Поскольку ваш нативный модуль нужно компилировать с помощью CMake.js при установке, свойству scripts вашего файла package.json нужна запись install, чтобы это произошло:

  "scripts": {
    "install": "cmake-js compile"
  }

Маловероятно, что у пользователей вашего нативного модуля CMake.js установлен как глобальный инструмент командной строки. Поэтому вашему проекту нужно объявить dev-зависимость от CMake.js. Это можно сделать, введя такую команду:

Как вариант — вручную добавить dev-зависимость в ваш файл package.json:

  "devDependencies": {
    "cmake-js": "^6.0.0"
  }

Пример этого подхода доступен здесь.

У нативных модулей, собираемых на CMake.js, есть CMakeLists.txt, описывающий, как должен собираться модуль. Этот файл служит той же цели, что и binding.gyp для проектов, использующих node-gyp.

Помимо записей, необходимых для любой CMake-сборки, при сборке нативных модулей требуются дополнительные записи.

Вот строки, необходимые для всех нативных модулей, собираемых с помощью CMake.js:

project(node-api-cmake-build-example)
include_directories(${CMAKE_JS_INC})
file(GLOB SOURCE_FILES "hello.cc")
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB})

При сборке нативного модуля на основе Node-API важно объявить минимальную версию Node-API, под которую спроектирован ваш модуль. Для CMake.js это делается добавлением строки вроде этой в файл CMakeLists.txt:

# define NAPI_VERSION
add_definitions(-DNAPI_VERSION=3)

При отсутствии других требований Node-API версии 3 — хороший выбор, так как это версия Node-API, актуальная на момент выхода Node-API из экспериментального статуса.

Для Node-API-модулей на основе node-addon-api требуются дополнительные значения конфигурации.

node-addon-api требует C++11. Эти строки конфигурации в начале файла CMakeLists.txt указывают это требование:

cmake_minimum_required(VERSION 3.9)
cmake_policy(SET CMP0042 NEW)
set (CMAKE_CXX_STANDARD 11)

Модули на основе node-addon-api включают дополнительные заголовочные файлы, не являющиеся частью самого Node. Эти строки указывают CMake.js, где найти эти файлы:

# Include Node-API wrappers
execute_process(COMMAND node -p "require('node-addon-api').include"
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        OUTPUT_VARIABLE NODE_ADDON_API_DIR
        )
string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR})

Пример этого подхода доступен здесь.