diff mbox

[build] Support multilib testing in libgo

Message ID yddwrj9c21k.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth April 4, 2011, 6:19 p.m. UTC
make check in libgo currently tests the default multilib only, among
others because automake has no support for multilib testing.  It would
have to be especially careful here since for a DejaGnu testsuite, this
is handled internally to dg, while for other testsuites, one needs to
run make check in all multilibs and eventually collect the results if
one wants to provide dg-style <tool>.sum and <tool>.log files.

The following patch provides this, and handles another problem at the
same time: the use of -Wl,-R in CHECK isn't portable (e.g. IRIX and
Tru64 UNIX use -rpath instead).  While one could use libtool for the
linking, this doesn't solve another related issue: on systems that don't
have libgcc_s.so.1 in the default search path of the runtime linker,
that file isn't found even if the correct -R equivalent were used to
link libgo.so.  What's worse, even before this patch, make
check-target-libgo from the toplevel works since the toplevel Makefile
sets LD_LIBRARY_PATH for the default libgcc_s.so.1 multilib, but doesn't
do this for non-default ones (cf. PR other/43445).  If running make
check inside libgo, LD_LIBRARY_PATH isn't set and the tests fail.

To avoid this mess, I'm instead setting LD_LIBRARY_PATH in CHECK.  While
this isn't exactly portable (some platforms, especially Darwin and
HP-UX, use different variables), it's at least more widespread than -R.

There's one related issue: the http/cgi test currently fails on Solaris:

ld.so.1: a.out: fatal: libgo.so.0: open failed: No such file or directory
--- FAIL: cgi.TestHostingOurselves (0.00 seconds)
	for key "env-SCRIPT_NAME" got ""; expected "/test.go"
	for key "env-SCRIPT_FILENAME" got ""; expected "./a.out"
	for key "env-REMOTE_ADDR" got ""; expected "1.2.3.4"
	for key "env-SERVER_NAME" got ""; expected "example.com"
	for key "env-REQUEST_URI" got ""; expected "/test.go?foo=bar&a=b"
	for key "env-REQUEST_METHOD" got ""; expected "GET"
	for key "env-REMOTE_HOST" got ""; expected "1.2.3.4"
	for key "param-a" got ""; expected "b"
	for key "test" got ""; expected "Hello CGI-in-CGI"
	for key "env-SERVER_PORT" got ""; expected "80"
	for key "env-QUERY_STRING" got ""; expected "foo=bar&a=b"
	for key "param-foo" got ""; expected "bar"
	for key "env-HTTP_HOST" got ""; expected "example.com"
	for key "env-SERVER_SOFTWARE" got ""; expected "go"
	for key "env-GATEWAY_INTERFACE" got ""; expected "CGI/1.1"
	got a Content-Type of ""; expected "text/html; charset=utf-8"
	got a X-Test-Header of ""; expected "X-Test-Value"
FAIL
FAIL: http/cgi

cgi.TestHostingOurselves is the only failing subtest here.  As one can
see with truss -e, the rest of the environment is cleared:

28130:  execve("a.out", 0xDE20ED80, 0xDE21AA80)  argc = 2
28130:   argv: ./a.out -test.run=TestBeChildCGIProcess
28130:   envp: SERVER_SOFTWARE=go SERVER_NAME=example.com
28130:    HTTP_HOST=example.com GATEWAY_INTERFACE=CGI/1.1
28130:    REQUEST_METHOD=GET QUERY_STRING=foo=bar&a=b
28130:    REQUEST_URI=/test.go?foo=bar&a=b PATH_INFO=
28130:    SCRIPT_NAME=/test.go SCRIPT_FILENAME=./a.out
28130:    REMOTE_ADDR=1.2.3.4 REMOTE_HOST=1.2.3.4 SERVER_PORT=80

so LD_LIBRARY_PATH is lost.

Apart from running make check-am in the default and non-default multilib
dirs and collecting/summarizing the results afterwards, this patch
changes the capitalization of Summary in the === libgo Summary.* ===
lines to make mail-report.log properly handles them.

