about summary refs log tree commit homepage
path: root/GNUmakefile
diff options
context:
space:
mode:
Diffstat (limited to 'GNUmakefile')
-rw-r--r--GNUmakefile115
1 files changed, 77 insertions, 38 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 63a5bd0..1145143 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,6 +1,8 @@
 # use GNU Make to run tests in parallel, and without depending on Rubygems
 all:: test
 ruby = ruby
+ragel = ragel
+RLFLAGS = -G2
 -include local.mk
 ruby_bin := $(shell which $(ruby))
 ifeq ($(DLEXT),) # "so" for Linux
@@ -13,58 +15,75 @@ endif
 # dunno how to implement this as concisely in Ruby, and hell, I love awk
 awk_slow := awk '/def test_/{print FILENAME"--"$$2".n"}' 2>/dev/null
 
-slow_tests := test/unit/test_server.rb test/exec/test_exec.rb
+rails_vers := $(subst test/rails/app-,,$(wildcard test/rails/app-*))
+slow_tests := test/unit/test_server.rb test/exec/test_exec.rb \
+  test/unit/test_signals.rb test/unit/test_upload.rb
 log_suffix = .$(RUBY_VERSION).log
-T := $(filter-out $(slow_tests),$(wildcard test/*/test*.rb))
+T_r := $(wildcard test/rails/test*.rb)
+T := $(filter-out $(slow_tests) $(T_r), $(wildcard test/*/test*.rb))
 T_n := $(shell $(awk_slow) $(slow_tests))
 T_log := $(subst .rb,$(log_suffix),$(T))
 T_n_log := $(subst .n,$(log_suffix),$(T_n))
+T_r_log := $(subst .r,$(log_suffix),$(T_r))
 test_prefix = $(CURDIR)/test/install-$(RUBY_VERSION)
 
-http11_deps := $(addprefix ext/unicorn/http11/, \
-                 ext_help.h http11.c http11_parser.c http11_parser.h \
-                 http11_parser.rl http11_parser_common.rl)
-inst_deps := $(wildcard bin/*) $(wildcard lib/*.rb) \
-  $(wildcard lib/*/*.rb) $(http11_deps)
-
-ext/unicorn/http11/http11_parser.c: ext/unicorn/http11/http11_parser.rl
-        cd $(@D) && ragel $(<F) -C -G2 -o $(@F)
-ext/unicorn/http11/Makefile: ext/unicorn/http11/extconf.rb
-        cd $(@D) && $(ruby) $(<F)
-ext/unicorn/http11/http11.$(DLEXT): $(http11_deps) ext/unicorn/http11/Makefile
+ext := ext/unicorn/http11
+c_files := $(addprefix $(ext)/,ext_help.h http11.c http11_parser.h)
+rl_files := $(addprefix $(ext)/,http11_parser.rl http11_parser_common.rl)
+rb_files := $(shell grep '^\(bin\|lib\)' Manifest)
+inst_deps := $(c_files) $(rb_files)
+
+ragel: $(ext)/http11_parser.h
+$(ext)/http11_parser.h: $(rl_files)
+        cd $(@D) && $(ragel) http11_parser.rl -C $(RLFLAGS) -o $(@F)
+        $(ruby) -i -p -e '$$_.gsub!(%r{[ \t]*$$},"")' $@
+$(ext)/Makefile: $(ext)/extconf.rb $(c_files)
+        cd $(@D) && $(ruby) extconf.rb
+$(ext)/http11.$(DLEXT): $(ext)/Makefile
         $(MAKE) -C $(@D)
-lib/unicorn/http11.$(DLEXT): ext/unicorn/http11/http11.$(DLEXT)
+lib/unicorn/http11.$(DLEXT): $(ext)/http11.$(DLEXT)
         @mkdir -p lib
         install -m644 $< $@
 http11: lib/unicorn/http11.$(DLEXT)
 
 $(test_prefix)/.stamp: $(inst_deps)
-        $(MAKE) clean-http11
-        $(MAKE) install-test
-        > $@
-
-install-test:
         mkdir -p $(test_prefix)/.ccache
-        tar c bin ext lib GNUmakefile | (cd $(test_prefix) && tar x)
+        tar c bin ext lib GNUmakefile Manifest | (cd $(test_prefix) && tar x)
+        $(MAKE) -C $(test_prefix) clean
         $(MAKE) -C $(test_prefix) http11 shebang
