nodejs: add infra to detect nodejs version
authorBrendan Le Foll <brendan.le.foll@intel.com>
Wed, 18 Mar 2015 12:20:54 +0000 (12:20 +0000)
committerBrendan Le Foll <brendan.le.foll@intel.com>
Thu, 19 Mar 2015 18:26:05 +0000 (18:26 +0000)
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 <brendan.le.foll@intel.com>
cmake/modules/FindNodejs.cmake [new file with mode: 0644]
src/javascript/CMakeLists.txt
src/javascript/mraajs.i

diff --git a/cmake/modules/FindNodejs.cmake b/cmake/modules/FindNodejs.cmake
new file mode 100644 (file)
index 0000000..cac8943
--- /dev/null
@@ -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)
index d4d9356..988690f 100644 (file)
@@ -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})
index 832bea1..caf64fb 100644 (file)
@@ -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_;