From 128f0a22dab39d9ee4c380529ae2dc4466eaba78 Mon Sep 17 00:00:00 2001 From: Brendan Le Foll Date: Wed, 18 Mar 2015 12:20:54 +0000 Subject: [PATCH] nodejs: add infra to detect nodejs version This introduces FindNodes.cmake which finds the v8 version and the nodejs interp version and passes the information to SWIG via SWIG_V8_VERSION Signed-off-by: Brendan Le Foll --- cmake/modules/FindNodejs.cmake | 59 ++++++++++++++++++++++++++++++++++ src/javascript/CMakeLists.txt | 19 +++++------ src/javascript/mraajs.i | 5 ++- 3 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 cmake/modules/FindNodejs.cmake diff --git a/cmake/modules/FindNodejs.cmake b/cmake/modules/FindNodejs.cmake new file mode 100644 index 0000000..cac8943 --- /dev/null +++ b/cmake/modules/FindNodejs.cmake @@ -0,0 +1,59 @@ +find_program (NODE_EXECUTABLE NAMES node + HINTS + $ENV{NODE_DIR} + PATH_SUFFIXES bin + DOC "Node.js interpreter" +) + +include (FindPackageHandleStandardArgs) + +find_path (NODE_ROOT_DIR "node/node.h" "src/node.h" + PATHS /usr/include/nodejs /usr/local/include/nodejs) + +set (NODE_INCLUDE_DIRS + ${NODE_ROOT_DIR}/src + ${NODE_ROOT_DIR}/node + ${NODE_ROOT_DIR}/deps/v8/include + ${NODE_ROOT_DIR}/deps/uv/include +) + +find_package_handle_standard_args (Node DEFAULT_MSG + NODE_EXECUTABLE + NODE_INCLUDE_DIRS +) + +if (NODE_EXECUTABLE) + execute_process(COMMAND ${NODE_EXECUTABLE} --version + OUTPUT_VARIABLE _VERSION + RESULT_VARIABLE _NODE_VERSION_RESULT) + execute_process(COMMAND ${NODE_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_MAJOR "14") + set (V8_VERSION_MAJOR "5") + set (V8_VERSION_STRING "3.28.72") + message ("defaulted to node 0.10.30") + endif () + message ("INFO - Node version is " ${NODE_VERSION_STRING} "INFO - Node using v8 " ${V8_VERSION_STRING}) +endif () + +mark_as_advanced (NODE_EXECUTABLE) diff --git a/src/javascript/CMakeLists.txt b/src/javascript/CMakeLists.txt index d4d9356..988690f 100644 --- a/src/javascript/CMakeLists.txt +++ b/src/javascript/CMakeLists.txt @@ -1,20 +1,17 @@ -find_path (NODE_ROOT_DIR "node/node.h" "src/node.h" - PATHS /usr/include/nodejs /usr/local/include/nodejs) - -set (NODE_INCLUDE_DIRS - ${NODE_ROOT_DIR}/src - ${NODE_ROOT_DIR}/node - ${NODE_ROOT_DIR}/deps/v8/include - ${NODE_ROOT_DIR}/deps/uv/include -) +find_package (Nodejs) include_directories ( ${NODE_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/.. ) -# SWIG treats SWIG_FLAGS as a list and not a string so semicolon seperation is required -set_source_files_properties (mraajs.i PROPERTIES SWIG_FLAGS "-node;-I${CMAKE_BINARY_DIR}/src") +# SWIG treats SWIG_FLAGS as a list and not a string so semicolon seperation is +# required. This hardcodes V8_VERSION to be <10 but I assume that's not going +# to be a problem for a little while! +#set_source_files_properties (mraajs.i PROPERTIES SWIG_FLAGS "-node;-DV8_VERSION=0x0${V8_VERSION_HEX};-I${CMAKE_BINARY_DIR}/src") +#set_source_files_properties (mraajs.i PROPERTIES SWIG_FLAGS "-node;-I${CMAKE_BINARY_DIR}/src") +set_property (SOURCE mraajs.i PROPERTY SWIG_FLAGS "-node" + "-I${CMAKE_BINARY_DIR}/src" "-DV8_VERSION=0x0${V8_VERSION_MAJOR}${V8_VERSION_MINOR}${V8_VERSION_PATCH}") set_source_files_properties (mraajs.i PROPERTIES CPLUSPLUS ON) swig_add_module (mraajs javascript mraajs.i ${mraa_LIB_SRCS}) diff --git a/src/javascript/mraajs.i b/src/javascript/mraajs.i index 832bea1..caf64fb 100644 --- a/src/javascript/mraajs.i +++ b/src/javascript/mraajs.i @@ -1,7 +1,6 @@ %module (docstring="Javascript interface to libmraa") mraa %feature("autodoc", "3"); -#define NODE012 %include carrays.i %include cpointer.i @@ -29,7 +28,7 @@ namespace mraa { class Spi; %typemap(out) uint8_t* { -#ifdef NODE012 +#if V8_VERSION > 0x032872 $result = node::Buffer::New((char*) $1, arg3); #else $result = node::Buffer::New((char*) $1, arg3)->handle_; @@ -60,7 +59,7 @@ class Spi; SWIG_exception_fail(SWIG_ERROR, "I2c write failed"); SWIGV8_RETURN(SWIGV8_UNDEFINED()); } -#ifdef NODE012 +#if V8_VERSION > 0x032872 $result = node::Buffer::New((char*) $1, result); #else $result = node::Buffer::New((char*) $1, result)->handle_;