You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by jc...@apache.org on 2010/12/02 22:13:38 UTC

svn commit: r1041583 [5/5] - in /subversion/branches/diff-optimizations-bytes: ./ build/ contrib/hook-scripts/ contrib/server-side/ subversion/bindings/javahl/native/ subversion/bindings/javahl/src/org/apache/subversion/javahl/ subversion/bindings/java...

Modified: subversion/branches/diff-optimizations-bytes/tools/dev/unix-build/Makefile.svn
URL: http://svn.apache.org/viewvc/subversion/branches/diff-optimizations-bytes/tools/dev/unix-build/Makefile.svn?rev=1041583&r1=1041582&r2=1041583&view=diff
==============================================================================
--- subversion/branches/diff-optimizations-bytes/tools/dev/unix-build/Makefile.svn (original)
+++ subversion/branches/diff-optimizations-bytes/tools/dev/unix-build/Makefile.svn Thu Dec  2 21:13:35 2010
@@ -38,7 +38,7 @@ APR_UTIL_VER	= 1.3.9
 HTTPD_VER	= 2.2.15
 NEON_VER	= 0.29.3
 SERF_VER	= 0.7.x
-SERF_OLD_VER	= 0.6.x
+SERF_OLD_VER	= 0.3.1
 CYRUS_SASL_VER	= 2.1.23
 SQLITE_VER	= 3.6.23.1
 
@@ -70,7 +70,7 @@ HTTPD_URL	= http://archive.apache.org/di
 NEON_URL	= http://webdav.org/neon/$(NEON_DIST)
 #SERF_URL	= http://serf.googlecode.com/files/$(SERF_DIST)
 SERF_URL	= http://serf.googlecode.com/svn/branches/$(SERF_VER)
-SERF_OLD_URL	= http://serf.googlecode.com/svn/branches/$(SERF_OLD_VER)
+SERF_OLD_URL	= http://serf.googlecode.com/svn/tags/$(SERF_OLD_VER)
 SQLITE_URL	= http://www.sqlite.org/$(SQLITE_DIST)
 CYRUS_SASL_URL	= ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/$(CYRUS_SASL_DIST)
 
@@ -105,6 +105,10 @@ SVN_OBJDIR	= $(OBJDIR)/$(SVN_REL_WC)
 # builds!
 svn_builddir	?=$(SVN_WC)
 
+ifdef PROFILE
+PROFILE_CFLAGS=-pg
+endif
+
 #######################################################################
 # Main targets.
 #######################################################################
@@ -117,12 +121,13 @@ all: dirs-create bdb-install apr-install
 
 # Use these to start a build from the beginning.
 reset: dirs-reset bdb-reset apr-reset iconv-reset apr-util-reset \
-	httpd-reset neon-reset serf-reset sqlite-reset cyrus-sasl-reset \
-	svn-reset
+	httpd-reset neon-reset serf-reset serf-old-reset sqlite-reset \
+	cyrus-sasl-reset svn-reset
 
-# Use to save disc space.
+# Use to save disk space.
 clean: bdb-clean apr-clean iconv-clean apr-util-clean httpd-clean \
-	neon-clean serf-clean cyrus-sasl-clean svn-clean
+	neon-clean serf-clean serf-old-clean sqlite-clean cyrus-sasl-clean \
+	svn-clean
 
 # Nukes everything (including installed binaries!)
 # Use this to start ALL OVER AGAIN! Use with caution!
