cjntaylor / node-cmake

CMake-based build system for node.js native modules
ISC License
78 stars 20 forks source link

N-API support #53

Open computerquip-streamlabs opened 5 years ago

computerquip-streamlabs commented 5 years ago

N-API is starting to gain traction. This should have the ability to compile against it similar to a node runtime I feel like.

computerquip-streamlabs commented 5 years ago

Actually, I guess I can choose just any given runtime that supports a given version of N-API? Herm.... some clarification on this would be cool.

computerquip-streamlabs commented 5 years ago

Seems it's difficult to get node-addon-api into the include path reliably. That would be great to have.

cjntaylor commented 5 years ago

I need to think through the implications of using N-API instead of / adjacent to(?) NaN and just in general with this tool, but I was largely waiting for things to stabilize. I haven't completely kept up with that recently so I'll need to take a look, but I'll put this high on my list for the next major release as I definitely want to support it (it seems like its the intended path forward).

computerquip-streamlabs commented 5 years ago

I've made an napi module using this cmake module. The example can be found here: https://github.com/computerquip-streamlabs/node-win32-np/blob/master/CMakeLists.txt

Notice the include_directories statement there for node-addon-api (which is separate from the officially support node_api headers bundled with the runtime itself). This isn't that hard to do frankly and maybe it's better if it's kept separate of the runtime headers regardless. Not sure.

TomMettam commented 3 years ago

For the C++ node-addon-api:

Just npm install --save node-addon-api and add this to your existing node-cmake CMakeLists.txt

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} SYSTEM PRIVATE ${NODE_ADDON_API_DIR})