I now ignore the exit code from $(MAKE) -k $(TEST_PACKAGES) in check-am;
otherwise once a multilib test fails the check-tail target isn't run
anymore.

Tested with a Go-only bootstrap on i386-pc-solaris2.10 after
incorporating the latest changes, and a full bootstrap on
i386-pc-solaris2.11.

	Rainer


2011-02-13  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	* Makefile.am (CHECK): Add GOCFLAGS to $GC.
	Remove -Wl,-R from $GC.
	Add LD_LIBRARY_PATH.
	(check): Depend on check-multi, check-tail.
	(check-recursive): Depend on check-head.
	(check-am): Move header, footer generation ...
	(check-head, check-tail): ... here.
	New targets.
	(check-multi): New target.
	(MOSTLYCLEAN_FILES): Replace libgo.tail by libgo.head, add
	libgo.sum.sep, libgo.log.sep.
	* Makefile.in: Regenerate.

Comments

Ralf Wildenhues April 10, 2011, 7:46 a.m. UTC | #1
* Rainer Orth wrote on Mon, Apr 04, 2011 at 08:19:19PM CEST:
> To avoid this mess, I'm instead setting LD_LIBRARY_PATH in CHECK.  While
> this isn't exactly portable (some platforms, especially Darwin and
> HP-UX, use different variables), it's at least more widespread than -R.

Toplevel configure computes RPATH_ENVVAR for the host, and toplevel
Makefile passes that.  If you need it for the target, it should be
easy to repeat those five lines of code somewhere.

> +check-tail: check-recursive check-multi
> +	@lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
> +	for dir in . $(MULTIDIRS); do \
> +	  mv ../$${dir}/$${lib}/libgo.sum ../$${dir}/$${lib}/libgo.sum.sep; \
> +	  mv ../$${dir}/$${lib}/libgo.log ../$${dir}/$${lib}/libgo.log.sep; \
> +	done; \
> +	mv libgo.head libgo.sum; \
> +	cp libgo.sum libgo.log; \
> +	echo "Schedule of variations:" >> libgo.sum; \
> +	for dir in . $(MULTIDIRS); do \
> +	  multidir=../$${dir}/$${lib}; \
> +	  multivar=`cat $${multidir}/libgo.var`; \
> +	  echo "    $${multivar}" >> libgo.sum; \
> +	done; \
> +	echo >> libgo.sum; \
> +	pass=0; fail=0; untested=0; \
> +	for dir in . $(MULTIDIRS); do \
> +	  multidir=../$${dir}/$${lib}; \
> +	  multivar=`cat $${multidir}/libgo.var`; \
> +	  echo "Running target $${multivar}" >> libgo.sum; \
> +	  echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum; \
> +	  cat $${multidir}/libgo.sum.sep >> libgo.sum; \
> +	  cat $${multidir}/libgo.log.sep >> libgo.log; \
> +	  echo "		=== libgo Summary for $${multivar} ===" >> libgo.sum; \
> +	  echo >> libgo.sum; \
> +	  p=`grep -c PASS $${multidir}/libgo.sum.sep`; \
> +	  if test "$$p" != "0"; then \

I'd use -ne instead of != here and below.

> +	    echo "# of expected passes		$$p" >> libgo.sum; \
> +	  fi; \
> +	  pass=`expr $$pass + $$p`; \
> +	  p=`grep -c FAIL $${multidir}/libgo.sum.sep`; \
> +	  if test "$$p" != "0"; then \
> +	    echo "# of unexpected failures	$$p" >> libgo.sum; \
> +	  fi; \
> +	  fail=`expr $$fail + $$p`; \
> +	  p=`grep -c UNTESTED libgo.sum`; \
> +	  if test "$$p" != "0"; then \
> +	    echo "# of untested testcases	$$p" >> libgo.tail; \
> +	  fi; \
> +	  untested=`expr $$untested + $$p`; \
> +	done; \
> +	echo >> libgo.sum; \
> +	echo "		=== libgo Summary  ===" >> libgo.sum; \
> +	echo >> libgo.sum; \
> +	if test "$$pass" != "0"; then \
> +	  echo "# of expected passes		$$pass" >> libgo.sum; \
> +	fi; \
> +	if test "$$fail" != "0"; then \
> +	  echo "# of unexpected failures	$$fail" >> libgo.sum; \
> +	fi; \
> +	if test "$$untested" != "0"; then \
> +	  echo "# of untested testcases		$$untested" >> libgo.sum; \
> +	fi; \
> +	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \

