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.
 
 
 
 
 
 

368 lines
10 KiB

#config
# define DEBUG=1 to build node_g
WANT_OPENSSL=1
PREFIX=/usr
SHELL=/bin/sh
INSTALL = install
-include config.mak.autogen
-include config.mak
platform := $(shell python -c 'import sys; print sys.platform')
ifeq ($(platform),linux2)
platform := linux
endif
# fix me
arch = x86_64
ifeq ($(platform),darwin)
LINKFLAGS += -framework Carbon
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
cflags += -pedantic
debug_CPPDEFINES = -DDEBUG $(CFLAGS)
debug_CFLAGS = -Wall -O0 -ggdb $(CFLAGS)
debug_CXXFLAGS = $(debug_CFLAGS)
debug_LINKFLAGS = $(LINKFLAGS)
release_CPPDEFINES = -DNODEBUG
release_CFLAGS = -Wall -O2
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_main.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))
# 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 $@
# node executable
$(builddir)/node: $(node_release_objects) $(libev_release_objects) \
$(libeio_release_objects) $(http_parser_release_objects) \
$(cares_release_objects) $(libv8)
$(CXX) -o $@ $^ $(release_LINKFLAGS) $(node_LINKFLAGS) $(OPENSSL_LINKFLAGS)
$(builddir)/node_g: $(node_debug_objects) $(libev_debug_objects) \
$(libeio_debug_objects) $(http_parser_debug_objects) \
$(cares_debug_objects) $(libv8_g)
$(CXX) -o $@ $^ $(debug_LINKFLAGS) $(node_LINKFLAGS) $(OPENSSL_LINKFLAGS)
$(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):
python tools/scons/scons.py -C $(builddir) -Y `pwd`/deps/v8 \
visibility=default mode=release arch=x64 library=static snapshot=on
$(libv8_g):
python tools/scons/scons.py -C $(builddir) -Y `pwd`/deps/v8 \
visibility=default mode=debug arch=x64 library=static snapshot=on
# 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/'
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" | 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: bench clean docclean dist distclean check uninstall install all test test-all website-upload