# Macro to add directory to NODEJS_INCLUDE_DIRS if it exists and is not /usr/include macro(add_include_dir dir) if (IS_DIRECTORY ${dir} AND NOT ${dir} STREQUAL "/usr/include") set(NODEJS_INCLUDE_DIRS ${NODEJS_INCLUDE_DIRS} ${dir}) endif() endmacro() find_program (NODEJS_EXECUTABLE NAMES node nodejs HINTS $ENV{NODE_DIR} PATH_SUFFIXES bin DOC "Node.js interpreter" ) include (FindPackageHandleStandardArgs) # If compat-libuv package exists, it must be at start of include path find_path (UV_ROOT_DIR "uv.h" PATHS /usr/include/compat-libuv010 NO_DEFAULT_PATH) if (UV_ROOT_DIR) # set (NODEJS_INCLUDE_DIRS ${UV_ROOT_DIR}) add_include_dir(${UV_ROOT_DIR}) endif() # Now look for node. Flag an error if not found find_path (NODE_ROOT_DIR "include/node/node.h" "include/src/node.h" PATHS /usr/include/nodejs /usr/local/include/nodejs /usr/local/include) if (NODE_ROOT_DIR) add_include_dir(${NODE_ROOT_DIR}/include/src) add_include_dir(${NODE_ROOT_DIR}/include/node) add_include_dir(${NODE_ROOT_DIR}/include/deps/v8/include) add_include_dir(${NODE_ROOT_DIR}/include/deps/uv/include) else() unset(NODEJS_INCLUDE_DIRS) message(ERROR " - node.h not found") endif() # Check that v8.h is in NODEJS_INCLUDE_DIRS find_path (V8_ROOT_DIR "v8.h" PATHS ${NODEJS_INCLUDE_DIRS}) if (NOT V8_ROOT_DIR) unset(NODEJS_INCLUDE_DIRS) message(ERROR " - v8.h not found") endif() # Check that uv.h is in NODEJS_INCLUDE_DIRS find_path (UV_ROOT_DIR "uv.h" PATHS ${NODEJS_INCLUDE_DIRS}) if (NOT UV_ROOT_DIR) unset(NODEJS_INCLUDE_DIRS) message(ERROR " - uv.h not found") endif() find_package_handle_standard_args (Nodejs DEFAULT_MSG NODEJS_EXECUTABLE NODEJS_INCLUDE_DIRS ) if (NODEJS_EXECUTABLE) execute_process(COMMAND ${NODEJS_EXECUTABLE} --version OUTPUT_VARIABLE _VERSION RESULT_VARIABLE _NODE_VERSION_RESULT) execute_process(COMMAND ${NODEJS_EXECUTABLE} -e "console.log(process.versions.v8)" OUTPUT_VARIABLE _V8_VERSION RESULT_VARIABLE _V8_RESULT) if (NOT _NODE_VERSION_RESULT AND NOT _V8_RESULT) string (REPLACE "v" "" NODE_VERSION_STRING "${_VERSION}") string (REPLACE "." ";" _VERSION_LIST "${NODE_VERSION_STRING}") list (GET _VERSION_LIST 0 NODE_VERSION_MAJOR) list (GET _VERSION_LIST 1 NODE_VERSION_MINOR) list (GET _VERSION_LIST 2 NODE_VERSION_PATCH) set (V8_VERSION_STRING ${_V8_VERSION}) string (REPLACE "." ";" _V8_VERSION_LIST "${_V8_VERSION}") list (GET _V8_VERSION_LIST 0 V8_VERSION_MAJOR) list (GET _V8_VERSION_LIST 1 V8_VERSION_MINOR) list (GET _V8_VERSION_LIST 2 V8_VERSION_PATCH) # we end up with a nasty newline so strip everything that isn't a number string (REGEX MATCH "^[0-9]*" V8_VERSION_PATCH ${V8_VERSION_PATCH}) else () set (NODE_VERSION_STRING "0.10.30") set (NODE_VERSION_MAJOR "0") set (NODE_VERSION_MINOR "10") set (NODE_VERSION_PATCH "30") set (V8_VERSION_MAJOR "3") set (V8_VERSION_MINOR"14") set (V8_VERSION_PATCH "5") set (V8_VERSION_STRING "3.28.72") message ("defaulted to node 0.10.30") endif () string (REGEX REPLACE "\n" "" NODE_VERSION_STRING ${NODE_VERSION_STRING}) string (REGEX REPLACE "\n" "" V8_VERSION_STRING ${V8_VERSION_STRING}) message ("INFO - Node version is " ${NODE_VERSION_STRING}) message ("INFO - Node using v8 " ${V8_VERSION_STRING}) mark_as_advanced (NODEJS_EXECUTABLE) endif ()