Skip to content

Commit

Permalink
wip: add cmake helper module
Browse files Browse the repository at this point in the history
  • Loading branch information
Julusian committed Jan 22, 2024
1 parent aa65731 commit 8d611b1
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
106 changes: 106 additions & 0 deletions 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$<$<CONFIG:Debug>: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 ()
9 changes: 9 additions & 0 deletions 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}`)

0 comments on commit 8d611b1

Please sign in to comment.