From a97dce7523c73b180d0b7c1eae9ef836f5df606e Mon Sep 17 00:00:00 2001 From: Ryan Date: Mon, 31 Aug 2009 11:14:34 +0200 Subject: [PATCH] Build static executable. - Fix a few errors with node.dlopen() - Report errors to stderr (this should probably be a separate commit, but whatever) --- src/node.cc | 37 +++++++++++++++++++------------------ src/node.js | 28 +++++++++++++++++++++++++++- src/node.pc.in | 4 ++-- src/node_version.h.in | 15 ++++++++++++--- wscript | 34 ++++++++++++++++++++++++---------- 5 files changed, 84 insertions(+), 34 deletions(-) diff --git a/src/node.cc b/src/node.cc index e399f3db89..21c134c9ab 100644 --- a/src/node.cc +++ b/src/node.cc @@ -33,38 +33,38 @@ ToCString(const v8::String::Utf8Value& value) } void -ReportException(v8::TryCatch* try_catch) +ReportException(TryCatch* try_catch) { - v8::HandleScope handle_scope; - v8::String::Utf8Value exception(try_catch->Exception()); + HandleScope handle_scope; + String::Utf8Value exception(try_catch->Exception()); const char* exception_string = ToCString(exception); - v8::Handle message = try_catch->Message(); + Handle message = try_catch->Message(); if (message.IsEmpty()) { // V8 didn't provide any extra information about this error; just // print the exception. - printf("%s\n", exception_string); + fprintf(stderr, "%s\n", exception_string); } else { - message->PrintCurrentStackTrace(stdout); - // Print (filename):(line number): (message). - v8::String::Utf8Value filename(message->GetScriptResourceName()); + String::Utf8Value filename(message->GetScriptResourceName()); const char* filename_string = ToCString(filename); int linenum = message->GetLineNumber(); - printf("%s:%i: %s\n", filename_string, linenum, exception_string); + fprintf(stderr, "%s:%i: %s\n", filename_string, linenum, exception_string); // Print line of source code. - v8::String::Utf8Value sourceline(message->GetSourceLine()); + String::Utf8Value sourceline(message->GetSourceLine()); const char* sourceline_string = ToCString(sourceline); - printf("%s\n", sourceline_string); + fprintf(stderr, "%s\n", sourceline_string); // Print wavy underline (GetUnderline is deprecated). int start = message->GetStartColumn(); for (int i = 0; i < start; i++) { - printf(" "); + fprintf(stderr, " "); } int end = message->GetEndColumn(); for (int i = start; i < end; i++) { - printf("^"); + fprintf(stderr, "^"); } - printf("\n"); + fprintf(stderr, "\n"); + + message->PrintCurrentStackTrace(stderr); } } @@ -106,17 +106,16 @@ typedef void (*extInit)(Handle exports); Handle node_dlopen (const v8::Arguments& args) { - if (args.Length() < 2) return Undefined(); - HandleScope scope; + if (args.Length() < 2) return Undefined(); + String::Utf8Value filename(args[0]->ToString()); Local target = args[1]->ToObject(); void *handle = dlopen(*filename, RTLD_LAZY); if (handle == NULL) { - ThrowException(String::New("dlopen() failed.")); - return Undefined(); + return ThrowException(String::New("dlopen() failed.")); } void *init_handle = dlsym(handle, "init"); @@ -294,6 +293,8 @@ PrintHelp ( ) { printf("Usage: node [switches] script.js [arguments] \n" " -v, --version print node's version\n" + " --libs print linker flags for modules\n" + " --cflags print pre-processor and compiler flags\n" " --v8-options print v8 command line options\n"); } diff --git a/src/node.js b/src/node.js index fae638a5ff..1533d39e0e 100644 --- a/src/node.js +++ b/src/node.js @@ -90,6 +90,32 @@ node.Module = function (o) { }; node.Module.prototype.load = function (callback) { + if (this.filename.match(/\.node$/)) { + return this.loadObject(callback); + } else { + return this.loadScript(callback); + } +}; + +node.Module.prototype.loadObject = function (callback) { + var self = this; + var loadPromise = new node.Promise(); + self.loadPromise = loadPromise; + // XXX Not yet supporting loading from HTTP. would need to download the + // file, store it to tmp then run dlopen on it. + node.fs.exists(self.filename, function (does_exist) { + if (does_exist) { + node.dlopen(self.filename, self.target); // FIXME synchronus + loadPromise.emitSuccess([self.target]); + } else { + node.stdio.writeError("Error reading " + self.filename + "\n"); + loadPromise.emitError(); + } + }); + return loadPromise; +}; + +node.Module.prototype.loadScript = function (callback) { var self = this; if (self.loaded) { throw "Module '" + self.filename + "' is already loaded."; @@ -165,7 +191,7 @@ node.Module.prototype.waitChildrenLoad = function (callback) { if (child.loaded) { nloaded++; } else { - child.addCallback(function () { + child.loadPromise.addCallback(function () { nloaded++; if (children.length == nloaded && callback) callback(); }); diff --git a/src/node.pc.in b/src/node.pc.in index cdb84e83ec..41c56f3072 100644 --- a/src/node.pc.in +++ b/src/node.pc.in @@ -2,8 +2,8 @@ prefix=@PREFIX@ libdir=${prefix}/lib includedir=${prefix}/include/node -Name: node@DEBUG_EXT@ +Name: node Description: v8 powered non-browser javascript Version: @VERSION@ -Libs: @LIBFLAGS@ -L${libdir} -lnode@DEBUG_EXT@ +Libs: @LIBFLAGS@ -R${libdir} Cflags: @CCFLAGS@ @CPPFLAGS@ -I${includedir} diff --git a/src/node_version.h.in b/src/node_version.h.in index 48753d27e1..77749bb7bf 100644 --- a/src/node_version.h.in +++ b/src/node_version.h.in @@ -1,3 +1,12 @@ -#define NODE_VERSION "@VERSION@" -#define NODE_CFLAGS "@CCFLAGS@ @CPPFLAGS@ -I@PREFIX@/include" -#define NODE_LIBFLAGS "@LIBFLAGS@ -L@PREFIX@/lib -lnode@DEBUG_EXT@" +#ifndef node_version_h +#define node_version_h + +#ifdef NDEBUG +# define NODE_VERSION "@VERSION@" +#else +# define NODE_VERSION "@VERSION@ (debug)" +#endif +#define NODE_CFLAGS "@CCFLAGS@ @CPPFLAGS@ -I@PREFIX@/include/node" +#define NODE_LIBFLAGS "@LIBFLAGS@ -R@PREFIX@/lib" + +#endif /* node_version_h */ diff --git a/wscript b/wscript index c7e2704c19..93e82c2b6c 100644 --- a/wscript +++ b/wscript @@ -61,6 +61,8 @@ def configure(conf): conf.env["USE_DEBUG"] = Options.options.debug conf.check(lib='dl', uselib_store='DL') + conf.env.append_value("LINKFLAGS_DL", "-rdynamic") + if Options.options.debug: conf.check(lib='profiler', uselib_store='PROFILER') @@ -260,31 +262,34 @@ def build(bld): libnode.uselib_local = "evcom ev eio http_parser coupling" libnode.uselib = "UDNS V8 EXECINFO PROFILER EFENCE DL" libnode.install_path = '${PREFIX}/lib' - bld.install_files('${PREFIX}/include/node/', 'config.h src/node.h src/node_version.h src/object_wrap.h'); + + + libnode_static = bld.new_task_gen("cxx", "staticlib") + libnode_static.name = "node-static" + libnode_static.target = libnode.target + libnode_static.source = libnode.source + libnode_static.includes = libnode.includes + libnode_static.uselib_local = libnode.uselib_local + libnode_static.uselib = libnode.uselib ### node node = bld.new_task_gen("cxx", "program") node.target = 'node' node.source = "src/main.cc" node.includes = libnode.includes - node.uselib_local = "node" + node.uselib_local = "node-static" node.install_path = '${PREFIX}/bin' node.chmod = 0755 - def subflags(program): - debug_ext = "" - if program.target == "node_g": debug_ext = "_g" x = { 'CCFLAGS' : " ".join(program.env["CCFLAGS"]) , 'CPPFLAGS' : " ".join(program.env["CPPFLAGS"]) , 'LIBFLAGS' : " ".join(program.env["LIBFLAGS"]) , 'VERSION' : VERSION , 'PREFIX' : program.env["PREFIX"] - , 'DEBUG_EXT' : debug_ext } return x; - # process file.pc.in -> file.pc pkgconfig = bld.new_task_gen('subst', before="cxx") pkgconfig.source = 'src/node.pc.in' @@ -297,6 +302,7 @@ def build(bld): node_version.source = 'src/node_version.h.in' node_version.target = 'src/node_version.h' node_version.dict = subflags(node) + node_version.install_path = '${PREFIX}/include/node' if bld.env["USE_DEBUG"]: node_g = node.clone("debug") @@ -305,10 +311,18 @@ def build(bld): libnode_g = libnode.clone("debug") libnode_g.target = "node_g" - pkgconfig_g = pkgconfig.clone("debug") - pkgconfig_g.dict = subflags(node_g) - pkgconfig_g.target = 'node_g.pc' + libnode_static_g = libnode_static.clone("debug") + libnode_static_g.target = "node_g" node_version_g = node_version.clone("debug") node_version_g.dict = subflags(node_g) + node_version_g.install_path = None + + bld.install_files('${PREFIX}/include/node/', """ + config.h + src/node.h + src/object_wrap.h + src/events.h + src/net.h + """);