Skip to content

Commit

Permalink
Add Javascript modular interface build framework
Browse files Browse the repository at this point in the history
  • Loading branch information
vigsterkr committed Jul 28, 2016
1 parent 49b7b11 commit f34f2ac
Show file tree
Hide file tree
Showing 8 changed files with 258 additions and 2 deletions.
6 changes: 6 additions & 0 deletions .travis.yml
Expand Up @@ -60,6 +60,12 @@ matrix:
- CMAKE_OPTIONS="-DRModular=ON -DTRAVIS_DISABLE_UNIT_TESTS=ON -DTRAVIS_DISABLE_LIBSHOGUN_TESTS=ON -DTRAVIS_DISABLE_META_INTEGRATION_TESTS=ON"
- CC=clang
- CXX=clang++
- compiler: clang
services: docker
env:
- CMAKE_OPTIONS="-DJavascriptModular=ON -DJAVASCRIPT_EXTENSION=V8 -DTRAVIS_DISABLE_UNIT_TESTS=ON -DTRAVIS_DISABLE_LIBSHOGUN_TESTS=ON -DTRAVIS_DISABLE_META_INTEGRATION_TESTS=ON"
- CC=clang
- CXX=clang++
before_install:
- docker pull shogun/shogun-dev
- echo $CC; echo $CXX
Expand Down
12 changes: 11 additions & 1 deletion CMakeLists.txt
Expand Up @@ -83,7 +83,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src
IF (
PythonModular OR LuaModular OR RModular OR
OctaveModular OR JavaModular OR PerlModular OR
RubyModular OR CSharpModular
RubyModular OR CSharpModular OR JavascriptModular
)

SET(SWIG_VERSION_MINIMUM 2.0.4)
Expand Down Expand Up @@ -383,6 +383,7 @@ OPTION(JavaModular "Java Modular" OFF)
OPTION(PerlModular "Perl Modular" OFF)
OPTION(RubyModular "Ruby Modular" OFF)
OPTION(CSharpModular "CSharp Modular" OFF)
OPTION(JavascriptModular "Javascript Modular" OFF)

OPTION(PythonStatic "Python Static" OFF)
OPTION(RStatic "R Static" OFF)
Expand Down Expand Up @@ -1111,6 +1112,14 @@ IF (PerlModular)
ENDIF()
ENDIF()

SET_PROPERTY(CACHE JAVASCRIPT_EXTENSION PROPERTY STRINGS JSC V8 NODE)
# javascript modular
IF (JavascriptModular)
IF(EXISTS ${CMAKE_SOURCE_DIR}/src/interfaces/javascript_modular)
add_subdirectory(${CMAKE_SOURCE_DIR}/src/interfaces/javascript_modular)
ENDIF()
ENDIF()

IF (MatlabStatic)
FIND_PACKAGE(Matlab REQUIRED)
IF(MATLAB_FOUND)
Expand Down Expand Up @@ -1224,6 +1233,7 @@ PrintInterfaceStatus("ruby modular" RubyModular)
PrintInterfaceStatus("csharp modular" CSharpModular)
PrintInterfaceStatus("R modular" RModular)
PrintInterfaceStatus("lua modular" LuaModular)
PrintInterfaceStatus("javascript modular" JavascriptModular)

message(STATUS "")
message(STATUS "")
Expand Down
50 changes: 50 additions & 0 deletions cmake/FindJavaScriptCore.cmake
@@ -0,0 +1,50 @@
# Author: Matt Langston
# Created: 2014.09.03
#
# Try to find JavaScriptCore. Once done this will define:
#
# JavaScriptCore_FOUND - system has JavaScriptCore
# JavaScriptCore_INCLUDE_DIRS - the include directory
# JavaScriptCore_LIBRARY_DIR - the directory containing the library
# JavaScriptCore_LIBRARIES - link these to use JavaScriptCore


find_package(PkgConfig)

pkg_check_modules(PC_JavaScriptCore QUIET JavaScriptCore)

find_path(JavaScriptCore_INCLUDE_DIRS
NAMES JavaScriptCore/JavaScript.h
HINTS ${PC_JavaScriptCore_INCLUDE_DIRS} ${PC_JavaScriptCore_INCLUDEDIR}
PATHS ENV JavaScriptCore_HOME
PATH_SUFFIXES includes
)

