diff --git a/Lib.cmake b/Lib.cmake new file mode 100644 index 00000000..4a44863a --- /dev/null +++ b/Lib.cmake @@ -0,0 +1,106 @@ +cmake_minimum_required(VERSION 3.15) + +# setup some cmake required config +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +add_definitions("-DBUILDING_NODE_EXTENSION") + +# In some configurations MD builds will crash upon attempting to free memory. +# This tries to encourage MT builds which are larger but less likely to have this crash. +set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + +# Setup some variables +if(NOT CMAKE_BUILD_TYPE) + SET (CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) +endif() +if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") +endif() + +# Find versions info +execute_process(COMMAND "${CMAKE_CURRENT_LIST_DIR}/bin/cmake-js-versions" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE CMAKE_JS_VERSIONS +) +if (NOT DEFINED CMAKE_JS_VERSIONS OR "${CMAKE_JS_VERSIONS}" STREQUAL "") + message(FATAL_ERROR "Failed to find cmake-js and nodejs versions!") +endif() +string(REGEX MATCH "CMAKEJS_VERSION ([0-9a-zA-Z\.]+)" _ ${CMAKE_JS_VERSIONS}) +set(CMAKEJS_VERSION ${CMAKE_MATCH_1}) +string(REGEX MATCH "NODE_RUNTIME ([0-9a-zA-Z\.]+)" _ ${CMAKE_JS_VERSIONS}) +set(NODE_RUNTIME ${CMAKE_MATCH_1}) +string(REGEX MATCH "NODE_RUNTIMEVERSION ([0-9a-zA-Z\.]+)" _ ${CMAKE_JS_VERSIONS}) +set(NODE_RUNTIMEVERSION ${CMAKE_MATCH_1}) +string(REGEX MATCH "NODE_ARCH ([0-9a-zA-Z\.]+)" _ ${CMAKE_JS_VERSIONS}) +set(NODE_ARCH ${CMAKE_MATCH_1}) + +# cmake-js version of CMake `add_library` specifically for node addons +FUNCTION (cmake_js_add_node_addon PROJECT_NAME) + cmake_parse_arguments( + PARSED_ARGS # prefix of output variables + "OLD_ADDON_API" # list of names of the boolean arguments (only defined ones will be true) + "" # list of names of mono-valued arguments + "SOURCES" # list of names of multi-valued arguments (output variables are lists) + ${ARGN} # arguments of the function to parse, here we take the all original ones + ) + + # windows delay hook + set(CMAKE_JS_SRC "") + if (MSVC) + list (append CMAKE_JS_SRC "${CMAKE_CURRENT_LIST_DIR}/cpp/win_delay_load_hook.cc") + endif() + + # Setup the library and some default config + add_library(${PROJECT_NAME} SHARED ${PARSED_ARGS_SOURCES} ${CMAKE_JS_SRC}) + set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") + + if (OLD_ADDON_API) + # # Try finding nan + # execute_process(COMMAND node -p "require('nan').include" + # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + # OUTPUT_VARIABLE NODE_NAN_DIR + # OUTPUT_STRIP_TRAILING_WHITESPACE + # ) + # if (DEFINED NODE_ADDON_API_DIR AND NOT "${NODE_NAN_DIR}" STREQUAL "") + # string(REGEX REPLACE "[\"]" "" NODE_NAN_DIR ${NODE_NAN_DIR}) + # message("Found nan: ${NODE_NAN_DIR}") + # target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_NAN_DIR}) + # endif() + + # TODO nan and headers + else() + # Find node-addon-api + execute_process(COMMAND node -p "require('node-api-headers').include_dir" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE NODE_API_HEADERS_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (DEFINED NODE_API_HEADERS_DIR AND NOT "${NODE_API_HEADERS_DIR}" STREQUAL "") + message("Found node-api-headers: ${NODE_API_HEADERS_DIR}") + target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_API_HEADERS_DIR}) + else() + message(FATAL_ERROR "Failed to find node-api-headers!") + endif() + + # Try finding node-addon-api + execute_process(COMMAND node -p "require('node-addon-api').include" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE NODE_ADDON_API_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (DEFINED NODE_ADDON_API_DIR AND NOT "${NODE_ADDON_API_DIR}" STREQUAL "") + string(REGEX REPLACE "[\"]" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR}) + message("Found node-addon-api: ${NODE_ADDON_API_DIR}") + target_include_directories(${PROJECT_NAME} PRIVATE ${NODE_ADDON_API_DIR}) + endif() + + # Generate node.lib if needed + set(CMAKE_JS_NODELIB_DEF "") # TODO + if(MSVC AND CMAKE_JS_NODELIB_DEF) + # Generate node.lib + set(CMAKE_JS_NODELIB_TARGET "${CMAKE_BINARY_DIR}/node.lib") + execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS}) + target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_NODELIB_TARGET}) + endif() + endif() + +ENDFUNCTION () \ No newline at end of file diff --git a/bin/cmake-js-versions b/bin/cmake-js-versions new file mode 100755 index 00000000..04e2cc22 --- /dev/null +++ b/bin/cmake-js-versions @@ -0,0 +1,9 @@ +#!/usr/bin/env node +'use strict' + +const version = require('../package').version + +console.log(`CMAKEJS_VERSION ${version}`) +console.log(`NODE_RUNTIME node`) +console.log(`NODE_RUNTIMEVERSION ${process.version.slice(1)}`) +console.log(`NODE_ARCH ${process.arch}`)