This line:
        echo `echo $(GOC) | sed -e 's/ .*//'` ...

is equivalent to:
        echo $(GOC) ...

as the shell squashes unquoted multiple adjacent white space.

> +	echo >> libgo.log; \
> +	echo "runtest completed at `date`" >> libgo.log
> +
>  check-am:
>  	@rm -f libgo.sum libgo.log libgo.tail
> -	@echo "Test Run By $${USER} on `date`" > libgo.sum
> -	@echo "Native configuration is $(host_triplet)" >> libgo.sum
> -	@echo >> libgo.sum
> -	@echo "		=== libgo tests ===" >> libgo.sum
> -	@echo >> libgo.sum
> -	@echo "Schedule of variations:" >> libgo.sum
> -	@echo "    unix" >> libgo.sum
> -	@echo >> libgo.sum
> -	@echo "Running target unix" >> libgo.sum
> -	@echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum
> -	@cp libgo.sum libgo.log
> -	@echo > libgo.tail
> -	@echo "		=== libgo summary ===" >> libgo.tail
> -	@echo >> libgo.tail
> +	@multivar="unix"; \
> +	[ -z "$(MULTIFLAGS)" ] || multivar="$${multivar}/$(MULTIFLAGS)"; \
> +	echo "$${multivar}" > libgo.var
>  	@for f in $(TEST_PACKAGES); do \
>  	   rm -f $$f-testsum $$f-testlog; \
>  	 done
> -	@$(MAKE) -k $(TEST_PACKAGES); \
> -	status=$$?; \
> +	-@$(MAKE) -k $(TEST_PACKAGES)
>  	for f in $(TEST_PACKAGES); do \
>  	  if test -f $$f-testsum; then \
>  	    cat $$f-testsum >> libgo.sum; \
> @@ -3095,27 +3153,12 @@ check-am:
>  	  if test -f $$f-testlog; then \
>  	    cat $$f-testlog >> libgo.log; \
>  	  fi; \
> -	done; \
> -	p=`grep -c PASS libgo.sum`; \
> -	if test "$$p" != "0"; then \
> -	  echo "# of expected passes		$$p" >> libgo.tail; \
> -	fi; \
> -	p=`grep -c FAIL libgo.sum`; \
> -	if test "$$p" != "0"; then \
> -	  echo "# of unexpected failures	$$p" >> libgo.tail; \
> -	fi; \
> -	p=`grep -c UNTESTED libgo.sum`; \
> -	if test "$$p" != "0"; then \
> -	  echo "# of untested testcases		$$p" >> libgo.tail; \
> -	fi; \
> -	cat libgo.tail >> libgo.sum; \
> -	cat libgo.tail >> libgo.log; \
> -	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \
> -	echo >> libgo.log; \
> -	echo "runtest completed at `date`" >> libgo.log; \
> -	exit $$status
> -
> -MOSTLYCLEAN_FILES = libgo.tail
> +	done
> +
> +check-multi:
> +	$(MULTIDO) $(AM_MAKEFLAGS) DO=check-am multi-do # $(MAKE)
> +
> +MOSTLYCLEAN_FILES = libgo.head libgo.sum.sep libgo.log.sep
>  
>  mostlyclean-local:
>  	find . -name '*.lo' -print | xargs $(LIBTOOL) --mode=clean rm -f

Cheers,
Ralf
diff mbox

Patch