@@ -189,7 +194,8 @@ $(BDB_OBJDIR)/.retrieved: $(DISTDIR)/$(B
 # configure bdb
 $(BDB_OBJDIR)/.configured: $(BDB_OBJDIR)/.retrieved
 	cd $(BDB_SRCDIR)/build_unix \
-		&& env CFLAGS="-g" ../dist/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		../dist/configure \
 		--prefix=$(PREFIX)/bdb \
 		--enable-debug
 	touch $@
@@ -227,6 +233,12 @@ $(APR_OBJDIR)/.retrieved:
 	fi
 	touch $@
 
+ifdef THREADING
+THREADS_FLAG=--enable-threads
+else
+THREADS_FLAG=--disable-threads
+endif
+
 # configure apr
 $(APR_OBJDIR)/.configured: $(APR_OBJDIR)/.retrieved
 	cp $(APR_SRCDIR)/build/apr_hints.m4 \
@@ -236,10 +248,11 @@ $(APR_OBJDIR)/.configured: $(APR_OBJDIR)
 			> $(APR_SRCDIR)/build/apr_hints.m4
 	cd $(APR_SRCDIR) && ./buildconf
 	cd $(APR_OBJDIR) \
-		&& env CFLAGS="-O0 -g" $(APR_SRCDIR)/configure \
+		&& env CFLAGS="-O0 -g $(PROFILE_CFLAGS)" \
+		$(APR_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
 		--enable-maintainer-mode \
-		--disable-threads
+		$(THREADS_FLAG)
 	touch $@
 
 # compile apr
@@ -280,7 +293,8 @@ $(APR_ICONV_OBJDIR)/.retrieved: $(DISTDI
 # configure apr-iconv
 $(APR_ICONV_OBJDIR)/.configured: $(APR_ICONV_OBJDIR)/.retrieved
 	cd $(APR_ICONV_OBJDIR) \
-		&& env CFLAGS="-g" $(APR_ICONV_SRCDIR)/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		$(APR_ICONV_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
 		--with-apr=$(PREFIX)/apr
 	touch $@
@@ -288,7 +302,7 @@ $(APR_ICONV_OBJDIR)/.configured: $(APR_I
 # compile apr-iconv
 $(APR_ICONV_OBJDIR)/.compiled: $(APR_ICONV_OBJDIR)/.configured
 	(cd $(APR_ICONV_OBJDIR) \
-		&& make CPPFLAGS="-D_OSD_POSIX" CFLAGS="-g -O0")
+		&& make CPPFLAGS="-D_OSD_POSIX" CFLAGS="-g -O0 $(PROFILE_CFLAGS)")
 	touch $@
 
 # install apr-iconv
@@ -359,7 +373,8 @@ $(GNU_ICONV_OBJDIR)/.configured: $(GNU_I
 	cd $(SRCDIR)/libiconv-${GNU_ICONV_VER} && \
 		${MAKE} -f Makefile.devel lib/aliases.h
 	cd $(GNU_ICONV_OBJDIR) \
-		&& env CFLAGS="-g" $(GNU_ICONV_SRCDIR)/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		$(GNU_ICONV_SRCDIR)/configure \
 		--prefix=$(PREFIX)/iconv \
 		--enable-extra-encodings
 	touch $@
@@ -426,7 +441,7 @@ $(APR_UTIL_OBJDIR)/.configured: $(APR_UT
 	cd $(APR_UTIL_SRCDIR) && ./buildconf --with-apr=$(APR_SRCDIR)
 	cd $(APR_UTIL_OBJDIR) \
 		&& env LD_LIBRARY_PATH=$(PREFIX)/bdb/lib \
-			CFLAGS="-O0 -g" \
+			CFLAGS="-O0 -g $(PROFILE_CFLAGS)" \
 			$(APR_UTIL_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
 		--enable-maintainer-mode \
@@ -474,7 +489,8 @@ $(HTTPD_OBJDIR)/.retrieved: $(DISTDIR)/$
 # configure httpd
 $(HTTPD_OBJDIR)/.configured: $(HTTPD_OBJDIR)/.retrieved
 	cd $(HTTPD_OBJDIR) \
-		&& $(HTTPD_SRCDIR)/configure \
+		&& CFLAGS="$(PROFILE_CFLAGS)" \
+		$(HTTPD_SRCDIR)/configure \
 		--prefix=$(PREFIX)/httpd \
 		--enable-maintainer-mode \
 		--enable-ssl \
@@ -553,7 +569,8 @@ $(NEON_OBJDIR)/.configured: $(NEON_OBJDI
 		chmod +x $(NEON_OBJDIR)/krb5-config; \
 	fi
 	cd $(NEON_OBJDIR) \
-		&& env CFLAGS="-g" $(NEON_SRCDIR)/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		$(NEON_SRCDIR)/configure \
 		PATH=$(NEON_OBJDIR):$$PATH \
 		--prefix=$(PREFIX)/neon \
 		--with-ssl \
@@ -611,7 +628,8 @@ $(SERF_OBJDIR)/.retrieved:
 # compile serf (serf won't compile outside its source tree)
 $(SERF_OBJDIR)/.compiled: $(SERF_OBJDIR)/.retrieved
 	cd $(SERF_SRCDIR) && \
-		env CFLAGS="-O0 -g" ./serfmake --with-apr=$(PREFIX)/apr \
+		env CFLAGS="-O0 -g $(PROFILE_CFLAGS)" \
+			./serfmake --with-apr=$(PREFIX)/apr \
 			--prefix=$(PREFIX)/serf \
 			build
 	touch $@
@@ -651,7 +669,8 @@ $(SERF_OLD_OBJDIR)/.retrieved:
 # compile serf (serf won't compile outside its source tree)
 $(SERF_OLD_OBJDIR)/.compiled: $(SERF_OLD_OBJDIR)/.retrieved
 	cd $(SERF_OLD_SRCDIR) && \
-		env CFLAGS="-O0 -g" ./serfmake --with-apr=$(PREFIX)/apr \
+		env CFLAGS="-O0 -g $(PROFILE_CFLAGS)" \
+			./serfmake --with-apr=$(PREFIX)/apr \
 			--prefix=$(PREFIX)/serf-old \
 			build
 	touch $@
@@ -678,6 +697,9 @@ sqlite-reset:
 	$(foreach f, .retrieved .configured .compiled .installed, \
 		rm -f $(SQLITE_OBJDIR)/$(f);)
 
+sqlite-clean:
+	-cd $(SQLITE_OBJDIR) && make clean
+
 # fetch distfile for sqlite
 $(DISTDIR)/$(SQLITE_DIST):
 	cd $(DISTDIR) && $(FETCH_CMD) $(SQLITE_URL)
@@ -688,13 +710,20 @@ $(SQLITE_OBJDIR)/.retrieved: $(DISTDIR)/
 	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(SQLITE_DIST)
 	touch $@
 
+ifdef THREADING
+THREADSAFE_FLAG=--enable-threadsafe
+else
+THREADSAFE_FLAG=--disable-threadsafe
+endif
+
 # configure sqlite
 $(SQLITE_OBJDIR)/.configured: $(SQLITE_OBJDIR)/.retrieved
 	cd $(SQLITE_OBJDIR) \
-		&& env CFLAGS="-g" $(SQLITE_SRCDIR)/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		$(SQLITE_SRCDIR)/configure \
 		--prefix=$(PREFIX)/sqlite \
 		--disable-tcl \
-		--disable-threadsafe
+		$(THREADSAFE_FLAG)
 	touch $@
 
 # compile sqlite
@@ -720,7 +749,7 @@ cyrus-sasl-reset:
 		rm -f $(CYRUS_SASL_OBJDIR)/$(f);)
 
 cyrus-sasl-clean:
-	-(cd $(CYRUS_SASL_OBJDIR) && make clean)
+	-(cd $(CYRUS_SASL_OBJDIR) && make distclean)
 
 # fetch distfile for cyrus-sasl
 $(DISTDIR)/$(CYRUS_SASL_DIST):
@@ -736,12 +765,22 @@ $(CYRUS_SASL_OBJDIR)/.retrieved: $(DISTD
 		> $(CYRUS_SASL_SRCDIR)/plugins/digestmd5.c.patched
 	mv $(CYRUS_SASL_SRCDIR)/plugins/digestmd5.c.patched \
 		$(CYRUS_SASL_SRCDIR)/plugins/digestmd5.c
+ifeq ($(UNAME),OpenBSD)
+	# Fixes GSSAPI support on OpenBSD, which hasn't got libroken:
+	for f in `grep -l -R -- -lroken $(CYRUS_SASL_SRCDIR)`; do \
+		sed -e 's/-lroken//g' < $$f > $$f.tmp && \
+		mv $$f.tmp $$f; \
+	done
+	chmod +x $(CYRUS_SASL_SRCDIR)/configure
+endif
 	touch $@
 
 # configure cyrus-sasl
 $(CYRUS_SASL_OBJDIR)/.configured: $(CYRUS_SASL_OBJDIR)/.retrieved
 	cd $(CYRUS_SASL_OBJDIR) \
-		&& env CFLAGS="-g" $(CYRUS_SASL_SRCDIR)/configure \
+		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
+		CPPFLAGS="-I/usr/include/kerberosV" \
+		$(CYRUS_SASL_SRCDIR)/configure \
 		--with-dbpath=$(PREFIX)/cyrus-sasl/etc/sasldb2 \
 		--with-plugindir=$(PREFIX)/cyrus-sasl/lib/sasl2 \
 		--with-configdir=$(PREFIX)/cyrus-sasl/lib/sasl2 \
@@ -810,19 +849,39 @@ $(SVN_OBJDIR)/.retrieved:
 ifeq ($(BRANCH_MAJOR),1.5)
 BDB_FLAG=$(PREFIX)/bdb
 SERF_FLAG=--with-serf="$(PREFIX)/serf-old"
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else ifeq ($(BRANCH_MAJOR),1.4)
 BDB_FLAG=$(PREFIX)/bdb
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else ifeq ($(BRANCH_MAJOR),1.3)
 BDB_FLAG=$(PREFIX)/bdb
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else ifeq ($(BRANCH_MAJOR),1.2)
 BDB_FLAG=$(PREFIX)/bdb
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else ifeq ($(BRANCH_MAJOR),1.1)
 BDB_FLAG=$(PREFIX)/bdb
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else ifeq ($(BRANCH_MAJOR),1.0)
 BDB_FLAG=$(PREFIX)/bdb
+MOD_DAV_SVN=modules/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/mod_authz_svn.so
+DISABLE_NEON_VERSION_CHECK=--disable-neon-version-check
 else
 BDB_FLAG=db.h:$(PREFIX)/bdb/include:$(PREFIX)/bdb/lib:db-$(BDB_MAJOR_VER)
 SERF_FLAG=--with-serf="$(PREFIX)/serf"
+MOD_DAV_SVN=modules/svn-$(WC)/mod_dav_svn.so
+MOD_AUTHZ_SVN=modules/svn-$(WC)/mod_authz_svn.so
 endif
 
 ifeq ($(ENABLE_JAVA_BINDINGS),yes)
@@ -832,6 +891,14 @@ else
 	JAVAHL_FLAG=--enable-javahl=no
 endif
 
+ifdef PROFILE
+SVN_ALL_STATIC=--enable-all-static
+else
+SVN_WITH_HTTPD=--with-apxs="$(PREFIX)/httpd/bin/apxs" \
+	--with-apache-libexecdir="$(PREFIX)/httpd/modules/svn-$(WC)"
+SVN_WITH_SASL=--with-sasl="$(PREFIX)/cyrus-sasl"
+endif
+
 # configure svn
 $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)/.retrieved
 	@if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
@@ -850,22 +917,23 @@ $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)
 			--prefix="$(SVN_PREFIX)" \
 			--with-apr="$(PREFIX)/apr" \
 			--with-apr-util="$(PREFIX)/apr" \
-			--with-apxs="$(PREFIX)/httpd/bin/apxs" \
-			--with-apache-libexecdir=$(PREFIX)/httpd/modules/svn-$(WC) \
 			--with-neon="$(PREFIX)/neon" \
+			$(SVN_WITH_HTTPD) \
+			$(SVN_WITH_SASL) \
 			$(SERF_FLAG) \
 			--with-sqlite="$(PREFIX)/sqlite" \
 			--with-berkeley-db="$(BDB_FLAG)" \
-			--with-sasl="$(PREFIX)/cyrus-sasl" \
 			--with-ruby-sitedir="$(SVN_PREFIX)/lib/ruby/site_ruby" \
 			--disable-mod-activation \
-			$(JAVAHL_FLAG)
+			$(JAVAHL_FLAG) \
+			$(SVN_ALL_STATIC) \
+			$(DISABLE_NEON_VERSION_CHECK)
 	touch $@
 
 # compile svn
 $(SVN_OBJDIR)/.compiled: $(SVN_OBJDIR)/.configured
 	cd $(svn_builddir) \
-		&& make
+		&& make EXTRA_CFLAGS="$(PROFILE_CFLAGS)"
 	touch $@
 
 # install svn
@@ -925,8 +993,8 @@ httpd-conf:
 	echo "# httpd config for make check" > $(HTTPD_CHECK_CONF)
 	echo "ServerRoot \"$(PREFIX)/httpd\"" >> $(HTTPD_CHECK_CONF)
 	echo "Listen localhost:$(HTTPD_CHECK_PORT)" >> $(HTTPD_CHECK_CONF)
-	echo "LoadModule dav_svn_module modules/svn-$(WC)/mod_dav_svn.so" >> $(HTTPD_CHECK_CONF)
-	echo "LoadModule authz_svn_module modules/svn-$(WC)/mod_authz_svn.so" >> $(HTTPD_CHECK_CONF)
+	echo "LoadModule dav_svn_module $(MOD_DAV_SVN)" >> $(HTTPD_CHECK_CONF)
+	echo "LoadModule authz_svn_module $(MOD_AUTHZ_SVN)" >> $(HTTPD_CHECK_CONF)
 	echo "DocumentRoot "$(PREFIX)/httpd/htdocs"" >> $(HTTPD_CHECK_CONF)
 	echo "# These two Locations are used for 'make check'" >> $(HTTPD_CHECK_CONF)
 	echo "<Directory />" >> $(HTTPD_CHECK_CONF)
@@ -965,6 +1033,10 @@ httpd-conf:
 # We need this to make sure some targets below pick up the right libraries
 LD_LIBRARY_PATH=$(PREFIX)/apr/lib:$(PREFIX)/iconv/lib:$(PREFIX)/bdb/lib:$(PREFIX)/neon/lib:$(PREFIX)/serf/lib:$(PREFIX)/sqlite/lib:$(PREFIX)/cyrus-sasl/lib:$(PREFIX)/iconv/lib:$(PREFIX)/svn-$(WC)/lib
 
+.PHONY: libpath
+libpath:
+	@echo export LD_LIBRARY_PATH=$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH
+
 .PHONY: start-svnserve stop-svnserve start-httpd stop-httpd
 
 HTTPD_CMD = env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
@@ -998,17 +1070,22 @@ stop-svnserve:
 
 # run tests in parallel
 PARALLEL=PARALLEL=1 CLEANUP=1
+TEST_LOGS=tests.log fails.log
 
 svn-check-neon: httpd-conf $(SVN_OBJDIR)/.compiled $(SVN_OBJDIR)/.bindings-compiled
 	$(HTTPD_START_CMD)
 	-cd $(svn_builddir) && make check FS_TYPE=fsfs \
 	       BASE_URL=http://localhost:$(HTTPD_CHECK_PORT) HTTP_LIBRARY=neon \
 	       $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_neon-fsfs
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-fsfs;)
 	-cd $(svn_builddir) && make check FS_TYPE=bdb \
 	       BASE_URL=http://localhost:$(HTTPD_CHECK_PORT) HTTP_LIBRARY=neon \
 	       $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_neon-bdb
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-bdb;)
 	$(HTTPD_STOP_CMD)
 
 svn-check-serf: httpd-conf $(SVN_OBJDIR)/.compiled $(SVN_OBJDIR)/.bindings-compiled
@@ -1016,27 +1093,39 @@ svn-check-serf: httpd-conf $(SVN_OBJDIR)
 	-cd $(svn_builddir) && make check FS_TYPE=fsfs \
 	       BASE_URL=http://localhost:$(HTTPD_CHECK_PORT) HTTP_LIBRARY=serf \
 	       $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_serf-fsfs
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-fsfs;)
 	-cd $(svn_builddir) && make check FS_TYPE=bdb \
 	       BASE_URL=http://localhost:$(HTTPD_CHECK_PORT) HTTP_LIBRARY=serf \
 	       $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_serf-bdb
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-bdb;)
 	$(HTTPD_STOP_CMD)
 
 svn-check-local:
 	-cd $(svn_builddir) && make check FS_TYPE=fsfs $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_local-fsfs
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-fsfs;)
 	-cd $(svn_builddir) && make check FS_TYPE=bdb $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_local-bdb
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-bdb;)
 
 svn-check-svn:
 	$(SVNSERVE_START_CMD)
 	-cd $(svn_builddir) && make check FS_TYPE=fsfs \
 		BASE_URL=svn://127.0.0.1 $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_svn-fsfs
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-fsfs;)
 	-cd $(svn_builddir) && make check FS_TYPE=bdb \
 		BASE_URL=svn://127.0.0.1 $(PARALLEL)