set(JavaScriptCore_ARCH "x86")
if(CMAKE_GENERATOR MATCHES "^Visual Studio .+ ARM$")
set(JavaScriptCore_ARCH "arm")
endif()

find_library(JavaScriptCore_LIBRARIES
NAMES JavaScriptCore JavaScriptCore-Debug JavaScriptCore-Release
HINTS ${PC_JavaScriptCore_LIBRARY_DIRS} ${PC_JavaScriptCore_LIBDIR}
PATHS ENV JavaScriptCore_HOME
PATH_SUFFIXES ${JavaScriptCore_ARCH}
)

if(NOT JavaScriptCore_LIBRARIES MATCHES ".+-NOTFOUND")
get_filename_component(JavaScriptCore_LIBRARY_DIR ${JavaScriptCore_LIBRARIES} DIRECTORY)

# If we found the JavaScriptCore library and we're using a Visual
# Studio generator and we're targeting either WindowsStore or
# WindowsPhone, then allow Visual Studio to use both the
# JavaScriptCore-Debug.lib and JavaScriptCore-Release.lib if they
# exist.
if(CMAKE_GENERATOR MATCHES "^Visual Studio .+" AND CMAKE_SYSTEM_NAME MATCHES "^Windows(Store|Phone)")
string(REGEX REPLACE "-(Debug|Release)" "-$(Configuration)" JavaScriptCore_LIBRARIES ${JavaScriptCore_LIBRARIES})
endif()

endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(JavaScriptCore DEFAULT_MSG JavaScriptCore_INCLUDE_DIRS JavaScriptCore_LIBRARIES)
116 changes: 116 additions & 0 deletions cmake/FindV8.cmake
@@ -0,0 +1,116 @@
# Locate V8
# This module defines
# V8_LIBRARY
# V8_FOUND, if false, do not try to link to V8
# V8_INCLUDE_DIR, where to find the headers

FIND_PATH(V8_INCLUDE_DIR v8.h
${V8_DIR}/include
$ENV{V8_DIR}/include
$ENV{V8_DIR}
~/Library/Frameworks
/Library/Frameworks
/usr/local/include
/usr/include
/sw/include # Fink
/opt/local/include # DarwinPorts
/opt/csw/include # Blastwave
/opt/include
/usr/freeware/include
/devel
)

# On non-Unix platforms (Mac and Windows specifically based on the forum),
# V8 builds separate shared (or at least linkable) libraries for v8_base and v8_snapshot
IF(NOT UNIX)
FIND_LIBRARY(V8_BASE_LIBRARY
NAMES v8_base v8_base.ia32 v8_base.x64 libv8_base
PATHS
${V8_DIR}
${V8_DIR}/lib
${V8_DIR}/build/Release/lib
$ENV{V8_DIR}
$ENV{V8_DIR}/lib
~/Library/Frameworks
/Library/Frameworks
/usr/local/lib
/usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
/usr/freeware/lib64
)

FIND_LIBRARY(V8_SNAPSHOT_LIBRARY
NAMES v8_snapshot libv8_snapshot
PATHS
${V8_DIR}
${V8_DIR}/lib
${V8_DIR}/build/Release/lib
$ENV{V8_DIR}
$ENV{V8_DIR}/lib
~/Library/Frameworks
/Library/Frameworks
/usr/local/lib
/usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
/usr/freeware/lib64
)

FIND_LIBRARY(V8_SNAPSHOT_LIBRARY_DEBUG
NAMES v8_snapshot libv8_snapshot
PATHS
${V8_DIR}
${V8_DIR}/lib
${V8_DIR}/build/Debug/lib
$ENV{V8_DIR}
$ENV{V8_DIR}/lib
~/Library/Frameworks
/Library/Frameworks
/usr/local/lib
/usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
/usr/freeware/lib64
)