+        > $@
+
+bins := $(wildcard bin/*)
 
 # this is only intended to be run within $(test_prefix)
-shebang: bin/unicorn
-        $(ruby) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $<
+shebang: $(bins)
+        $(ruby) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^
 
 t_log := $(T_log) $(T_n_log)
 test: $(T) $(T_n)
         @cat $(t_log) | $(ruby) test/aggregate.rb
         @$(RM) $(t_log)
 
-slow-tests: $(slow_tests)
-$(slow_tests):
+test-exec: $(wildcard test/exec/test_*.rb)
+test-unit: $(wildcard test/unit/test_*.rb)
+$(slow_tests): $(test_prefix)/.stamp
         @$(MAKE) $(shell $(awk_slow) $@)
 
 TEST_OPTS = -v
-run_test = @echo '*** $(arg) ***'; \
-  setsid $(ruby) $(arg) $(TEST_OPTS) >$(t) 2>&1 || \
-  (cat >&2 < $(t); exit 1)
+TEST_OPTS = -v
+ifndef V
+       quiet_pre = @echo '* $(arg)$(extra)';
+       quiet_post = >$(t) 2>&1
+else
+       # we can't rely on -o pipefail outside of bash 3+,
+       # so we use a stamp file to indicate success and
+       # have rm fail if the stamp didn't get created
+       stamp = $@$(log_suffix).ok
+       quiet_pre = @echo $(ruby) $(arg) $(TEST_OPTS); ! test -f $(stamp) && (
+       quiet_post = && > $(stamp) )>&2 | tee $(t); rm $(stamp) 2>/dev/null
+endif
+run_test = $(quiet_pre) setsid $(ruby) -w $(arg) $(TEST_OPTS) $(quiet_post) || \
+  (sed "s,^,$(extra): ," >&2 < $(t); exit 1)
 
 %.n: arg = $(subst .n,,$(subst --, -n ,$@))
 %.n: t = $(subst .n,$(log_suffix),$@)
@@ -80,23 +99,24 @@ $(T): export RUBYLIB := $(test_prefix)/lib:$(RUBYLIB)
 $(T): $(test_prefix)/.stamp
         $(run_test)
 
-install: bin/unicorn
+install: $(bins)
         $(prep_setup_rb)
-        git diff --quiet $<
+        $(RM) -r .install-tmp
+        mkdir .install-tmp
+        cp -p $^ .install-tmp
         $(ruby) setup.rb all
-        git checkout $<
+        $(RM) $^
+        mv $(addprefix .install-tmp/,$(^F)) bin/
+        $(RM) -r .install-tmp
         $(prep_setup_rb)
 
-clean-http11:
-        -$(MAKE) -C ext/unicorn/http11 clean
-        $(RM) ext/unicorn/http11/Makefile lib/unicorn/http11.$(DLEXT)
-
 setup_rb_files := .config InstalledFiles
-prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C ext/unicorn/http11 clean
+prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
 
-clean: clean-http11
-        $(RM) $(setup_rb_files)
-        $(RM) $(t_log)
+clean:
+        -$(MAKE) -C $(ext) clean
+        $(RM) $(ext)/Makefile lib/unicorn/http11.$(DLEXT)
+        $(RM) $(setup_rb_files) $(t_log)
         $(RM) -r $(test_prefix)
 
 Manifest:
@@ -108,4 +128,23 @@ Manifest:
 doc: .document
         rdoc -Na -m README -t "$(shell sed -ne '1s/^= //p' README)"
 
+rails_git_url = git://github.com/rails/rails.git
+rails_git := vendor/rails.git
+$(rails_git)/info/cloned-stamp:
+        git clone --mirror -q $(rails_git_url) $(rails_git)
+        > $@
+
+rails_tests := $(addsuffix .r,$(addprefix $(T_r).,$(rails_vers)))
+test-rails: $(rails_tests)
+$(T_r).%.r: t = $(addsuffix $(log_suffix),$@)
+$(T_r).%.r: rv = $(subst .r,,$(subst $(T_r).,,$@))
+$(T_r).%.r: extra = ' 'v$(rv)
+$(T_r).%.r: arg = $(T_r)
+$(T_r).%.r: export PATH := $(test_prefix)/bin:$(PATH)
+$(T_r).%.r: export RUBYLIB := $(test_prefix)/lib:$(RUBYLIB)
+$(T_r).%.r: export UNICORN_RAILS_TEST_VERSION = $(rv)
+$(T_r).%.r: export RAILS_GIT_REPO = $(CURDIR)/$(rails_git)
+$(T_r).%.r: $(test_prefix)/.stamp $(rails_git)/info/cloned-stamp
+        $(run_test)
+
 .PHONY: doc $(T) $(slow_tests) Manifest