@@ -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+
182215if (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 ()
230264endif ()
231265
266+ # Find NodeJS library from module version
232267if (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