mirror of https://github.com/lukechilds/node.git
Ryan
16 years ago
14 changed files with 330 additions and 65 deletions
@ -1,55 +0,0 @@ |
|||||
EVDIR=$(HOME)/local/libev |
|
||||
|
|
||||
OIINC = $(HOME)/projects/oi/ |
|
||||
OILIB = $(HOME)/projects/oi/liboi.a |
|
||||
|
|
||||
V8INC = $(HOME)/src/v8/include |
|
||||
#V8LIB = $(HOME)/src/v8/libv8_g.a
|
|
||||
V8LIB = $(HOME)/src/v8/libv8.a |
|
||||
|
|
||||
CFLAGS = -g -I$(V8INC) -I$(OIINC) -DHAVE_GNUTLS=0 -Ideps/ebb |
|
||||
LDFLAGS = -lev -pthread # -lefence |
|
||||
|
|
||||
ifdef EVDIR |
|
||||
CFLAGS += -I$(EVDIR)/include |
|
||||
LDFLAGS += -L$(EVDIR)/lib |
|
||||
endif |
|
||||
|
|
||||
node: node.o node_tcp.o node_http.o node_timer.o ebb_request_parser.o |
|
||||
g++ -o node $^ $(LDFLAGS) $(V8LIB) $(OILIB) |
|
||||
|
|
||||
node.o: node.cc |
|
||||
g++ $(CFLAGS) -c $< |
|
||||
|
|
||||
node_tcp.o: node_tcp.cc |
|
||||
g++ $(CFLAGS) -c $< |
|
||||
|
|
||||
node_http.o: node_http.cc |
|
||||
g++ $(CFLAGS) -c $< |
|
||||
|
|
||||
node_timer.o: node_timer.cc |
|
||||
g++ $(CFLAGS) -c $< |
|
||||
|
|
||||
ebb_request_parser.o: ebb_request_parser.c deps/ebb/ebb_request_parser.h |
|
||||
g++ $(CFLAGS) -c $< |
|
||||
|
|
||||
ebb_request_parser.c: deps/ebb/ebb_request_parser.rl |
|
||||
ragel -s -G2 $< -o $@ |
|
||||
|
|
||||
PASS="\033[1;32mPASS\033[0m\n" |
|
||||
FAIL="\033[1;31mFAIL\033[0m\n" |
|
||||
|
|
||||
test: node test/test_* |
|
||||
@for i in test/test_*; do \
|
|
||||
if [ -x $$i ]; then \
|
|
||||
echo "\n\033[1m$$i\033[0m"; \
|
|
||||
./$$i && echo $(PASS) || echo $(FAIL); \
|
|
||||
fi \
|
|
||||
done |
|
||||
|
|
||||
clean: |
|
||||
rm -f ebb_request_parser.c |
|
||||
rm -f *.o |
|
||||
rm -f node |
|
||||
|
|
||||
.PHONY: clean test |
|
@ -0,0 +1,120 @@ |
|||||
|
import Options |
||||
|
|
||||
|
def set_options(opt): |
||||
|
pass |
||||
|
#opt.tool_options('compiler_cc') |
||||
|
|
||||
|
def configure(conf): |
||||
|
print "--- libeio ---" |
||||
|
#conf.check_tool('compiler_cc') |
||||
|
|
||||
|
conf.check_cc(lib="pthread", header_name="pthread.h", function_name="pthread_create", mandatory=True) |
||||
|
|
||||
|
platform_string = "__" + Options.platform |
||||
|
if Options.platform == "linux2": |
||||
|
platform_string = "__linux" |
||||
|
conf.define(platform_string, 1) |
||||
|
|
||||
|
conf.check_cc(msg="Checking for futimes(2)", define_name="HAVE_FUTIMES", fragment=""" |
||||
|
#include <sys/types.h> |
||||
|
#include <sys/time.h> |
||||
|
#include <utime.h> |
||||
|
struct timeval tv[2]; |
||||
|
int res; |
||||
|
int fd; |
||||
|
int main(void) |
||||
|
{ |
||||
|
res = futimes (fd, tv); |
||||
|
return 0; |
||||
|
} |
||||
|
""") |
||||
|
|
||||
|
conf.check_cc(msg="Checking for readahead(2)", define_name="HAVE_READAHEAD", fragment=""" |
||||
|
#include <fcntl.h> |
||||
|
int main(void) |
||||
|
{ |
||||
|
int fd = 0; |
||||
|
size_t count = 2; |
||||
|
ssize_t res; |
||||
|
res = readahead (fd, 0, count); |
||||
|
return 0; |
||||
|
} |
||||
|
""") |
||||
|
|
||||
|
conf.check_cc(msg="Checking for fdatasync(2)", define_name="HAVE_FDATASYNC", fragment=""" |
||||
|
#include <unistd.h> |
||||
|
int main(void) |
||||
|
{ |
||||
|
int fd = 0; |
||||
|
fdatasync (fd); |
||||
|
return 0; |
||||
|
} |
||||
|
""") |
||||
|
|
||||
|
conf.check_cc(msg="Checking for pread(2) and pwrite(2)", define_name="HAVE_PREADWRITE", fragment=""" |
||||
|
#include <unistd.h> |
||||
|
int main(void) |
||||
|
{ |
||||
|
int fd = 0; |
||||
|
size_t count = 1; |
||||
|
char buf; |
||||
|
off_t offset = 1; |
||||
|
ssize_t res; |
||||
|
res = pread (fd, &buf, count, offset); |
||||
|
res = pwrite (fd, &buf, count, offset); |
||||
|
return 0; |
||||
|
} |
||||
|
""") |
||||
|
|
||||
|
conf.check_cc(msg="Checking for sendfile(2)" , defines=[platform_string + "=1"] , define_name="HAVE_SENDFILE" , fragment=""" |
||||
|
# include <sys/types.h> |
||||
|
#if __linux |
||||
|
# include <sys/sendfile.h> |
||||
|
#elif __freebsd |
||||
|
# include <sys/socket.h> |
||||
|
# include <sys/uio.h> |
||||
|
#elif __hpux |
||||
|
# include <sys/socket.h> |
||||
|
#else |
||||
|
# error unsupported architecture |
||||
|
#endif |
||||
|
int main(void) |
||||
|
{ |
||||
|
int fd = 0; |
||||
|
off_t offset = 1; |
||||
|
size_t count = 2; |
||||
|
ssize_t res; |
||||
|
#if __linux |
||||
|
res = sendfile (fd, fd, offset, count); |
||||
|
#elif __freebsd |
||||
|
res = sendfile (fd, fd, offset, count, 0, &offset, 0); |
||||
|
#elif __hpux |
||||
|
res = sendfile (fd, fd, offset, count, 0, 0); |
||||
|
#endif |
||||
|
return 0; |
||||
|
} |
||||
|
""") |
||||
|
|
||||
|
conf.check_cc(msg="Checking for sync_file_range(2) ", fragment=""" |
||||
|
#include <fcntl.h> |
||||
|
int main(void) |
||||
|
{ |
||||
|
int fd = 0; |
||||
|
off64_t offset = 1; |
||||
|
off64_t nbytes = 1; |
||||
|
unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE|SYNC_FILE_RANGE_WAIT_AFTER; |
||||
|
ssize_t res; |
||||
|
res = sync_file_range (fd, offset, nbytes, flags); |
||||
|
return 0; |
||||
|
} |
||||
|
""", define_name="HAVE_SYNC_FILE_RANGE") |
||||
|
|
||||
|
conf.write_config_header('config.h') |
||||
|
|
||||
|
def build(bld): |
||||
|
libeio = bld.new_task_gen("cc", "staticlib") |
||||
|
libeio.source = "eio.c" |
||||
|
libeio.target = 'eio' |
||||
|
libeio.name = 'eio' |
||||
|
libeio.includes = '. ../..' |
||||
|
|
@ -0,0 +1,55 @@ |
|||||
|
import Options |
||||
|
|
||||
|
def set_options(opt): |
||||
|
pass |
||||
|
#opt.tool_options('compiler_cc') |
||||
|
|
||||
|
def configure(conf): |
||||
|
print "--- libev ---" |
||||
|
#conf.check_tool('compiler_cc') |
||||
|
|
||||
|
platform_string = "__" + Options.platform |
||||
|
if Options.platform == "linux2": |
||||
|
platform_string = "__linux" |
||||
|
conf.define(platform_string, 1) |
||||
|
|
||||
|
conf.check_cc(header_name="sys/inotify.h") |
||||
|
conf.check_cc(header_name="sys/epoll.h") |
||||
|
conf.check_cc(header_name="sys/event.h") |
||||
|
conf.check_cc(header_name="sys/queue.h") |
||||
|
conf.check_cc(header_name="port.h") |
||||
|
conf.check_cc(header_name="poll.h") |
||||
|
conf.check_cc(header_name="sys/select.h") |
||||
|
conf.check_cc(header_name="sys/eventfd.h") |
||||
|
conf.check_cc(header_name="sys/inotify.h", function_name="inotify_init") |
||||
|
conf.check_cc(header_name="sys/epoll.h", function_name="epoll_ctl") |
||||
|
conf.check_cc(header_name="sys/queue.h", function_name="kqueue") |
||||
|
conf.check_cc(header_name="port.h", function_name="port_create") |
||||
|
conf.check_cc(header_name="poll.h", function_name="poll") |
||||
|
conf.check_cc(header_name="sys/select.h", function_name="select") |
||||
|
conf.check_cc(header_name="sys/eventfd.h", function_name="eventfd") |
||||
|
code = """ |
||||
|
#include <syscall.h> |
||||
|
#include <time.h> |
||||
|
|
||||
|
int main() { |
||||
|
struct timespec ts; |
||||
|
int status = syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts); |
||||
|
return 0; |
||||
|
} |
||||
|
""" |
||||
|
conf.check_cc(fragment=code, define_name="HAVE_CLOCK_SYSCALL") |
||||
|
conf.check_cc(lib="rt", header_name="time.h", function_name="clock_gettime") |
||||
|
conf.check_cc(lib="rt", header_name="time.h", function_name="nanosleep") |
||||
|
conf.check_cc(lib="m", header_name="math.h", function_name="ceil") |
||||
|
|
||||
|
conf.define("HAVE_CONFIG_H", 1) |
||||
|
conf.write_config_header('config.h') |
||||
|
|
||||
|
def build(bld): |
||||
|
libev = bld.new_task_gen("cc", "staticlib") |
||||
|
libev.source = 'ev.c' |
||||
|
libev.target = 'ev' |
||||
|
libev.name = 'ev' |
||||
|
libev.includes = '. ../..' |
||||
|
|
@ -0,0 +1,35 @@ |
|||||
|
#! /usr/bin/env python |
||||
|
# encoding: utf-8 |
||||
|
|
||||
|
"Ragel: '.rl' files are converted into .c files using 'ragel': {.rl -> .c -> .o}" |
||||
|
|
||||
|
import TaskGen, Task, Runner |
||||
|
|
||||
|
|
||||
|
def rageltaskfun(task): |
||||
|
env = task.env |
||||
|
ragelbin = env.get_flat('RAGEL') |
||||
|
if ragelbin: |
||||
|
if task.inputs[0].srcpath(env) == '../src/config_parser.rl': |
||||
|
cmd = '%s -o %s -C -T0 %s' % (ragelbin, task.outputs[0].bldpath(env), task.inputs[0].srcpath(env)) |
||||
|
else: |
||||
|
cmd = '%s -o %s -C -T1 %s' % (ragelbin, task.outputs[0].bldpath(env), task.inputs[0].srcpath(env)) |
||||
|
else: |
||||
|
src = task.inputs[0].srcpath(env) |
||||
|
src = src[:src.rfind('.')] + '.c' |
||||
|
cmd = 'cp %s %s' % (src, task.outputs[0].bldpath(env)) |
||||
|
return task.generator.bld.exec_command(cmd) |
||||
|
|
||||
|
rageltask = Task.task_type_from_func('ragel', rageltaskfun, vars = ['RAGEL'], color = 'BLUE', ext_in = '.rl', ext_out = '.c', before = 'c') |
||||
|
|
||||
|
@TaskGen.extension('.rl') |
||||
|
@TaskGen.before('apply_core') |
||||
|
def ragel(self, node): |
||||
|
out = node.change_ext('.c') |
||||
|
self.allnodes.append(out) |
||||
|
tsk = self.create_task('ragel') |
||||
|
tsk.set_inputs(node) |
||||
|
tsk.set_outputs(out) |
||||
|
|
||||
|
def detect(conf): |
||||
|
dang = conf.find_program('ragel', var='RAGEL') |
@ -1,4 +1,6 @@ |
|||||
#include "node.h" |
#include "node.h" |
||||
|
#define EV_STANDALONE 1 |
||||
|
#include <ev.c> |
||||
|
|
||||
#include "node_tcp.h" |
#include "node_tcp.h" |
||||
#include "node_http.h" |
#include "node_http.h" |
@ -1,7 +1,9 @@ |
|||||
#ifndef node_h |
#ifndef node_h |
||||
#define node_h |
#define node_h |
||||
|
|
||||
|
#define EV_STANDALONE 1 |
||||
#include <ev.h> |
#include <ev.h> |
||||
|
|
||||
#include <v8.h> |
#include <v8.h> |
||||
|
|
||||
void node_fatal_exception (v8::TryCatch &try_catch); |
void node_fatal_exception (v8::TryCatch &try_catch); |
Binary file not shown.
@ -0,0 +1,103 @@ |
|||||
|
#! /usr/bin/env python |
||||
|
import Options |
||||
|
import os |
||||
|
from os.path import join, dirname, abspath |
||||
|
|
||||
|
VERSION='0.0.1' |
||||
|
APPNAME='node' |
||||
|
|
||||
|
srcdir = '.' |
||||
|
blddir = 'build' |
||||
|
|
||||
|
def set_options(opt): |
||||
|
# the gcc module provides a --debug-level option |
||||
|
opt.tool_options('compiler_cxx') |
||||
|
opt.tool_options('compiler_cc') |
||||
|
opt.tool_options('ragel', tdir = '.') |
||||
|
|
||||
|
def configure(conf): |
||||
|
conf.check_tool('compiler_cxx') |
||||
|
conf.check_tool('compiler_cc') |
||||
|
conf.check_tool('ragel', tooldir = '.') |
||||
|
|
||||
|
conf.sub_config('deps/libeio') |
||||
|
conf.sub_config('deps/libev') |
||||
|
|
||||
|
# needs to match the symbols found in libeio and libev |
||||
|
# __solaris |
||||
|
# __linux |
||||
|
# __freebsd |
||||
|
# __hpux |
||||
|
# __solaris |
||||
|
platform_string = "__" + Options.platform |
||||
|
if Options.platform == "linux2": |
||||
|
platform_string = "__linux" |
||||
|
conf.define(platform_string, 1) |
||||
|
|
||||
|
# liboi config |
||||
|
print "--- liboi ---" |
||||
|
if conf.check_cfg(package='gnutls', args='--cflags --libs', uselib_store="GNUTLS"): |
||||
|
conf.define("HAVE_GNUTLS", 1) |
||||
|
|
||||
|
conf.define("HAVE_CONFIG_H", 1) |
||||
|
conf.write_config_header('config.h') |
||||
|
|
||||
|
|
||||
|
def build(bld): |
||||
|
|
||||
|
bld.add_subdirs('deps/libeio deps/libev') |
||||
|
|
||||
|
### v8 |
||||
|
deps_src = join(bld.path.abspath(),"deps") |
||||
|
deps_tgt = join(bld.srcnode.abspath(bld.env),"deps") |
||||
|
v8dir_src = join(deps_src,"v8") |
||||
|
v8dir_tgt = join(deps_tgt, "v8") |
||||
|
v8lib = bld.env["staticlib_PATTERN"] % "v8" |
||||
|
v8 = bld.new_task_gen( |
||||
|
target=join("deps/v8",v8lib), |
||||
|
rule='cp -rf %s %s && cd %s && scons library=static' |
||||
|
% ( v8dir_src |
||||
|
, deps_tgt |
||||
|
, v8dir_tgt |
||||
|
), |
||||
|
before="cxx" |
||||
|
) |
||||
|
bld.env["CPPPATH_V8"] = "deps/v8/include" |
||||
|
bld.env["STATICLIB_V8"] = "v8" |
||||
|
bld.env["LIBPATH_V8"] = v8dir_tgt |
||||
|
bld.env["LINKFLAGS_V8"] = "-pthread" |
||||
|
|
||||
|
### oi |
||||
|
oi = bld.new_task_gen("cc", "staticlib") |
||||
|
oi.source = "deps/oi/oi_socket.c deps/oi/oi_buf.c" |
||||
|
oi.includes = "deps/oi/" |
||||
|
oi.name = "oi" |
||||
|
oi.target = "oi" |
||||
|
oi.uselib = "GNUTLS" |
||||
|
|
||||
|
### ebb |
||||
|
ebb = bld.new_task_gen("cc", "staticlib") |
||||
|
ebb.source = "deps/ebb/ebb_request_parser.rl" |
||||
|
ebb.includes = "deps/ebb/" |
||||
|
ebb.name = "ebb" |
||||
|
ebb.target = "ebb" |
||||
|
|
||||
|
### node |
||||
|
node = bld.new_task_gen("cxx", "program") |
||||
|
node.target = 'node' |
||||
|
node.source = """ |
||||
|
src/node.cc |
||||
|
src/node_http.cc |
||||
|
src/node_tcp.cc |
||||
|
src/node_timer.cc |
||||
|
""" |
||||
|
node.includes = """ |
||||
|
src/ |
||||
|
deps/v8/include |
||||
|
deps/libev |
||||
|
deps/libeio |
||||
|
deps/oi |
||||
|
deps/ebb |
||||
|
""" |
||||
|
node.uselib_local = "oi ev eio ebb" |
||||
|
node.uselib = "V8 PTHREAD" |
Loading…
Reference in new issue