@@ -105,12 +105,7 @@ endif()
105105
106106set (NODEJS_INCLUDE_PATHS
107107 /usr
108- )
109-
110- find_path (NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
111- PATHS ${NODEJS_INCLUDE_PATHS}
112- PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
113- DOC "NodeJS JavaScript Runtime Headers"
108+ /usr/local
114109)
115110
116111# Find NodeJS executable
@@ -155,8 +150,34 @@ if(NODEJS_EXECUTABLE)
155150
156151 # TODO: Implement V8 version by command?
157152
153+ # Check if NodeJS executable only is requested
154+ if (NODEJS_EXECUTABLE_ONLY)
155+ find_package_handle_standard_args(NODEJS
156+ REQUIRED_VARS NODEJS_EXECUTABLE
157+ VERSION_VAR NODEJS_VERSION
158+ )
159+
160+ mark_as_advanced (NODEJS_EXECUTABLE)
161+
162+ if (NODEJS_CMAKE_DEBUG)
163+ message (STATUS "NODEJS_VERSION: ${NODEJS_VERSION} " )
164+ message (STATUS "NODEJS_UV_VERSION: ${NODEJS_UV_VERSION} " )
165+ message (STATUS "NODEJS_V8_VERSION: ${NODEJS_V8_VERSION} " )
166+ message (STATUS "NODEJS_V8_VERSION_HEX: ${NODEJS_V8_VERSION_HEX} " )
167+ message (STATUS "NODEJS_EXECUTABLE: ${NODEJS_EXECUTABLE} " )
168+ endif ()
169+
170+ return ()
171+ endif ()
158172endif ()
159173
174+ # Find NodeJS includes
175+ find_path (NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
176+ PATHS ${NODEJS_INCLUDE_PATHS}
177+ PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
178+ DOC "NodeJS JavaScript Runtime Headers"
179+ )
180+
160181# Detect NodeJS V8 version
161182if (NODEJS_INCLUDE_DIR)
162183 find_file (NODEJS_V8_VERSION_FILE_PATH v8-version .h
@@ -208,55 +229,36 @@ if(NODEJS_INCLUDE_DIR)
208229 endif ()
209230endif ()
210231
211- # Check if NodeJS executable only is requested
212- if (NODEJS_EXECUTABLE_ONLY)
213- find_package_handle_standard_args(NODEJS
214- REQUIRED_VARS NODEJS_EXECUTABLE
215- VERSION_VAR NODEJS_VERSION
232+ if (NODEJS_MODULE_VERSION)
233+ # NodeJS library names
234+ set (NODEJS_LIBRARY_NAMES
235+ libnode.so.${NODEJS_MODULE_VERSION}
236+ libnode.${NODEJS_MODULE_VERSION} .dylib
237+ libnode.${NODEJS_MODULE_VERSION} .dll
238+ node.lib
216239 )
217240
218- mark_as_advanced (NODEJS_EXECUTABLE)
241+ if (WIN32 )
242+ set (NODEJS_COMPILE_PATH "${NODEJS_OUTPUT_PATH} /${CMAKE_BUILD_TYPE} " )
243+ else ()
244+ set (NODEJS_COMPILE_PATH "${NODEJS_OUTPUT_PATH} /out/${CMAKE_BUILD_TYPE} " )
245+ endif ()
219246
220- if (NODEJS_CMAKE_DEBUG)
221- message (STATUS "NODEJS_VERSION: ${NODEJS_VERSION} " )
222- message (STATUS "NODEJS_UV_VERSION: ${NODEJS_UV_VERSION} " )
223- message (STATUS "NODEJS_V8_VERSION: ${NODEJS_V8_VERSION} " )
224- message (STATUS "NODEJS_V8_VERSION_HEX: ${NODEJS_V8_VERSION_HEX} " )
225- message (STATUS "NODEJS_EXECUTABLE: ${NODEJS_EXECUTABLE} " )
247+ if (WIN32 )
248+ set (NODEJS_LIBRARY_PATH "${NODEJS_COMPILE_PATH} " ) # TODO: Set a valid install path
249+ else ()
250+ set (NODEJS_LIBRARY_PATH "/usr/local/lib" )
226251 endif ()
227252
228- return ()
253+ # Find library
254+ find_library (NODEJS_LIBRARY
255+ NAMES ${NODEJS_LIBRARY_NAMES}
256+ PATHS ${NODEJS_COMPILE_PATH} ${NODEJS_LIBRARY_PATH}
257+ DOC "NodeJS JavaScript Runtime Library"
258+ )
229259endif ()
230260
231261# TODO: Remove this workaround when NodeJS begins to distribute node as a shared library (maybe never?)
232-
233- # NodeJS library names
234- set (NODEJS_LIBRARY_NAMES
235- libnode.so.${NODEJS_MODULE_VERSION}
236- libnode.${NODEJS_MODULE_VERSION} .dylib
237- libnode.${NODEJS_MODULE_VERSION} .dll
238- node.lib
239- )
240-
241- if (WIN32 )
242- set (NODEJS_COMPILE_PATH "${NODEJS_OUTPUT_PATH} /${CMAKE_BUILD_TYPE} " )
243- else ()
244- set (NODEJS_COMPILE_PATH "${NODEJS_OUTPUT_PATH} /out/${CMAKE_BUILD_TYPE} " )
245- endif ()
246-
247- if (WIN32 )
248- set (NODEJS_LIBRARY_PATH "${NODEJS_COMPILE_PATH} " ) # TODO: Set a valid install path
249- else ()
250- set (NODEJS_LIBRARY_PATH "/usr/local/lib" )
251- endif ()
252-
253- # Find library
254- find_library (NODEJS_LIBRARY
255- NAMES ${NODEJS_LIBRARY_NAMES}
256- PATHS ${NODEJS_COMPILE_PATH} ${NODEJS_LIBRARY_PATH}
257- DOC "NodeJS JavaScript Runtime Library"
258- )
259-
260262if (NOT NODEJS_LIBRARY)
261263 # NodeJS download and output path (workaround to compile node as a shared library)
262264 set (NODEJS_DOWNLOAD_URL "https://nodejs.org/dist/v${NODEJS_VERSION} /node-v${NODEJS_VERSION} .tar.gz" )
@@ -349,12 +351,82 @@ if(NOT NODEJS_LIBRARY)
349351 endif ()
350352 endif ()
351353
352- # Find library
353- find_library (NODEJS_LIBRARY
354- NAMES ${NODEJS_LIBRARY_NAMES}
355- PATHS ${NODEJS_LIBRARY_PATH}
356- DOC "NodeJS JavaScript Runtime Library"
357- )
354+ if (NOT NODEJS_INCLUDE_DIR)
355+ # Find NodeJS includes
356+ find_path (NODEJS_INCLUDE_DIR ${NODEJS_HEADERS}
357+ PATHS ${NODEJS_INCLUDE_PATHS}
358+ PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
359+ DOC "NodeJS JavaScript Runtime Headers"
360+ )
361+
362+ # Detect NodeJS V8 version
363+ if (NODEJS_INCLUDE_DIR)
364+ find_file (NODEJS_V8_VERSION_FILE_PATH v8-version .h
365+ PATHS ${NODEJS_INCLUDE_DIR}
366+ PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
367+ DOC "NodeJS V8 JavaScript Version Header"
368+ )
369+
370+ if (NODEJS_V8_VERSION_FILE_PATH)
371+ file (READ ${NODEJS_V8_VERSION_FILE_PATH} NODEJS_V8_VERSION_FILE)
372+
373+ string (REGEX MATCH "#define V8_MAJOR_VERSION ([0-9]+)" NODEJS_V8_VERSION_MAJOR_DEF ${NODEJS_V8_VERSION_FILE} )
374+ string (REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_MAJOR ${NODEJS_V8_VERSION_MAJOR_DEF} )
375+
376+ string (REGEX MATCH "#define V8_MINOR_VERSION ([0-9]+)" NODEJS_V8_VERSION_MINOR_DEF ${NODEJS_V8_VERSION_FILE} )
377+ string (REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_MINOR ${NODEJS_V8_VERSION_MINOR_DEF} )
378+
379+ string (REGEX MATCH "#define V8_BUILD_NUMBER ([0-9]+)" NODEJS_V8_VERSION_PATCH_DEF ${NODEJS_V8_VERSION_FILE} )
380+ string (REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_PATCH ${NODEJS_V8_VERSION_PATCH_DEF} )
381+
382+ string (REGEX MATCH "#define V8_PATCH_LEVEL ([0-9]+)" NODEJS_V8_VERSION_TWEAK_DEF ${NODEJS_V8_VERSION_FILE} )
383+ string (REGEX MATCH "([0-9]+)$" NODEJS_V8_VERSION_TWEAK ${NODEJS_V8_VERSION_TWEAK_DEF} )
384+
385+ set (NODEJS_V8_VERSION "${NODEJS_V8_VERSION_MAJOR} .${NODEJS_V8_VERSION_MINOR} .${NODEJS_V8_VERSION_PATCH} .${NODEJS_V8_VERSION_TWEAK} " )
386+
387+ set (NODEJS_V8_VERSION_HEX 0x0${NODEJS_V8_VERSION_MAJOR}${NODEJS_V8_VERSION_MINOR}${NODEJS_V8_VERSION_PATCH}${NODEJS_V8_VERSION_TWEAK} )
388+ string (LENGTH "${NODEJS_V8_VERSION_HEX} " NODEJS_V8_VERSION_HEX_LENGTH)
389+
390+ while (NODEJS_V8_VERSION_HEX_LENGTH LESS 8)
391+
392+ set (NODEJS_V8_VERSION_HEX "${NODEJS_V8_VERSION_HEX} 0" )
393+ string (LENGTH "${NODEJS_V8_VERSION_HEX} " NODEJS_V8_VERSION_HEX_LENGTH)
394+
395+ endwhile ()
396+ endif ()
397+
398+ # Get node version
399+ find_file (NODEJS_VERSION_FILE_PATH node_version.h
400+ PATHS ${NODEJS_INCLUDE_DIR}
401+ PATH_SUFFIXES ${NODEJS_INCLUDE_SUFFIXES}
402+ DOC "NodeJS JavaScript Version Header"
403+ )
404+
405+ if (NODEJS_VERSION_FILE_PATH)
406+ file (READ ${NODEJS_VERSION_FILE_PATH} NODEJS_VERSION_FILE)
407+
408+ string (REGEX MATCH "#define NODE_MODULE_VERSION ([0-9]+)" NODEJS_MODULE_VERSION_DEF ${NODEJS_VERSION_FILE} )
409+ string (REGEX MATCH "([0-9]+)$" NODEJS_MODULE_VERSION ${NODEJS_MODULE_VERSION_DEF} )
410+ endif ()
411+ endif ()
412+ endif ()
413+
414+ if (NODEJS_MODULE_VERSION)
415+ # NodeJS library names
416+ set (NODEJS_LIBRARY_NAMES
417+ libnode.so.${NODEJS_MODULE_VERSION}
418+ libnode.${NODEJS_MODULE_VERSION} .dylib
419+ libnode.${NODEJS_MODULE_VERSION} .dll
420+ node.lib
421+ )
422+
423+ # Find library
424+ find_library (NODEJS_LIBRARY
425+ NAMES ${NODEJS_LIBRARY_NAMES}
426+ PATHS ${NODEJS_LIBRARY_PATH}
427+ DOC "NodeJS JavaScript Runtime Library"
428+ )
429+ endif ()
358430endif ()
359431
360432find_package_handle_standard_args(NODEJS
0 commit comments