-	cp -f $(svn_builddir)/tests.log $(svn_builddir)/tests.log.ra_svn-bdb
+	-$(foreach log, $(TEST_LOGS), \
+		test -f $(svn_builddir)/$(log) && cp -f $(svn_builddir)/$(log) \
+			$(svn_builddir)/$(log).$@-bdb;)
 	$(SVNSERVE_STOP_CMD)
 
 .PHONY: svn-check-swig-pl svn-check-swig-py svn-check-swig-rb svn-check-javahl
@@ -1050,36 +1139,39 @@ RUBYLIB=$(SVN_PREFIX)/lib/ruby/site_ruby
 	cut -d'=' -f2)
 svn-check-swig-pl:
 	-if [ $(ENABLE_PERL_BINDINGS) = yes ]; then \
-		cd $(svn_builddir) && \
+		(cd $(svn_builddir) && \
 			env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
-			make check-swig-pl; \
+			make check-swig-pl 2>&1) | \
+				tee $(svn_builddir)/tests.log.bindings.pl; \
 	fi
-	touch $@
 
 svn-check-swig-py:
 	-if [ $(ENABLE_PYTHON_BINDINGS) = yes ]; then \
-		cd $(svn_builddir) && \
+		(cd $(svn_builddir) && \
 			env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
-			make check-swig-py; \
+			make check-swig-py 2>&1) | \
+				tee $(svn_builddir)/tests.log.bindings.py; \
 	fi
