diff options
Diffstat (limited to 'GNUmakefile')
-rw-r--r-- | GNUmakefile | 115 |
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 |