diff --git a/libgo/Makefile.am b/libgo/Makefile.am
--- a/libgo/Makefile.am
+++ b/libgo/Makefile.am
@@ -1547,12 +1547,15 @@  GOTESTFLAGS =
 
 # Check a package.
 CHECK = \
-	GC="$(GOC) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs -Wl,-R,`${PWD_COMMAND}`/.libs"; \
+	GC="$(GOC) $(GOCFLAGS) -L `${PWD_COMMAND}` -L `${PWD_COMMAND}`/.libs"; \
 	export GC; \
 	RUNTESTFLAGS="$(RUNTESTFLAGS)"; \
 	export RUNTESTFLAGS; \
 	MAKE="$(MAKE)"; \
 	export MAKE; \
+	libgcc=`${GOC} ${GOCFLAGS} -print-libgcc-file-name`; \
+	LD_LIBRARY_PATH="`${PWD_COMMAND}`/.libs:`dirname $${libgcc}`:${LD_LIBRARY_PATH}"; \
+	export LD_LIBRARY_PATH; \
 	rm -f $@-testsum $@-testlog; \
 	prefix=`if test "$(@D)" = "regexp"; then echo regexp-test; else dirname $(@D); fi`; \
 	test "$${prefix}" != "." || prefix="$(@D)"; \
@@ -3067,27 +3070,82 @@  TEST_PACKAGES = \
 	testing/quick/check \
 	testing/script/check
 
+check: check-tail
+check-recursive: check-head
+
+check-head:
+	@echo "Test Run By $${USER} on `date`" > libgo.head
+	@echo "Native configuration is $(host_triplet)" >> libgo.head
+	@echo >> libgo.head
+	@echo "		=== libgo tests ===" >> libgo.head
+	@echo >> libgo.head
+
+check-tail: check-recursive check-multi
+	@lib=`${PWD_COMMAND} | sed -e 's,^.*/\([^/][^/]*\)$$,\1,'`; \
+	for dir in . $(MULTIDIRS); do \
+	  mv ../$${dir}/$${lib}/libgo.sum ../$${dir}/$${lib}/libgo.sum.sep; \
+	  mv ../$${dir}/$${lib}/libgo.log ../$${dir}/$${lib}/libgo.log.sep; \
+	done; \
+	mv libgo.head libgo.sum; \
+	cp libgo.sum libgo.log; \
+	echo "Schedule of variations:" >> libgo.sum; \
+	for dir in . $(MULTIDIRS); do \
+	  multidir=../$${dir}/$${lib}; \
+	  multivar=`cat $${multidir}/libgo.var`; \
+	  echo "    $${multivar}" >> libgo.sum; \
+	done; \
+	echo >> libgo.sum; \
+	pass=0; fail=0; untested=0; \
+	for dir in . $(MULTIDIRS); do \
+	  multidir=../$${dir}/$${lib}; \
+	  multivar=`cat $${multidir}/libgo.var`; \
+	  echo "Running target $${multivar}" >> libgo.sum; \
+	  echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum; \
+	  cat $${multidir}/libgo.sum.sep >> libgo.sum; \
+	  cat $${multidir}/libgo.log.sep >> libgo.log; \
+	  echo "		=== libgo Summary for $${multivar} ===" >> libgo.sum; \
+	  echo >> libgo.sum; \
+	  p=`grep -c PASS $${multidir}/libgo.sum.sep`; \
+	  if test "$$p" != "0"; then \
+	    echo "# of expected passes		$$p" >> libgo.sum; \
+	  fi; \
+	  pass=`expr $$pass + $$p`; \
+	  p=`grep -c FAIL $${multidir}/libgo.sum.sep`; \
+	  if test "$$p" != "0"; then \
+	    echo "# of unexpected failures	$$p" >> libgo.sum; \
+	  fi; \
+	  fail=`expr $$fail + $$p`; \
+	  p=`grep -c UNTESTED libgo.sum`; \
+	  if test "$$p" != "0"; then \
+	    echo "# of untested testcases	$$p" >> libgo.tail; \
+	  fi; \
+	  untested=`expr $$untested + $$p`; \
+	done; \
+	echo >> libgo.sum; \
+	echo "		=== libgo Summary  ===" >> libgo.sum; \
+	echo >> libgo.sum; \
+	if test "$$pass" != "0"; then \
+	  echo "# of expected passes		$$pass" >> libgo.sum; \
+	fi; \
+	if test "$$fail" != "0"; then \
+	  echo "# of unexpected failures	$$fail" >> libgo.sum; \
+	fi; \
+	if test "$$untested" != "0"; then \
+	  echo "# of untested testcases		$$untested" >> libgo.sum; \
+	fi; \
+	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \
+	echo >> libgo.log; \
+	echo "runtest completed at `date`" >> libgo.log
+
 check-am:
 	@rm -f libgo.sum libgo.log libgo.tail