-	touch $@
 
+# We add the svn prefix to PATH here because the ruby tests
+# attempt to start an svnserve binary found in PATH.
 svn-check-swig-rb:
 	-if [ $(ENABLE_RUBY_BINDINGS) = yes ]; then \
-		cd $(svn_builddir)/subversion/bindings/swig/ruby/test && \
+		(cd $(svn_builddir)/subversion/bindings/swig/ruby/test && \
 			env RUBYLIB=$(RUBYLIB) \
 			LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
-			ruby run-test.rb --verbose=normal; \
+			PATH=$(SVN_PREFIX)/bin:$$PATH \
+			ruby run-test.rb --verbose=normal 2>&1) | \
+				tee $(svn_builddir)/tests.log.bindings.rb; \
 	fi
-	touch $@
 
 svn-check-javahl:
 	-if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
-		cd $(svn_builddir) && \
+		(cd $(svn_builddir) && \
 			env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
-			make check-javahl; \
+			make check-javahl 2>&1) | \
+				tee $(svn_builddir)/tests.log.bindings.javahl; \
 	fi
-	touch $@
 
 svn-check: svn-check-local svn-check-svn svn-check-neon svn-check-serf svn-check-bindings
 
@@ -1114,7 +1206,7 @@ endif
 	@echo "openssl:    `openssl version | cut -d' ' -f2`"
 	@echo "swig:       `swig -version | grep Version | cut -d' ' -f3`"
 	@echo "python:     `python --version 2>&1 | cut -d' ' -f2`"
