Skip to content

Commit e5c8369

Browse files
committed
Trying to solve bugs with FindNodeJS headers.
1 parent 42e79c6 commit e5c8369

File tree

1 file changed

+37
-86
lines changed

1 file changed

+37
-86
lines changed

cmake/FindNodeJS.cmake

Lines changed: 37 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,42 @@ find_path(NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
178178
DOC "NodeJS JavaScript Runtime Headers"
179179
)
180180

181-
# Detect NodeJS V8 version
181+
if(NOT NODEJS_INCLUDE_DIR AND NOT NODEJS_VERSION)
182+
# We do not have any way to know what version to install
183+
message(WARNING "NodeJS headers could not be found, neither a valid NodeJS version.")
184+
return()
185+
else()
186+
# TODO: Remove this workaround when NodeJS begins to distribute node as a shared library (maybe never?) with proper includes
187+
188+
# NodeJS download and output path (workaround for NodeJS headers)
189+
set(NODEJS_DOWNLOAD_URL "https://nodejs.org/dist/v${NODEJS_VERSION}/node-v${NODEJS_VERSION}-headers.tar.gz")
190+
set(NODEJS_DOWNLOAD_FILE "${CMAKE_CURRENT_BINARY_DIR}/node-v${NODEJS_VERSION}-headers.tar.gz")
191+
set(NODEJS_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/node-v${NODEJS_VERSION}-headers")
192+
193+
# Download node if needed
194+
if(NOT EXISTS "${NODEJS_DOWNLOAD_FILE}")
195+
message(STATUS "Downloading NodeJS headers")
196+
file(DOWNLOAD ${NODEJS_DOWNLOAD_URL} ${NODEJS_DOWNLOAD_FILE})
197+
endif()
198+
199+
# Decompress node if needed
200+
if(NOT EXISTS "${NODEJS_OUTPUT_PATH}")
201+
message(STATUS "Extract NodeJS headers")
202+
execute_process(COMMAND ${CMAKE_COMMAND} -E tar "xvf" "${NODEJS_DOWNLOAD_FILE}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" OUTPUT_QUIET)
203+
endif()
204+
205+
set(NODEJS_INCLUDE_PATHS ${NODEJS_OUTPUT_PATH})
206+
207+
# Find NodeJS includes
208+
find_path(NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
209+
PATHS ${NODEJS_INCLUDE_PATHS}
210+
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
211+
DOC "NodeJS JavaScript Runtime Headers"
212+
)
213+
endif()
214+
182215
if(NODEJS_INCLUDE_DIR)
216+
# Detect NodeJS V8 version
183217
find_file(NODEJS_V8_VERSION_FILE_PATH v8-version.h
184218
PATHS ${NODEJS_INCLUDE_DIR}
185219
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
@@ -214,7 +248,7 @@ if(NODEJS_INCLUDE_DIR)
214248
endwhile()
215249
endif()
216250

217-
# Get node version
251+
# Get node module version
218252
find_file(NODEJS_VERSION_FILE_PATH node_version.h
219253
PATHS ${NODEJS_INCLUDE_DIR}
220254
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
@@ -229,6 +263,7 @@ if(NODEJS_INCLUDE_DIR)
229263
endif()
230264
endif()
231265

266+
# Find NodeJS library from module version
232267
if(NODEJS_MODULE_VERSION)
233268
# NodeJS library names
234269
set(NODEJS_LIBRARY_NAMES
@@ -351,90 +386,6 @@ if(NOT NODEJS_LIBRARY)
351386
endif()
352387
endif()
353388

354-
if(NOT NODEJS_INCLUDE_DIR)
355-
# TODO: Headers are not properly installed, instead of placing all of them in the same folder
356-
# they are placed in different folders after install (deps/{v8,uv}), this workaround will solve
357-
# the include dependency problem, but this needs to be refactored in the future for properly handling headers,
358-
# meanwhile we will install them manually
359-
360-
# NodeJS download and output path (workaround to compile node as a shared library)
361-
set(NODEJS_DOWNLOAD_URL "https://nodejs.org/dist/v${NODEJS_VERSION}/node-v${NODEJS_VERSION}-headers.tar.gz")
362-
set(NODEJS_DOWNLOAD_FILE "${CMAKE_CURRENT_BINARY_DIR}/node-v${NODEJS_VERSION}-headers.tar.gz")
363-
set(NODEJS_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/node-v${NODEJS_VERSION}-headers")
364-
365-
# Download node if needed
366-
if(NOT EXISTS "${NODEJS_DOWNLOAD_FILE}")
367-
message(STATUS "Downloading NodeJS headers")
368-
file(DOWNLOAD ${NODEJS_DOWNLOAD_URL} ${NODEJS_DOWNLOAD_FILE})
369-
endif()
370-
371-
# Decompress node if needed
372-
if(NOT EXISTS "${NODEJS_OUTPUT_PATH}")
373-
message(STATUS "Extract NodeJS headers")
374-
execute_process(COMMAND ${CMAKE_COMMAND} -E tar "xvf" "${NODEJS_DOWNLOAD_FILE}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" OUTPUT_QUIET)
375-
endif()
376-
377-
set(NODEJS_INCLUDE_PATHS ${NODEJS_OUTPUT_PATH})
378-
379-
# Find NodeJS includes
380-
find_path(NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
381-
PATHS ${NODEJS_INCLUDE_PATHS}
382-
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
383-
DOC "NodeJS JavaScript Runtime Headers"
384-
)
385-
386-
# Detect NodeJS V8 version
387-
if(NODEJS_INCLUDE_DIR)
388-
find_file(NODEJS_V8_VERSION_FILE_PATH v8-version.h
389-
PATHS ${NODEJS_INCLUDE_DIR}
390-
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
391-
DOC "NodeJS V8 JavaScript Version Header"
392-
)
393-
394-
if(NODEJS_V8_VERSION_FILE_PATH)
395-
file(READ ${NODEJS_V8_VERSION_FILE_PATH} NODEJS_V8_VERSION_FILE)
396-
397-
string(REGEX MATCH "#define V8_MAJOR_VERSION ([0-9]+)" NODEJS_V8_VERSION_MAJOR_DEF ${NODEJS_V8_VERSION_FILE})
398-
string(REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_MAJOR ${NODEJS_V8_VERSION_MAJOR_DEF})
399-
400-
string(REGEX MATCH "#define V8_MINOR_VERSION ([0-9]+)" NODEJS_V8_VERSION_MINOR_DEF ${NODEJS_V8_VERSION_FILE})
401-
string(REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_MINOR ${NODEJS_V8_VERSION_MINOR_DEF})
402-
403-
string(REGEX MATCH "#define V8_BUILD_NUMBER ([0-9]+)" NODEJS_V8_VERSION_PATCH_DEF ${NODEJS_V8_VERSION_FILE})
404-
string(REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_PATCH ${NODEJS_V8_VERSION_PATCH_DEF})
405-
406-
string(REGEX MATCH "#define V8_PATCH_LEVEL ([0-9]+)" NODEJS_V8_VERSION_TWEAK_DEF ${NODEJS_V8_VERSION_FILE})
407-
string(REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_TWEAK ${NODEJS_V8_VERSION_TWEAK_DEF})
408-
409-
set(NODEJS_V8_VERSION "${NODEJS_V8_VERSION_MAJOR}.${NODEJS_V8_VERSION_MINOR}.${NODEJS_V8_VERSION_PATCH}.${NODEJS_V8_VERSION_TWEAK}")
410-
411-
set(NODEJS_V8_VERSION_HEX 0x0${NODEJS_V8_VERSION_MAJOR}${NODEJS_V8_VERSION_MINOR}${NODEJS_V8_VERSION_PATCH}${NODEJS_V8_VERSION_TWEAK})
412-
string(LENGTH "${NODEJS_V8_VERSION_HEX}" NODEJS_V8_VERSION_HEX_LENGTH)
413-
414-
while(NODEJS_V8_VERSION_HEX_LENGTH LESS 8)
415-
416-
set(NODEJS_V8_VERSION_HEX "${NODEJS_V8_VERSION_HEX}0")
417-
string(LENGTH "${NODEJS_V8_VERSION_HEX}" NODEJS_V8_VERSION_HEX_LENGTH)
418-
419-
endwhile()
420-
endif()
421-
422-
# Get node version
423-
find_file(NODEJS_VERSION_FILE_PATH node_version.h
424-
PATHS ${NODEJS_INCLUDE_DIR}
425-
PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
426-
DOC "NodeJS JavaScript Version Header"
427-
)
428-
429-
if(NODEJS_VERSION_FILE_PATH)
430-
file(READ ${NODEJS_VERSION_FILE_PATH} NODEJS_VERSION_FILE)
431-
432-
string(REGEX MATCH "#define NODE_MODULE_VERSION ([0-9]+)" NODEJS_MODULE_VERSION_DEF ${NODEJS_VERSION_FILE})
433-
string(REGEX MATCH "([0-9]+)$" NODEJS_MODULE_VERSION ${NODEJS_MODULE_VERSION_DEF})
434-
endif()
435-
endif()
436-
endif()
437-
438389
if(NODEJS_MODULE_VERSION)
439390
# NodeJS library names
440391
set(NODEJS_LIBRARY_NAMES

0 commit comments

Comments
 (0)