-	@echo "Test Run By $${USER} on `date`" > libgo.sum
-	@echo "Native configuration is $(host_triplet)" >> libgo.sum
-	@echo >> libgo.sum
-	@echo "		=== libgo tests ===" >> libgo.sum
-	@echo >> libgo.sum
-	@echo "Schedule of variations:" >> libgo.sum
-	@echo "    unix" >> libgo.sum
-	@echo >> libgo.sum
-	@echo "Running target unix" >> libgo.sum
-	@echo "Running $(srcdir)/libgo.exp ..." >> libgo.sum
-	@cp libgo.sum libgo.log
-	@echo > libgo.tail
-	@echo "		=== libgo summary ===" >> libgo.tail
-	@echo >> libgo.tail
+	@multivar="unix"; \
+	[ -z "$(MULTIFLAGS)" ] || multivar="$${multivar}/$(MULTIFLAGS)"; \
+	echo "$${multivar}" > libgo.var
 	@for f in $(TEST_PACKAGES); do \
 	   rm -f $$f-testsum $$f-testlog; \
 	 done
-	@$(MAKE) -k $(TEST_PACKAGES); \
-	status=$$?; \
+	-@$(MAKE) -k $(TEST_PACKAGES)
 	for f in $(TEST_PACKAGES); do \
 	  if test -f $$f-testsum; then \
 	    cat $$f-testsum >> libgo.sum; \
@@ -3095,27 +3153,12 @@  check-am:
 	  if test -f $$f-testlog; then \
 	    cat $$f-testlog >> libgo.log; \
 	  fi; \
-	done; \
-	p=`grep -c PASS libgo.sum`; \
-	if test "$$p" != "0"; then \
-	  echo "# of expected passes		$$p" >> libgo.tail; \
-	fi; \
-	p=`grep -c FAIL libgo.sum`; \
-	if test "$$p" != "0"; then \
-	  echo "# of unexpected failures	$$p" >> libgo.tail; \
-	fi; \
-	p=`grep -c UNTESTED libgo.sum`; \
-	if test "$$p" != "0"; then \
-	  echo "# of untested testcases		$$p" >> libgo.tail; \
-	fi; \
-	cat libgo.tail >> libgo.sum; \
-	cat libgo.tail >> libgo.log; \
-	echo `echo $(GOC) | sed -e 's/ .*//'`  `$(GOC) -v 2>&1 | grep " version" | sed -n -e 's/.* \(version.*$$\)/\1/p'` >> libgo.sum; \
-	echo >> libgo.log; \
-	echo "runtest completed at `date`" >> libgo.log; \
-	exit $$status
-
-MOSTLYCLEAN_FILES = libgo.tail
+	done
+
+check-multi:
+	$(MULTIDO) $(AM_MAKEFLAGS) DO=check-am multi-do # $(MAKE)
+
+MOSTLYCLEAN_FILES = libgo.head libgo.sum.sep libgo.log.sep
 
 mostlyclean-local:
 	find . -name '*.lo' -print | xargs $(LIBTOOL) --mode=clean rm -f