-	@echo "perl:       `perl -version | grep ^This | cut -d' ' -f4 | sed -e 's/^v//'`"
+	@echo "perl:       `eval \`perl -V:version\`; echo $$version`"
 	@echo "ruby:       `ruby --version | cut -d' ' -f2`"
 ifeq ($(ENABLE_JAVA_BINDINGS),yes)
 	@echo "java:       `java -version 2>&1 | grep version | cut -d' ' -f3  | sed -e 's/\"//g'`"

Modified: subversion/branches/diff-optimizations-bytes/tools/dist/collect_sigs.py
URL: http://svn.apache.org/viewvc/subversion/branches/diff-optimizations-bytes/tools/dist/collect_sigs.py?rev=1041583&r1=1041582&r2=1041583&view=diff
==============================================================================
--- subversion/branches/diff-optimizations-bytes/tools/dist/collect_sigs.py (original)
+++ subversion/branches/diff-optimizations-bytes/tools/dist/collect_sigs.py Thu Dec  2 21:13:35 2010
@@ -1,10 +1,107 @@
 #!/usr/bin/env python
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+# A script intended to be useful in helping to collect signatures for a
+# release.  This is a pretty rough, and patches are welcome to improve it.
+#
+# Some thoughts about future improvement:
+#  * Display of per-file and per-release statistics
+#  * Make use of the python-gpg package (http://code.google.com/p/python-gnupg/)
+#  * Post to IRC when a new signature is collected
+#    - Since we don't want to have a long running bot, perhaps we could
+#      also patch wayita to accept and then echo a privmsg?
+#
+
+import sys, os
+import sqlite3
+
+def make_config():
+  'Output a blank config file'
+
+  if os.path.exists('config.py'):
+    print "'config.py' already exists!'"
+    sys.exit(1)
+
+  conf = open('config.py', 'w')
+  conf.write("version = ''\n")
+  conf.write("sigdir = ''\n")
+  conf.write("filesdir = ''\n")
+  conf.close()
+
+  print "'config.py' generated"
+
+def make_db():
+  'Initialize a blank database'
+
+  db = sqlite3.connect('sigs.db')
+  db.execute('''
+    CREATE TABLE signatures (
+      keyid TEXT, filename TEXT, signature BLOB,
+      UNIQUE(keyid,filename)
+    );
+''');
+
+# This function is web-facing
+def generate_asc_files(target_dir='.'):
+  fds = {}
+  def _open(filename):
+    if not fds.has_key(filename):
+      fd = open(os.path.join(target_dir, filename + '.asc'), 'w')
+      fds[filename] = fd
+    return fds[filename]
+
+  db = sqlite3.connect(os.path.join(target_dir, 'sigs.db'))
+  curs = db.cursor()
+  curs.execute('SELECT filename, signature FROM signatures;')
+  for filename, signature in curs:
+    fd = _open(filename)
+    fd.write(signature + "\n")
+
+  for fd in fds.values():
+    fd.flush()
+    fd.close()
+
+actions = {
+    'make_config' : make_config,
+    'make_db' : make_db,
+    'make_asc' : generate_asc_files,
+}
+
+
+if __name__ == '__main__':
+  if len(sys.argv) > 1:
+    if sys.argv[1] in actions:
+      actions[sys.argv[1]]()
+      sys.exit(0)
+
+
+# Stuff below this line is the web-facing side
+# ======================================================================
+
 
 import cgi
 import cgitb
 cgitb.enable()
 