# On Linux, there is just a libv8.so shared library built.
# (well, there are pseudo-static libraries libv8_base.a and libv8_snapshot.a
# but they don't seem to link correctly)
ELSE()
FIND_LIBRARY(V8_LIBRARY
NAMES v8
PATHS
${V8_DIR}
${V8_DIR}/lib
${V8_DIR}/build/Release/lib
# Having both architectures listed is problematic if both have been
# built (which is the default)
${V8_DIR}/out/ia32.release/lib.target/
${V8_DIR}/out/x64.release/lib.target/
$ENV{V8_DIR}
$ENV{V8_DIR}/lib
~/Library/Frameworks
/Library/Frameworks
/usr/local/lib
/usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
/usr/freeware/lib64
)
ENDIF(NOT UNIX)

include(FindPackageHandleStandardArgs)
IF(NOT UNIX)
find_package_handle_standard_args(V8 REQUIRED_VARS V8_BASE_LIBRARY V8_SNAPSHOT_LIBRARY V8_INCLUDE_DIR)
ELSE()
find_package_handle_standard_args(V8 REQUIRED_VARS V8_LIBRARY V8_INCLUDE_DIR)
ENDIF()
2 changes: 1 addition & 1 deletion configs/Dockerfile
Expand Up @@ -21,7 +21,7 @@ RUN apt-get install -qq --force-yes --no-install-recommends make gcc g++ \
python-jinja2 git-core wget jblas mono-devel mono-gmcs cli-common-dev \
lua5.1 liblua5.1-0-dev octave liboctave-dev r-base-core clang \
oracle-java8-installer ruby ruby-dev python-ply sphinx-doc python-pip \
exuberant-ctags
exuberant-ctags libv8-dev

RUN pip install sphinxcontrib-bibtex

Expand Down
22 changes: 22 additions & 0 deletions src/interfaces/javascript_modular/CMakeLists.txt
@@ -0,0 +1,22 @@
IF(${JAVASCRIPT_EXTENSION} MATCHES "JSC")
FIND_PACKAGE(JavaScriptCore REQUIRED)
include_directories(${JavaScriptCore_INCLUDE_DIRS})
SET(JSE_LDFLAG ${JavaScriptCore_LIBRARIES})
SET(TARGET_SWIGFLAGS "-jsc")
ELSEIF(${JAVASCRIPT_EXTENSION} MATCHES "V8")
FIND_PACKAGE(V8 REQUIRED)
include_directories(${V8_INCLUDE_DIR})
SET(JSE_LDFLAG ${V8_LIBRARY})
SET(TARGET_SWIGFLAGS "-v8")
ELSEIF(${JAVASCRIPT_EXTENSION} MATCHES "NODE")
FIND_PACKAGE(NodeJS REQUIRED)
include_directories(${NodeJS_INCLUDE_DIRS})
SET(TARGET_SWIGFLAGS "-node")
ELSE()
MESSAGE(FATAL_ERROR "Unkown javascript extension type specified, please choose from: JSC, NODE, V8")
ENDIF()

include(CommonModularInterface)

SET(JAVASCRIPT_MODULAR_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
GENERATE_MODULAR_TARGET(javascript ${CMAKE_CURRENT_SOURCE_DIR} ${JSE_LDFLAG})
21 changes: 21 additions & 0 deletions src/interfaces/javascript_modular/sg_print_functions.cpp
@@ -0,0 +1,21 @@
#include <shogun/io/SGIO.h>
#include <stdio.h>

void sg_global_print_message(FILE* target, const char* str)
{
fprintf(target, "%s", str);
}

void sg_global_print_warning(FILE* target, const char* str)
{
fprintf(target, "%s", str);
}

void sg_global_print_error(FILE* target, const char* str)
{
fprintf(target, "%s", str);
}

void sg_global_cancel_computations(bool &delayed, bool &immediately)
{
}
31 changes: 31 additions & 0 deletions src/interfaces/javascript_modular/swig_typemaps.i
@@ -0,0 +1,31 @@
/*
* Copyright (c) The Shogun Machine Learning Toolbox
* Written (w) 2016 Viktor Gal
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those
* of the authors and should not be interpreted as representing official policies,
* either expressed or implied, of the Shogun Development Team.
*
*/

0 comments on commit f34f2ac

Please sign in to comment.