diff --git a/Examples/Makefile.in b/Examples/Makefile.in index b3292810a..6769fda0b 100644 --- a/Examples/Makefile.in +++ b/Examples/Makefile.in @@ -668,7 +668,7 @@ android_clean: ##### JAVASCRIPT ###### ################################################################## -# Note: These targets are used from withing Makefiles in the Example directories. +# Note: These targets are also from within Makefiles in the Example directories. # There is a common makefile, 'Examples/javascript/js_example.mk' to simplify # create a configuration for a new example. @@ -690,10 +690,10 @@ SWIGJS = $(SWIG) -javascript # ---------------------------------------------------------------- javascript_wrapper: - $(SWIGJS) $(SWIGOPT) $(INTERFACEPATH) + $(SWIGJS) $(SWIGOPT) -o $(INTERFACEDIR)$(TARGET)_wrap.c $(INTERFACEPATH) javascript_wrapper_cpp: $(SRCS) - $(SWIGJS) -c++ $(SWIGOPT) $(INTERFACEPATH) + $(SWIGJS) -c++ $(SWIGOPT) -o $(INTERFACEDIR)$(TARGET)_wrap.cxx $(INTERFACEPATH) javascript_build: $(SRCS) $(CC) -c $(CCSHARED) $(CFLAGS) $(JSCFLAGS) $(ISRCS) $(SRCS) $(INCLUDES) $(JSINCLUDES) @@ -727,7 +727,7 @@ javascript_custom_interpreter: (cd $(ROOT_DIR)/Tools/javascript && $(MAKE) JSENGINE='$(JSENGINE)') javascript_run: javascript_custom_interpreter - $(ROOT_DIR)/Tools/javascript/javascript -$(JSENGINE) runme.js + $(ROOT_DIR)/Tools/javascript/javascript -$(JSENGINE) -L $(TARGET) runme.js # TODO: make node configurable and detected via ./configure javascript_run_node: @@ -741,7 +741,7 @@ javascript_clean: rm -rf build rm -f *_wrap* runme rm -f core @EXTRA_CLEAN@ - rm -f *.@OBJEXT@ *@JSSO@ *.bundle + rm -f *.@OBJEXT@ *@JSSO@ *.$(SO) (cd $(ROOT_DIR)/Tools/javascript && $(MAKE) -s clean) diff --git a/Examples/javascript/js_example.mk b/Examples/javascript/js_example.mk index 7cecd184a..6cb6eb113 100644 --- a/Examples/javascript/js_example.mk +++ b/Examples/javascript/js_example.mk @@ -44,7 +44,7 @@ check: build else check: build - $(MAKE) -f $(EXAMPLES_TOP)/Makefile JSENGINE='$(JSENGINE)' javascript_run + $(MAKE) -f $(EXAMPLES_TOP)/Makefile JSENGINE='$(JSENGINE)' TARGET='$(TARGET)' javascript_run endif diff --git a/Tools/javascript/Makefile.in b/Tools/javascript/Makefile.in index 57e63e88d..32744333f 100644 --- a/Tools/javascript/Makefile.in +++ b/Tools/javascript/Makefile.in @@ -16,6 +16,7 @@ CC = @CC@ # with 'c++' it works... probably some missing flags? CXX = @JSINTERPRETERCXX@ CFLAGS = @BOOST_CPPFLAGS@ @PLATFLAGS@ +LINKFLAGS = @JSINTERPRETERLINKFLAGS@ ROOT_DIR = @ROOT_DIR@ JSCFLAGS = @JSCFLAGS@ @@ -32,24 +33,24 @@ JSCENABLED = @JSCENABLED@ # These settings are provided by 'configure' (see '/configure.in') ifeq (1, $(JSV8ENABLED)) JS_INTERPRETER_SRC_V8 = v8_shell.cxx - JS_INTERPRETER_CXXFLAGS_V8 = -DENABLE_V8 + JS_INTERPRETER_ENABLE_V8 = -DENABLE_V8 endif ifeq (1, $(JSCENABLED)) JS_INTERPRETER_SRC_JSC = jsc_shell.cxx - JS_INTERPRETER_CXXFLAGS_JSC = -DENABLE_JSC + JS_INTERPRETER_ENABLE_JSC = -DENABLE_JSC endif -JS_INTERPRETER_CXXFLAGS = $(JS_INTERPRETER_CXXFLAGS_JSC) $(JS_INTERPRETER_CXXFLAGS_V8) +JS_INTERPRETER_DEFINES = $(JS_INTERPRETER_ENABLE_JSC) $(JS_INTERPRETER_ENABLE_V8) JS_INTERPRETER_SRC = javascript.cxx js_shell.cxx $(JS_INTERPRETER_SRC_JSC) $(JS_INTERPRETER_SRC_V8) JS_INTERPRETER_OBJS = $(JS_INTERPRETER_SRC:.cxx=.o) %.o: %.cxx - $(CXX) $(JS_INTERPRETER_CXXFLAGS) -g $(JSINCLUDES) -o $@ -c $< + $(CXX) $(JS_INTERPRETER_DEFINES) -g $(JSINCLUDES) -o $@ -c $< javascript: $(JS_INTERPRETER_OBJS) - $(CXX) -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names $^ $(CFLAGS) -o javascript $(JSDYNAMICLINKING) + $(CXX) $(LINKFLAGS) $^ $(CFLAGS) -o javascript $(JSDYNAMICLINKING) clean: rm -f *.o diff --git a/Tools/javascript/javascript.cxx b/Tools/javascript/javascript.cxx index e5cb0a47e..5e7cc0b20 100644 --- a/Tools/javascript/javascript.cxx +++ b/Tools/javascript/javascript.cxx @@ -23,13 +23,18 @@ int main(int argc, char* argv[]) { bool interactive = false; JSShell* shell = 0; + std::vector modulePath; + modulePath.push_back("."); + for (int idx = 1; idx < argc; ++idx) { if(strcmp(argv[idx], "-v8") == 0) { - shell = JSShell::Create(JSShell::V8); + shell = JSShell::Create(JSShell::V8); } else if(strcmp(argv[idx], "-jsc") == 0) { - shell = JSShell::Create(JSShell::JSC); + shell = JSShell::Create(JSShell::JSC); } else if(strcmp(argv[idx], "-i") == 0) { interactive = true; + } else if(strcmp(argv[idx], "-L") == 0) { + modulePath.push_back(argv[++idx]); } else { scriptPath = argv[idx]; } @@ -39,6 +44,8 @@ int main(int argc, char* argv[]) { shell = JSShell::Create(); } + shell->setModulePath(modulePath); + bool failed = false; if(interactive) { diff --git a/Tools/javascript/js_shell.cxx b/Tools/javascript/js_shell.cxx index c0ac3da58..5890c922c 100644 --- a/Tools/javascript/js_shell.cxx +++ b/Tools/javascript/js_shell.cxx @@ -41,6 +41,7 @@ std::string JSShell::LoadModule(const std::string& name, HANDLE* library) { std::string lib_name; std::string module_name; + if (pathIdx == std::string::npos) { module_name = name; lib_name = std::string(name).append(LIBRARY_EXT); @@ -50,9 +51,18 @@ std::string JSShell::LoadModule(const std::string& name, HANDLE* library) { lib_name = path.append(module_name).append(LIBRARY_EXT); } - HANDLE handle = LOAD_LIBRARY(lib_name.c_str()); + std::string lib_path; + HANDLE handle = 0; + + for (int i = 0; i < module_path.size(); ++i) { + lib_path = module_path[i] + "/" + lib_name; + if (access( lib_path.c_str(), F_OK ) != -1) { + handle = LOAD_LIBRARY(lib_path.c_str()); + } + } + if(handle == 0) { - std::cerr << "Could not load library " << lib_name << ":" + std::cerr << "Could not find module " << lib_path << ":" << std::endl << LIBRARY_ERROR() << std::endl; return 0; } diff --git a/Tools/javascript/js_shell.h b/Tools/javascript/js_shell.h index 84a8534d6..1e2466b96 100644 --- a/Tools/javascript/js_shell.h +++ b/Tools/javascript/js_shell.h @@ -29,6 +29,10 @@ public: virtual bool RunShell(); + void setModulePath(const std::vector& modulePath) { + module_path = modulePath; + } + protected: virtual bool InitializeEngine() = 0; @@ -42,6 +46,7 @@ protected: protected: std::vector loaded_modules; + std::vector module_path; }; diff --git a/configure.ac b/configure.ac index 09bb65f25..720aebd04 100644 --- a/configure.ac +++ b/configure.ac @@ -1137,12 +1137,14 @@ else JSCXXSHARED='$(CXX) -dynamiclib' # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' + JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSLDSHARED='$(LDSHARED)' JSCXXSHARED='$(CXXSHARED)' JSINTERPRETERCXX='$(CXX)' + JSINTERPRETERLINKFLAGS='-ldl' ;; esac @@ -1309,7 +1311,9 @@ AC_SUBST(JSLIBRARYPREFIX) AC_SUBST(JSSO) AC_SUBST(JSLDSHARED) AC_SUBST(JSCXXSHARED) + AC_SUBST(JSINTERPRETERCXX) +AC_SUBST(JSINTERPRETERLINKFLAGS) AC_SUBST(JSCOREINC) AC_SUBST(JSCOREDYNAMICLINKING)