You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

425 lines
12 KiB

#config
# define DEBUG=1 to build node_g
WANT_OPENSSL=1
PREFIX=/usr
SHELL=/bin/sh
INSTALL = install
SCONS = python tools/scons/scons.py
LINKFLAGS += $(LDFLAGS)
-include config.mak.autogen
-include config.mak
# -----------------------------------------------------------------------------
dylib_suffix = so
ifeq ($(platform),darwin)
LINKFLAGS += -framework Carbon
dylib_suffix = dylib
endif
ifeq ($(platform),linux)
LINKFLAGS += -pthread -lrt
endif
ifdef WANT_OPENSSL
HAVE_OPENSSL = 1
HAVE_CRYPTO = 1
ifdef OPENSSL_DIR
OPENSSL_LINKFLAGS += -L$(OPENSSL_DIR)/lib
OPENSSL_CPPFLAGS += -I$(OPENSSL_DIR)/include
endif
OPENSSL_LINKFLAGS += -lssl -lcrypto
endif
ifneq (,$(findstring build/libnode.so,$(MAKEFLAGS)))
CFLAGS += -shared -fPIC
#else
# CFLAGS += $(MAKEFLAGS)
endif
cflags += -pedantic
debug_CPPDEFINES = -DDEBUG $(CFLAGS)
debug_CFLAGS = -Wall -O0 -ggdb $(CFLAGS)
debug_CXXFLAGS = $(debug_CFLAGS)
debug_LINKFLAGS = $(LINKFLAGS)
release_CPPDEFINES = -DNODEBUG $(CFLAGS)
release_CFLAGS = -Wall -O2 $(CFLAGS)
release_CXXFLAGS = $(release_CFLAGS)
release_LINKFLAGS = $(LINKFLAGS)
builddir = build
libev_sources = deps/libev/ev.c
# Note: -I$(builddir)/deps/libev contains config.h which is generated from
# deps/libev/config.h.in during the configure script
libev_CPPFLAGS = -Ideps/libev -I$(builddir)/deps/libev
libev_release_objects = $(builddir)/release/deps/libev/ev.o
libev_debug_objects = $(builddir)/debug/deps/libev/ev.o
libeio_sources = deps/libeio/eio.c
libeio_release_objects = $(builddir)/release/deps/libeio/eio.o
libeio_debug_objects = $(builddir)/debug/deps/libeio/eio.o
# Note: -I$(builddir)/deps/libeio contains config.h which is generated from
# deps/libeio/config.h.in during the configure script
libeio_CPPFLAGS = -D_GNU_SOURCE -Ideps/libeio -I$(builddir)/deps/libeio
http_parser_sources = deps/http_parser/http_parser.c
http_parser_release_objects = $(builddir)/release/deps/http_parser/http_parser.o
http_parser_debug_objects = $(builddir)/debug/deps/http_parser/http_parser.o
http_parser_CPPFLAGS = -Ideps/http_parser
cares_sources = $(wildcard deps/c-ares/*.c)
cares_release_objects = $(addprefix $(builddir)/release/,$(cares_sources:.c=.o))
cares_debug_objects = $(addprefix $(builddir)/debug/,$(cares_sources:.c=.o))
cares_CPPFLAGS = -DHAVE_CONFIG_H=1 -Ideps/c-ares -Ideps/c-ares/$(platform)-$(arch)
node_sources = src/node.cc \
src/platform_$(platform).cc \
src/node_buffer.cc \
src/node_cares.cc \
src/node_child_process.cc \
src/node_constants.cc \
src/node_crypto.cc \
src/node_events.cc \
src/node_extensions.cc \
src/node_file.cc \
src/node_http_parser.cc \
src/node_idle_watcher.cc \
src/node_io_watcher.cc \
src/node_net.cc \
src/node_script.cc \
src/node_signal_watcher.cc \
src/node_stat_watcher.cc \
src/node_stdio.cc \
src/node_timer.cc \
src/node_javascript.cc \
node_debug_objects = $(addprefix $(builddir)/debug/,$(node_sources:.cc=.o))
node_release_objects = $(addprefix $(builddir)/release/,$(node_sources:.cc=.o))
node_exe_sources = src/node_main.cc
node_exe_debug_objects = \
$(addprefix $(builddir)/debug/,$(node_exe_sources:.cc=.o))
node_exe_release_objects = \
$(addprefix $(builddir)/release/,$(node_exe_sources:.cc=.o))
# TODO HAVE_FDATASYNC should be set in configure.
node_CPPFLAGS = -Isrc/ -Ideps/libeio/ -Ideps/libev/ -Ideps/http_parser/ \
-Ideps/libev/include/ -Ideps/v8/include -DPLATFORM=\"$(platform)\" \
-DX_STACKSIZE=65536 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 \
-DHAVE_OPENSSL=${HAVE_OPENSSL} \
-DHAVE_FDATASYNC=0 -I$(builddir)/release/src $(cares_CPPFLAGS)
node_debug_CPPFLAGS = $(subst release,debug,$(NODE_CPPFLAGS))
libv8 = $(builddir)/libv8.a
libv8_g = $(builddir)/libv8_g.a
# Rules
all: node
ifdef DEBUG
all: node_g
endif
node: $(builddir)/node
ln -fs $< $@
node_g: $(builddir)/node_g
ln -fs $< $@
# libev
$(builddir)/release/deps/libev/%.o: deps/libev/%.c
$(CC) -c $(release_CFLAGS) $(release_CPPFLAGS) $(libev_CFLAGS) \
$(libev_CPPFLAGS) $< -o $@
$(builddir)/debug/deps/libev/%.o: deps/libev/%.c
$(CC) -c $(debug_CFLAGS) $(debug_CPPFLAGS) $(libev_CFLAGS) \
$(libev_CPPFLAGS) $< -o $@
# libeio
$(builddir)/release/deps/libeio/%.o: deps/libeio/%.c
$(CC) -c $(release_CFLAGS) $(release_CPPFLAGS) $(libeio_CFLAGS) \
$(libeio_CPPFLAGS) $< -o $@
$(builddir)/debug/deps/libeio/%.o: deps/libeio/%.c
$(CC) -c $(debug_CFLAGS) $(debug_CPPFLAGS) $(libeio_CFLAGS) \
$(libeio_CPPFLAGS) $< -o $@
# http-parser
$(builddir)/release/deps/http_parser/%.o: deps/http_parser/%.c
$(CC) -c $(release_CFLAGS) $(release_CPPFLAGS) $(http_parser_CFLAGS) \
$(http_parser_CPPFLAGS) $< -o $@
$(builddir)/debug/deps/http_parser/%.o: deps/http_parser/%.c
$(CC) -c $(debug_CFLAGS) $(debug_CPPFLAGS) $(http_parser_CFLAGS) \
$(http_parser_CPPFLAGS) $< -o $@
# c-ares
$(builddir)/release/deps/c-ares/%.o: deps/c-ares/%.c
$(CC) -c $(release_CFLAGS) $(release_CPPFLAGS) $(cares_CFLAGS) \
$(cares_CPPFLAGS) $< -o $@
$(builddir)/debug/deps/c-ares/%.o: deps/c-ares/%.c
$(CC) -c $(debug_CFLAGS) $(debug_CPPFLAGS) $(cares_CFLAGS) \
$(cares_CPPFLAGS) $< -o $@
# node
$(builddir)/release/src/%.o: src/%.cc
$(CXX) -c $(release_CXXFLAGS) $(release_CPPFLAGS) $(node_CXXFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
$(builddir)/debug/src/%.o: src/%.cc
$(CXX) -c $(debug_CXXFLAGS) $(debug_CPPFLAGS) $(node_CXXFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
# node.o
$(builddir)/release/src/node.o: src/node.cc $(builddir)/release/src/node_natives.h
$(CXX) -c $(release_CXXFLAGS) $(release_CPPFLAGS) $(node_CFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
$(builddir)/debug/src/node.o: src/node.cc $(builddir)/debug/src/node_natives.h
$(CXX) -c $(debug_CXXFLAGS) $(debug_CPPFLAGS) $(node_CFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
# node_javascript.o
$(builddir)/release/src/node_javascript.o: src/node_javascript.cc $(builddir)/release/src/node_natives.h
$(CXX) -c $(release_CXXFLAGS) $(release_CPPFLAGS) $(node_CFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
$(builddir)/debug/src/node_javascript.o: src/node_javascript.cc $(builddir)/debug/src/node_natives.h
$(CXX) -c $(debug_CXXFLAGS) $(debug_CPPFLAGS) $(node_CFLAGS) \
$(node_CPPFLAGS) $(OPENSSL_CPPFLAGS) $< -o $@
# -----------------------------------------------------------------------------
# end products
endproduct_release_objects = $(node_release_objects) \
$(libev_release_objects) $(libeio_release_objects) \
$(http_parser_release_objects) $(cares_release_objects) $(libv8)
endproduct_debug_objects = $(node_debug_objects) \
$(libev_debug_objects) $(libeio_debug_objects) \
$(http_parser_debug_objects) $(cares_debug_objects) $(libv8_g)
endproduct_release_linkflags = $(release_LINKFLAGS) $(node_LINKFLAGS) \
$(OPENSSL_LINKFLAGS)
endproduct_debug_linkflags = $(debug_LINKFLAGS) $(node_LINKFLAGS) \
$(OPENSSL_LINKFLAGS)
# node executable
$(builddir)/node: $(node_exe_release_objects) $(endproduct_release_objects)
$(CXX) -o $@ $^ $(endproduct_release_linkflags)
$(builddir)/node_g: $(node_exe_debug_objects) $(endproduct_debug_objects)
$(CXX) -o $@ $^ $(endproduct_debug_linkflags)
# node static library
$(builddir)/libnode.a: $(endproduct_release_objects)
ar -rcs $@ $^
$(builddir)/libnode_g.a: $(endproduct_debug_objects)
ar -rcs $@ $^
# node dynamic library
# WIP -- currently disabled
#$(builddir)/libnode.$(dylib_suffix): CFLAGS += -shared -fPIC
#$(builddir)/libnode.$(dylib_suffix): $(endproduct_release_objects)
# $(CXX) -o $@ $^ $(endproduct_release_linkflags)
#
#$(builddir)/libnode_g.$(dylib_suffix): CFLAGS += -shared -fPIC
#$(builddir)/libnode_g.$(dylib_suffix): $(endproduct_debug_objects)
# $(CXX) -o $@ $^ $(endproduct_debug_linkflags)
# built-in javascript (the "node standard library")
$(builddir)/release/src/node_natives.h: src/node.js lib/*.js
python tools/js2c.py $^ > $@
$(builddir)/debug/src/node_natives.h: src/node.js lib/*.js
python tools/js2c.py $^ > $@
# TODO a debug flag for the macros ?
$(builddir)/release/src/node_config.h: src/node_config.h.in
sed -e "s#@PREFIX@#$(PREFIX)#" \
-e "s#@CCFLAGS@#$(release_CFLAGS)#" \
-e "s#@CPPFLAGS@#$(release_CPPFLAGS)#" $< > $@ || rm $@
$(builddir)/debug/src/node_config.h: src/node_config.h.in
sed -e "s#@PREFIX@#$(PREFIX)#" \
-e "s#@CCFLAGS@#$(debug_CFLAGS)#" \
-e "s#@CPPFLAGS@#$(debug_CPPFLAGS)#" $< > $@ || rm $@
# FIXME convert to a generalized *.in preprocessor
$(builddir)/release/lib/pkgconfig/nodejs.pc: tools/nodejs.pc.in
sed \
-e "s#@PREFIX@#$(PREFIX)#" \
-e "s#@VERSION@#$(VERSION)#" \
-e "s#@CCFLAGS@#$(CFLAGS)#" \
-e "s#@CPPFLAGS@#$(CPPFLAGS)#" $< > $@ || rm $@
# v8 does its own debug and release version, so we don't put it in the
# profile_builddir but rather just the builddir.
libv8_flags = --directory="$(builddir)" --srcdir="`pwd`/deps/v8" \
visibility=default arch=$(arch) library=static
# TODO: if env[SNAPSHOT_V8]; then
libv8_flags += snapshot=on
#fi
$(libv8):
$(SCONS) $(libv8_flags) mode=release
$(libv8_g):
$(SCONS) $(libv8_flags) mode=debug
# header deps
$(builddir)/release/src/node.o: $(builddir)/release/src/node_config.h
$(builddir)/debug/src/node.o: $(builddir)/debug/src/node_config.h
# TODO install libs
install: all doc
$(INSTALL) -d -m 755 '$(PREFIX)/bin'
$(INSTALL) $(builddir)/node '$(PREFIX)/bin'
$(INSTALL) -d -m 755 '$(PREFIX)/share/man/man1/'
$(INSTALL) -d -m 755 '$(PREFIX)/lib/node/wafadmin/Tools'
$(INSTALL) tools/wafadmin/*.py '$(PREFIX)/lib/node/wafadmin'
$(INSTALL) tools/wafadmin/Tools/*.py '$(PREFIX)/lib/node/wafadmin/Tools'
$(INSTALL) doc/node.1 '$(PREFIX)/share/man/man1/'
libnode-static: $(builddir)/libnode.a
ln -fs $< $@
libnode-static-debug: $(builddir)/libnode_g.a
ln -fs $< $@
libnode-dynamic: $(builddir)/libnode.$(dylib_suffix)
ln -fs $< $@
libnode-dynamic-debug: $(builddir)/libnode_g.$(dylib_suffix)
ln -fs $< $@
test: $(builddir)/node
python tools/test.py --mode=release simple message
test-all: $(builddir)/node $(builddir)/node_g
python tools/test.py --mode=debug,release
test-release: $(builddir)/node
python tools/test.py --mode=release
test-debug: $(builddir)/node_g
python tools/test.py --mode=debug
test-message: $(builddir)/node
python tools/test.py message
test-simple: $(builddir)/node
python tools/test.py simple
test-pummel: $(builddir)/node
python tools/test.py pummel
test-internet: $(builddir)/node
python tools/test.py internet
# http://rtomayko.github.com/ronn
# gem install ronn
doc: doc/node.1 doc/api.html doc/index.html doc/changelog.html
## HACK to give the ronn-generated page a TOC
doc/api.html: $(builddir)/node doc/api.markdown doc/api_header.html \
doc/api_footer.html
build/node tools/ronnjs/bin/ronn.js --fragment doc/api.markdown \
| sed "s/<h2>\(.*\)<\/h2>/<h2 id=\"\1\">\1<\/h2>/g" \
| cat doc/api_header.html - doc/api_footer.html > doc/api.html
doc/changelog.html: ChangeLog doc/changelog_header.html \
doc/changelog_footer.html
cat doc/changelog_header.html ChangeLog doc/changelog_footer.html > doc/changelog.html
doc/node.1: $(builddir)/node doc/api.markdown all
$(builddir)/node tools/ronnjs/bin/ronn.js --roff doc/api.markdown > doc/node.1
website-upload: doc
scp doc/* ryan@nodejs.org:~/web/nodejs.org/
docclean:
@-rm -f doc/node.1 doc/api.html doc/changelog.html
clean:
-rm -f node node_g $(builddir)/node $(builddir)/node_g
-find $(builddir) -name "*.o" -or -name "*.a" \
-or -name "*.so" -or -name "*.dylib" | xargs rm -f
-find . -name "*.pyc" | xargs rm -f
distclean: docclean
-find tools -name "*.pyc" | xargs rm -f
-rm -rf build/ node node_g
-rm -rf configure.real config.mak.autogen config.log autom4te.cache config.status
VERSION=$(shell git describe)
TARNAME=node-$(VERSION)
dist: doc/node.1 doc/api.html
git archive --format=tar --prefix=$(TARNAME)/ HEAD | tar xf -
mkdir -p $(TARNAME)/doc
cp doc/node.1 $(TARNAME)/doc/node.1
cp doc/api.html $(TARNAME)/doc/api.html
rm -rf $(TARNAME)/deps/v8/test # too big
tar -cf $(TARNAME).tar $(TARNAME)
rm -rf $(TARNAME)
gzip -f -9 $(TARNAME).tar
bench:
benchmark/http_simple_bench.sh
bench-idle:
./node benchmark/idle_server.js &
sleep 1
./node benchmark/idle_clients.js &
.PHONY: all \
test test-all \
bench \
install uninstall \
dist distclean \
website-upload \
clean docclean