about summary refs log tree commit homepage
path: root/GNUmakefile
diff options
context:
space:
mode:
Diffstat (limited to 'GNUmakefile')
-rw-r--r--GNUmakefile220
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