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 <r...@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. 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 -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University