-import sys, os, string, subprocess, re
+import string, subprocess, re
 
 try:
   sys.path.append(os.path.dirname(sys.argv[0]))
@@ -17,6 +114,18 @@ except:
 
 r = re.compile('\[GNUPG\:\] GOODSIG (\w*) (.*)')
 
+def files():
+  for f in os.listdir(config.filesdir):
+    if config.version in f and (f.endswith('.tar.gz') or f.endswith('.zip') or f.endswith('.tar.bz2')):
+      yield f
+
+def ordinal(N):
+  try:
+    return [None, 'first', 'second', 'third', 'fourth', 'fifth', 'sixth'][N]
+  except:
+    # Huh?  We only have six files to sign.
+    return "%dth" % N
+
 shell_content = '''
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
@@ -25,48 +134,67 @@ shell_content = '''
 <title>Signature collection for Subversion $version</title>
 </head>
 <body style="font-size: 14pt; text-align: justify;
-  background-color: #f0f0f0; padding: 0 5%">
-<p>This page is used to collect signatures for the proposed release of
-Apache Subversion $version.</p>
+  background-color: #f0f0f0; padding: 0 5%%">
+<p>This page is used to collect <a href="%s/list">signatures</a> for the
+proposed release of Apache Subversion $version.</p>
 $content
 </body>
 </html>
