Skip to content

Commit 7e8d9ba

Browse files
committed
Solve bug in FindNodeJS CMake script, when building the library, if the node distribution is installed from apt instead of in the way it is done in the tools/node/Dockerfile, it could not find the headers, so after building and installing the node library, we must search again for finding the headers.
1 parent 6e27258 commit 7e8d9ba

File tree

1 file changed

+125
-53
lines changed

1 file changed

+125
-53
lines changed

cmake/FindNodeJS.cmake

Lines changed: 125 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,7 @@ endif()
105105

106106
set(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()
158172
endif()
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
161182
if(NODEJS_INCLUDE_DIR)
162183
find_file(NODEJS_V8_VERSION_FILE_PATH v8-version.h
@@ -208,55 +229,36 @@ if(NODEJS_INCLUDE_DIR)
208229
endif()
209230
endif()
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+
)
229259
endif()
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-
260262
if(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()
358430
endif()
359431

360432
find_package_handle_standard_args(NODEJS

0 commit comments

Comments
 (0)