Browse Source

Build static executable.

- Fix a few errors with node.dlopen()

- Report errors to stderr (this should probably be a separate commit, but
  whatever)
v0.7.4-release
Ryan 16 years ago
parent
commit
a97dce7523
  1. 37
      src/node.cc
  2. 28
      src/node.js
  3. 4
      src/node.pc.in
  4. 15
      src/node_version.h.in
  5. 34
      wscript

37
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<v8::Message> message = try_catch->Message();
Handle<Message> 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<Object> exports);
Handle<Value>
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<Object> 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");
}

28
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();
});

4
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}

15
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 */

34
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
""");

Loading…
Cancel
Save