-'''
+''' % os.getenv('SCRIPT_NAME')
 
-def default_page():
-  c = '''
-<form method="post">
-File: <select name="filename">
-%s
-</select>
-<br/>
-<p>Paste signature in the area below:<br/>
-<textarea name="signature" rows="10" cols="80"></textarea>
+signature_area = '''
+<hr/>
+<form method="post" action="%s">
+<p>Paste one or more signatures in the area below:<br/>
+<textarea name="signatures" rows="20" cols="80"></textarea>
 </p>
 <input type="submit" value="Submit" />
+<p>Any text not between the <tt>BEGIN PGP SIGNATURE</tt>
+and <tt>END PGP SIGNATURE</tt> lines will be ignored.</p>
 </form>
+<hr/>
+''' % os.getenv('SCRIPT_NAME')
+ 
+
+
+def split(sigs):
+  lines = []
+  for line in sigs.split('\n'):
+    if lines or '--BEGIN' in line:
+      lines.append(line)
+    if '--END' in line:
+      yield "\n".join(lines) + "\n"
+      lines = []
+
+def list_signatures():
+  db = sqlite3.connect(os.path.join(config.sigdir, 'sigs.db'))
+  template = '''
+<hr/>
+<p>The following signature files are available:</p>
+<p>%s</p>
 '''
 
-  contents = [f for f in os.listdir('.')
-              if f.endswith('.tar.gz') or f.endswith('.zip')
-                                       or f.endswith('.tar.bz2')]
-  contents.sort()
-
-  options = ''
-  for f in contents:
-    options = options + '<option value="%s">%s</option>\n' % (f, f)
-
-  return c % options
-
+  lines = ""
+  curs = db.cursor()
+  curs.execute('''SELECT filename, COUNT(*) FROM signatures
+                  GROUP BY filename ORDER BY filename''')
+  for filename, count in curs:
+    lines += '<a href="%s/%s.asc">%s.asc</a>: %d signature%s<br/>\n' \
+             % (os.getenv('SCRIPT_NAME'), filename, filename,
+                count, ['s', ''][count == 1])
+  return (template % lines) + signature_area
+
+def save_valid_sig(db, filename, keyid, signature):
+  db.execute('INSERT OR REPLACE INTO signatures VALUES (?,?,?);',
+             (keyid, filename, buffer(signature)))
+  db.commit()
 
-def save_valid_sig(filename, signature):
-  f = open(os.path.join(config.sigdir, filename + '.asc'), 'a')
-  f.write(signature)
+  generate_asc_files(config.sigdir)
 
-
-def verify_sig(signature, filename):
+def verify_sig_for_file(signature, filename):
   args = ['gpg', '--logger-fd', '1', '--no-tty',
-          '--status-fd', '2', '--verify', '-', filename]
+          '--status-fd', '2', '--verify', '-',
+          os.path.join(config.filesdir, filename)]
 
   gpg = subprocess.Popen(args,
                          stdin=subprocess.PIPE,
@@ -87,49 +215,115 @@ def verify_sig(signature, filename):
   for line in lines:
     match = r.search(line)
     if match:
-      keyid = match.group(1)[-8:]
+      keyid = match.group(1)
       user = match.group(2)
 
-  return (True, (keyid, user))
-
+  return (True, (filename, keyid, user))
 
-def process_sig(signature, filename):
+def verify_sig(signature):
+  all_failures = ""
+  for filename in files():
+    (verified, result) = verify_sig_for_file(signature, filename)
+    if verified:
+      return (verified, result)
+    else:
+      all_failures += "%s:\n[[[\n%s]]]\n\n" % (filename, result)
+  return (False, all_failures)
+
+def process_sigs(signatures):
+  success = '''
+  <p style="color: green;">All %d signatures verified!</p>
+'''
+  failure = '''
+  <p style="color: red;">%d of %d signatures failed to verify; details below.</p>
+'''
   c_verified = '''
   <p style="color: green;">The signature is verified!</p>
   <p>Filename: <code>%s</code></p>
   <p>Key ID: <code>%s</code></p>
   <p>User: <code>%s</code></p>
   <p>This signature has been saved, and will be included as part of the
