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 можно командой:
cmake --versionКак разработчику нативных модулей Node вам может быть удобно установить CMake.js как глобальный инструмент командной строки:
npm install cmake-js -gПроверить установку CMake.js можно командой:
cmake-js --versionВашему файлу package.json нужна пара записей, чтобы нативный модуль работал с CMake.js.
Поскольку ваш нативный модуль нужно компилировать с помощью CMake.js при установке, свойству scripts вашего файла package.json нужна запись install, чтобы это произошло:
"scripts": {
"install": "cmake-js compile"
}Маловероятно, что у пользователей вашего нативного модуля CMake.js установлен как глобальный инструмент командной строки. Поэтому вашему проекту нужно объявить dev-зависимость от CMake.js. Это можно сделать, введя такую команду:
npm install cmake-js --save-devКак вариант — вручную добавить 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})Пример этого подхода доступен здесь.