From a19e220a9e000b730da92b9d9b5f76e6c7cc2ee1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 20 Feb 2009 20:54:58 -0800 Subject: GNUMakefile: revamp for parallel 1.8/1.9 runs Add a install-test for doing a mock install with private http11 and bin/unicorn and appropriate PATH/RUBYLIB env. Also add a normal install target so we can just type "make install" and just be done with a regular installation (and it'll revert files if using git). I use the following local.mk to augment my GNUmakefile. It allows me to run "make -j full-test" and run both 1.8 and 1.9 tests in parallel. --------------------------- 8< ------------------------- DLEXT := so rack_ver := 0.9.1 ifeq ($(r19),) ruby := $(HOME)/bin/ruby RUBYLIB := $(HOME)/lib/ruby/gems/1.8/gems/rack-$(rack_ver)/lib else export PATH := $(HOME)/ruby-1.9/bin:$(PATH) ruby := $(HOME)/ruby-1.9/bin/ruby RUBYLIB := $(HOME)/ruby-1.9/lib/ruby/gems/1.9.1/gems/rack-$(rack_ver)/lib endif SHELL := /bin/bash -e -o pipefail full-test: test-18 test-19 test-18: $(MAKE) test 2>&1 | sed -u -e 's!^!1.8 !' test-19: $(MAKE) test r19=1 2>&1 | sed -u -e 's!^!1.9 !' --------------------------- 8< ------------------------- --- .gitignore | 1 + GNUmakefile | 107 ++++++++++++++++++++++++++++++++++++++++-------------- test/aggregate.rb | 4 +- 3 files changed, 83 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index df595f9..f564865 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ pkg/ /.config /InstalledFiles /doc +/test/install-* diff --git a/GNUmakefile b/GNUmakefile index 25f7527..dfb33ff 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,51 +1,104 @@ # use GNU Make to run tests in parallel, and without depending on Rubygems all:: test +ruby = ruby -include local.mk +ruby_bin := $(shell which $(ruby)) ifeq ($(DLEXT),) # "so" for Linux - DLEXT := $(shell ruby -rrbconfig -e 'puts Config::CONFIG["DLEXT"]') + DLEXT := $(shell $(ruby) -rrbconfig -e 'puts Config::CONFIG["DLEXT"]') +endif +ifeq ($(RUBY_VERSION),) + RUBY_VERSION := $(shell $(ruby) -e 'puts RUBY_VERSION') endif -slow_tests := test/unit/test_server.rb -awk_slow := awk '/def test_/{print FILENAME"--"$$2".n"}' -T := $(filter-out $(slow_tests),$(wildcard test/unit/test*.rb)) -T_n := $(shell $(awk_slow) $(slow_tests)) -t_log := $(subst .rb,.log,$(T)) $(subst .n,.log,$(T_n)) -test: $(T) $(T_n) - @cat $(t_log) | ruby test/aggregate.rb - @$(RM) $(t_log) +# 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): - @$(MAKE) $(shell $(awk_slow) $@) -%.n: arg = $(subst .n,,$(subst --, -n ,$@)) -%.n: name = $(subst .n,,$(subst --, ,$@)) -%.n: t = $(subst .n,.log,$@) -%.n: lib/http11.$(DLEXT) - @echo '**** $(name) ****'; ruby -I lib $(arg) $(TEST_OPTS) >$(t)+ 2>&1 - @mv $(t)+ $(t) - -$(T): t = $(subst .rb,.log,$@) -$(T): lib/http11.$(DLEXT) - @echo '**** $@ ****'; ruby -I lib $@ $(TEST_OPTS) > $(t)+ 2>&1 - @mv $(t)+ $(t) +slow_tests := test/unit/test_server.rb test/exec/test_exec.rb +log_suffix = .$(RUBY_VERSION).log +T := $(filter-out $(slow_tests),$(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)) +test_prefix = $(CURDIR)/test/install-$(RUBY_VERSION) http11_deps := $(addprefix ext/http11/, \ ext_help.h http11.c http11_parser.c http11_parser.h \ - http11_parser.rl http11_parser_common.rl \ - Makefile) + http11_parser.rl http11_parser_common.rl) +inst_deps := $(wildcard bin/*) $(wildcard lib/*.rb) \ + $(wildcard lib/*/*.rb) $(http11_deps) + ext/http11/http11_parser.c: ext/http11/http11_parser.rl cd $(@D) && ragel $( $@ + +install-test: + mkdir -p $(test_prefix)/.ccache + tar c bin ext lib GNUmakefile | (cd $(test_prefix) && tar x) + $(MAKE) -C $(test_prefix) http11 shebang + +# this is only intended to be run within $(test_prefix) +shebang: bin/unicorn + $(ruby) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $< -clean: +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): + @$(MAKE) $(shell $(awk_slow) $@) + +TEST_OPTS = -v +run_test = @echo '*** $(arg) ***'; \ + setsid $(ruby) $(arg) $(TEST_OPTS) >$(t) 2>&1 || \ + (cat >&2 < $(t); exit 1) + +%.n: arg = $(subst .n,,$(subst --, -n ,$@)) +%.n: t = $(subst .n,$(log_suffix),$@) +%.n: export PATH := $(test_prefix)/bin:$(PATH) +%.n: export RUBYLIB := $(test_prefix)/lib:$(RUBYLIB) +%.n: $(test_prefix)/.stamp + $(run_test) + +$(T): arg = $@ +$(T): t = $(subst .rb,$(log_suffix),$@) +$(T): export PATH := $(test_prefix)/bin:$(PATH) +$(T): export RUBYLIB := $(test_prefix)/lib:$(RUBYLIB) +$(T): $(test_prefix)/.stamp + $(run_test) + +install: bin/unicorn + $(prep_setup_rb) + git diff --quiet $< + $(ruby) setup.rb all + git checkout $< + $(prep_setup_rb) + +clean-http11: -$(MAKE) -C ext/http11 clean $(RM) ext/http11/Makefile lib/http11.$(DLEXT) +setup_rb_files := .config InstalledFiles +prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C ext/http11 clean + +clean: clean-http11 + $(RM) $(setup_rb_files) + $(RM) $(t_log) + $(RM) -r $(test_prefix) + Manifest: git ls-files > $@+ cmp $@+ $@ || mv $@+ $@ diff --git a/test/aggregate.rb b/test/aggregate.rb index 1c2cc5c..785d638 100755 --- a/test/aggregate.rb +++ b/test/aggregate.rb @@ -8,6 +8,6 @@ $failures += $3.to_i $errors += $4.to_i END { - printf("\n%d tests, %d assertions, %d failures, %d errors\n", - $tests, $assertions, $failures, $errors) + printf("\n%s - %d tests, %d assertions, %d failures, %d errors\n", + RUBY_VERSION, $tests, $assertions, $failures, $errors) } -- cgit v1.2.3-24-ge0c7