diff options
Diffstat (limited to 'GNUmakefile')
-rw-r--r-- | GNUmakefile | 220 |
1 files changed, 179 insertions, 41 deletions
diff --git a/GNUmakefile b/GNUmakefile index 47c6b5f..bc67b99 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,15 +1,28 @@ -# use GNU Make to run tests in parallel, and without depending on Rubygems +# use GNU Make to run tests in parallel, and without depending on RubyGems all:: test + ruby = ruby +rake = rake ragel = ragel + +GIT_URL = git://git.bogomips.org/unicorn.git RLFLAGS = -G2 + +# lower-case vars are deprecated +RUBY = $(ruby) +RAKE = $(rake) +RAGEL = $(ragel) + +GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE + @./GIT-VERSION-GEN +-include GIT-VERSION-FILE -include local.mk -ruby_bin := $(shell which $(ruby)) +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') + RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION') endif # dunno how to implement this as concisely in Ruby, and hell, I love awk @@ -27,41 +40,43 @@ 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) -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) +ext := ext/unicorn_http +c_files := $(ext)/unicorn_http.c $(wildcard $(ext)/*.h) +rl_files := $(wildcard $(ext)/*.rl) +base_bins := unicorn unicorn_rails +bins := $(addprefix bin/, $(base_bins)) +man1_bins := $(addsuffix .1, $(base_bins)) +man1_paths := $(addprefix man/man1/, $(man1_bins)) +rb_files := $(bins) $(shell find lib ext -type f -name '*.rb') +inst_deps := $(c_files) $(rb_files) GNUmakefile test/test_helper.rb -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]*$$},"")' $@ +ragel: $(ext)/unicorn_http.c +$(ext)/unicorn_http.c: $(rl_files) + cd $(@D) && $(RAGEL) unicorn_http.rl -C $(RLFLAGS) -o $(@F) $(ext)/Makefile: $(ext)/extconf.rb $(c_files) - cd $(@D) && $(ruby) extconf.rb -$(ext)/http11.$(DLEXT): $(ext)/Makefile + cd $(@D) && $(RUBY) extconf.rb +$(ext)/unicorn_http.$(DLEXT): $(ext)/Makefile $(MAKE) -C $(@D) -lib/unicorn/http11.$(DLEXT): $(ext)/http11.$(DLEXT) +lib/unicorn_http.$(DLEXT): $(ext)/unicorn_http.$(DLEXT) @mkdir -p lib install -m644 $< $@ -http11: lib/unicorn/http11.$(DLEXT) +http: lib/unicorn_http.$(DLEXT) $(test_prefix)/.stamp: $(inst_deps) mkdir -p $(test_prefix)/.ccache - tar c `cat Manifest` | (cd $(test_prefix) && tar x) + tar cf - $(inst_deps) GIT-VERSION-GEN | \ + (cd $(test_prefix) && tar xf -) $(MAKE) -C $(test_prefix) clean - $(MAKE) -C $(test_prefix) http11 shebang + $(MAKE) -C $(test_prefix) http shebang > $@ -bins := $(wildcard bin/*) - # this is only intended to be run within $(test_prefix) shebang: $(bins) - $(ruby) -i -p -e '$$_.gsub!(%r{^#!.*$$},"#!$(ruby_bin)")' $^ + $(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 + @cat $(t_log) | $(RUBY) test/aggregate.rb @$(RM) $(t_log) test-exec: $(wildcard test/exec/test_*.rb) @@ -70,19 +85,27 @@ $(slow_tests): $(test_prefix)/.stamp @$(MAKE) $(shell $(awk_slow) $@) TEST_OPTS = -v -TEST_OPTS = -v +check_test = grep '0 failures, 0 errors' $(t) >/dev/null ifndef V quiet_pre = @echo '* $(arg)$(extra)'; - quiet_post = >$(t) 2>&1 + quiet_post = >$(t) 2>&1 && $(check_test) 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 + quiet_pre = @echo $(RUBY) $(arg) $(TEST_OPTS); ! test -f $(stamp) && ( + quiet_post = && > $(stamp) )2>&1 | tee $(t); \ + rm $(stamp) 2>/dev/null && $(check_test) endif -run_test = $(quiet_pre) setsid $(ruby) -w $(arg) $(TEST_OPTS) $(quiet_post) || \ + +# not all systems have setsid(8), we need it because we spam signals +# stupidly in some tests... +rb_setsid := $(RUBY) -e 'Process.setsid' -e 'exec *ARGV' + +# TRACER='strace -f -o $(t).strace -s 100000' +run_test = $(quiet_pre) \ + $(rb_setsid) $(TRACER) $(RUBY) -w $(arg) $(TEST_OPTS) $(quiet_post) || \ (sed "s,^,$(extra): ," >&2 < $(t); exit 1) %.n: arg = $(subst .n,,$(subst --, -n ,$@)) @@ -99,14 +122,15 @@ $(T): export RUBYLIB := $(test_prefix):$(test_prefix)/lib:$(RUBYLIB) $(T): $(test_prefix)/.stamp $(run_test) -install: $(bins) +install: $(bins) $(ext)/unicorn_http.c $(prep_setup_rb) + $(RM) lib/unicorn_http.$(DLEXT) $(RM) -r .install-tmp mkdir .install-tmp - cp -p $^ .install-tmp - $(ruby) setup.rb all + cp -p bin/* .install-tmp + $(RUBY) setup.rb all $(RM) $^ - mv $(addprefix .install-tmp/,$(^F)) bin/ + mv .install-tmp/* bin/ $(RM) -r .install-tmp $(prep_setup_rb) @@ -115,18 +139,67 @@ prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean clean: -$(MAKE) -C $(ext) clean - $(RM) $(ext)/Makefile lib/unicorn/http11.$(DLEXT) + -$(MAKE) -C Documentation clean + $(RM) $(ext)/Makefile lib/unicorn_http.$(DLEXT) $(RM) $(setup_rb_files) $(t_log) - $(RM) -r $(test_prefix) + $(RM) -r $(test_prefix) man + +man: + $(MAKE) -C Documentation install-man + +pkg_extra := GIT-VERSION-FILE NEWS ChangeLog $(ext)/unicorn_http.c +manifest: $(pkg_extra) man + $(RM) .manifest + $(MAKE) .manifest -Manifest: - git ls-files > $@+ +.manifest: + (git ls-files && \ + for i in $@ $(pkg_extra) $(man1_paths); \ + do echo $$i; done) | LC_ALL=C sort > $@+ cmp $@+ $@ || mv $@+ $@ - $(RM) -f $@+ + $(RM) $@+ + +NEWS: GIT-VERSION-FILE .manifest + $(RAKE) -s news_rdoc > $@+ + mv $@+ $@ + +SINCE = 0.95.0 +ChangeLog: LOG_VERSION = \ + $(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \ + echo $(GIT_VERSION) || git describe) +ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION) +ChangeLog: GIT-VERSION-FILE + @echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+ + @echo >> $@+ + git log $(log_range) | sed -e 's/^/ /' >> $@+ + mv $@+ $@ + +news_atom := http://unicorn.bogomips.org/NEWS.atom.xml +cgit_atom := http://git.bogomips.org/cgit/unicorn.git/atom/?h=master +atom = <link rel="alternate" title="Atom feed" href="$(1)" \ + type="application/atom+xml"/> -# using rdoc 2.4.1 -doc: .document - rdoc -Na -m README -t "$(shell sed -ne '1s/^= //p' README)" +# using rdoc 2.4.1+ +doc: .document $(ext)/unicorn_http.c NEWS ChangeLog + for i in $(man1_bins); do > $$i; done + find bin lib -type f -name '*.rbc' -exec rm -f '{}' ';' + rdoc -Na -t "$(shell sed -ne '1s/^= //p' README)" + install -m644 COPYING doc/COPYING + install -m644 $(shell grep '^[A-Z]' .document) doc/ + $(MAKE) -C Documentation install-html install-man + install -m644 $(man1_paths) doc/ + cd doc && for i in $(base_bins); do \ + sed -e '/"documentation">/r man1/'$$i'.1.html' \ + < $${i}_1.html > tmp && mv tmp $${i}_1.html; done + $(RUBY) -i -p -e \ + '$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \ + doc/ChangeLog.html + $(RUBY) -i -p -e \ + '$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \ + doc/NEWS.html doc/README.html + $(RAKE) -s news_atom > doc/NEWS.atom.xml + cd doc && ln README.html tmp && mv tmp index.html + $(RM) $(man1_bins) rails_git_url = git://github.com/rails/rails.git rails_git := vendor/rails.git @@ -147,4 +220,69 @@ $(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 +ifneq ($(VERSION),) +rfproject := mongrel +rfpackage := unicorn +pkggem := pkg/$(rfpackage)-$(VERSION).gem +pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz +release_notes := release_notes-$(VERSION) +release_changes := release_changes-$(VERSION) + +release-notes: $(release_notes) +release-changes: $(release_changes) +$(release_changes): + $(RAKE) -s release_changes > $@+ + $(VISUAL) $@+ && test -s $@+ && mv $@+ $@ +$(release_notes): + GIT_URL=$(GIT_URL) $(RAKE) -s release_notes > $@+ + $(VISUAL) $@+ && test -s $@+ && mv $@+ $@ + +# ensures we're actually on the tagged $(VERSION), only used for release +verify: + test x"$(shell umask)" = x0022 + git rev-parse --verify refs/tags/v$(VERSION)^{} + git diff-index --quiet HEAD^0 + test `git rev-parse --verify HEAD^0` = \ + `git rev-parse --verify refs/tags/v$(VERSION)^{}` + +fix-perms: + git ls-tree -r HEAD | awk '/^100644 / {print $$NF}' | xargs chmod 644 + git ls-tree -r HEAD | awk '/^100755 / {print $$NF}' | xargs chmod 755 + +gem: $(pkggem) + +install-gem: $(pkggem) + gem install $(CURDIR)/$< + +$(pkggem): manifest fix-perms + gem build $(rfpackage).gemspec + mkdir -p pkg + mv $(@F) $@ + +$(pkgtgz): distdir = $(basename $@) +$(pkgtgz): HEAD = v$(VERSION) +$(pkgtgz): manifest fix-perms + @test -n "$(distdir)" + $(RM) -r $(distdir) + mkdir -p $(distdir) + tar cf - `cat .manifest` | (cd $(distdir) && tar xf -) + cd pkg && tar cf - $(basename $(@F)) | gzip -9 > $(@F)+ + mv $@+ $@ + +package: $(pkgtgz) $(pkggem) + +release: verify package $(release_notes) $(release_changes) + # make tgz release on RubyForge + rubyforge add_release -f -n $(release_notes) -a $(release_changes) \ + $(rfproject) $(rfpackage) $(VERSION) $(pkgtgz) + # push gem to Gemcutter + gem push $(pkggem) + # in case of gem downloads from RubyForge releases page + -rubyforge add_file \ + $(rfproject) $(rfpackage) $(VERSION) $(pkggem) +else +gem install-gem: GIT-VERSION-FILE + $(MAKE) $@ VERSION=$(GIT_VERSION) +endif + +.PHONY: .FORCE-GIT-VERSION-FILE doc $(T) $(slow_tests) manifest man |