-    release signatures.  Please send mail to
-    <a href="mailto:dev@subversion.apache.org">dev@subversion.apache.org</a>
-    acknowledging your successful signature.</p>
+    release signatures.</p>
 '''
   c_unverified = '''
   <p style="color: red;">The signature was not able to be verified!</p>
-  <p>Filename: <code>%s</code></p>
+  <p>Signature: <pre>%s</pre></p>
   <p>Reason:</p><pre>%s</pre>
   <p>Please talk to the release manager if this is in error.</p>
 '''
 
-  (verified, result) = verify_sig(signature, filename)
-
-  if verified:
-    save_valid_sig(filename, signature)
-
-    return c_verified % (filename, result[0], result[1])
+  outcomes = []
+  N_sigs = 0
+  N_verified = 0
+  retval = ''
+
+  # Verify
+  db = sqlite3.connect(os.path.join(config.sigdir, 'sigs.db'))
+  for signature in split(signatures):
+    N_sigs += 1
+    (verified, result) = verify_sig(signature)
+    outcomes.append((verified, result))
+
+    if verified:
+      (filename, keyid, user) = result
+      save_valid_sig(db, filename, keyid, signature)
+      N_verified += 1
+
+  # Output header
+  if N_verified == N_sigs:
+    retval += success % N_sigs
   else:
-    return c_unverified % (filename, result)
+    retval += failure % (N_sigs-N_verified, N_sigs)
 
+  # Output details
+  N = 0
+  for outcome in outcomes:
+    N += 1
+    (verified, result) = outcome
+    retval += "<h1>Results for the %s signature</h1>" % ordinal(N)
+    if verified:
+      (filename, keyid, user) = result
+      retval += c_verified % (filename, keyid[-8:], user)
+    else:
+      retval += c_unverified % (signature, result)
+
+  return retval + signature_area
+
+
+def cat_signatures(basename):
+  # strip '.asc' extension
+  assert basename[:-4] in files()
+
+  # cat
+  ascfile = os.path.join(config.sigdir, basename)
+  if os.path.exists(ascfile):
+    return (open(ascfile, 'r').read())
 
-def main():
-  print "Content-Type: text/html"
+def print_content_type(mimetype):
+  print "Content-Type: " + mimetype
   print
 
+def main():
   form = cgi.FieldStorage()
-  if 'signature' not in form:
-    content = default_page()
-  else:
-    content = process_sig(form['signature'].value, form['filename'].value)
+  pathinfo = os.getenv('PATH_INFO')
+
+  # default value, to be changed below
+  content = signature_area
+
+  if 'signatures' in form:
+    content = process_sigs(form['signatures'].value)
+
+  elif pathinfo and pathinfo[1:]:
+    basename = pathinfo.split('/')[-1]
+
+    if basename == 'list':
+      content = list_signatures()
+
+    elif basename[:-4] in files():
+      # early exit; bypass 'content' entirely
+      print_content_type('text/plain')
+      print cat_signatures(basename)
+      return
 
   # These are "global" values, not specific to our action.
   mapping = {
@@ -137,6 +331,8 @@ def main():
       'content' : content,
     }
 
+  print_content_type('text/html')
+
   template = string.Template(shell_content)
   print template.safe_substitute(mapping)