bug-automake
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#18744: Problem with am__is_gnu_make: Arg list too long


From: Stefano Lattarini
Subject: bug#18744: Problem with am__is_gnu_make: Arg list too long
Date: Fri, 19 Dec 2014 15:16:41 +0100

Reference: http://debbugs.gnu.org/18744

On 10/16/2014 04:57 AM, Daniel Richard G. wrote:
Hello gnus,

I was hacking on libarchive for compatibility with an older Tru64
system, in conjuction with Automake 1.14.1, when I encountered a problem
during "gmake check":

[...]
gmake  check-TESTS
gmake[2]: Entering directory `/tmp/libarchive-3.1.2/_build'
gmake[3]: Entering directory `/tmp/libarchive-3.1.2/_build'
../build/autoconf/test-driver: line 107: 23320 Segmentation fault      "$@" >$log_file 
2>&1
FAIL: libarchive_test
FAIL: bsdtar_test
FAIL: bsdcpio_test
FAIL: bsdcat_test
gmake[3]: execvp: bash: Arg list too long
gmake[3]: *** [test-suite.log] Error 127
gmake[3]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake[2]: *** [check-TESTS] Error 2
gmake[2]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake[1]: *** [check-am] Error 2
gmake[1]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake: *** [check] Error 2


Where was that "Arg list too long" error coming from? I removed some
leading "@" specifiers from some makefile recipe lines, and got this:

[...]
FAIL: libarchive_test
FAIL: bsdtar_test
FAIL: bsdcpio_test
FAIL: bsdcat_test
bases='libarchive_test.log bsdtar_test.log bsdcpio_test.log bsdcat_test.log'; 
bases=`for i in $bases; do echo $i; done | sed 's/\.log$//'`; bases=`echo 
$bases`; \
        am__f_ok () { test -f "$1" && test -r "$1"; }; \
        redo_bases=`for i in $bases; do \
                      am__f_ok $i.trs && am__f_ok $i.log || echo $i; \
                    done`; \
        if test -n "$redo_bases"; then \
          redo_logs=`for i in $redo_bases; do echo $i.log; done`; \
          redo_results=`for i in $redo_bases; do echo $i.trs; done`; \
          if (target_option=n; case ${target_option-} in ?) ;; *) echo "am__make_running_with_option: 
internal error: invalid" "target option '${target_option-}' specified" >&2; exit 1;; 
esac; has_opt=no; sane_makeflags=$MAKEFLAGS; if test -n ' Makefile cat/.deps/bsdcat-bsdcat.Po 
cat/.deps/bsdcat-cmdline.Po cat/test/.deps/bsdcat_test-main.Po cat/test/.deps/bsdcat_test-test_0.Po 
cat/test/.deps/bsdcat_test-test_empty_gz.Po cat/test/.deps/bsdcat_test-test_empty_lz4.Po 
cat/test/.deps/bsdcat_test-test_empty_xz.Po cat/test/.deps/bsdcat_test-test_error.Po 
cat/test/.deps/bsdcat_test-test_error_mixed.Po cat/test/.deps/bsdcat_test-test_expand_Z.Po 
cat/test/.deps/bsdcat_test-test_expand_bz2.Po cat/test/.deps/bsdcat_test-test_expand_gz.Po 
cat/test/.deps/bsdcat_test-test_expand_lz4.Po cat/test/.deps/bsdcat_test-test_expand_mixed.Po 
cat/test/.deps/bsdcat_test-test_expand_plain.Po cat/test/.deps/bsdcat_test-test_expand_xz.Po 
cat/test/.deps/bsdcat_test-test_help.Po cat/test/.deps/bsdcat_test-test_version.
Po cpio/.deps/bsdcpio-cmdline.Po cpio/.deps/bsdcpio-cpio.Po 
cpio/.deps/bsdcpio-cpio_windows.Po cpio/.deps/bsdcpio_test-cmdline.Po 
cpio/test/.deps/bsdcpio_test-main.Po cpio/test/.deps/bsdcpio_test-test_0.Po 
cpio/test/.deps/bsdcpio_test-test_basic.Po [...]


That last "if test -n" statement includes what appears to be every *.Po
and *.Plo file in the entire project---not helped, perhaps, by the fact
that this project has a bazillion source files and only a single top-
level makefile. Not only that, the output showed *two* full instances of
this list in the same recipe line, presumably resulting from two
expansions of the same problematic construct.

This appeared to be $(am__make_dryrun) at first, but nested within was
$(am__make_running_with_option), and in turn $(am__is_gnu_make):

     am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'

To confirm that this was the problem, I added the following rule to the
makefile...

     print-makefile-list:
             : $(MAKEFILE_LIST)

...and then tried

     $ gmake print-makefile-list
     :  Makefile cat/.deps/bsdcat-bsdcat.Po cat/.deps/bsdcat-cmdline.Po 
cat/test/.deps/bsdcat_test-main.Po cat/test/.deps/bsdcat_test-test_0.Po 
cat/test/.deps/bsdcat_test-test_empty_gz.Po [...]

Yep, those *.Po/*.Plo files are makefile fragments that get include'd,
so it makes sense that we end up with a huge MAKEFILE_LIST. If I change
am__is_gnu_make to...

     am__is_gnu_make = test -n '$(MAKE_VERSION)' && test -n '$(MAKELEVEL)'

...given that MAKE_VERSION appears to be a shorter example of a GNU-Make-
only variable, then things work as they should:

[...]
gmake[5]: Nothing to be done for `all-am'.
gmake[5]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake[4]: Leaving directory `/tmp/libarchive-3.1.2/_build'
============================================================================
Testsuite summary for libarchive 3.1.2
============================================================================
# TOTAL: 4
# PASS:  0
# SKIP:  0
# XFAIL: 0
# FAIL:  4
# XPASS: 0
# ERROR: 0
============================================================================
See ./test-suite.log
Please report to address@hidden
============================================================================
gmake[3]: *** [test-suite.log] Error 1
gmake[3]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake[2]: *** [check-TESTS] Error 2
gmake[2]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake[1]: *** [check-am] Error 2
gmake[1]: Leaving directory `/tmp/libarchive-3.1.2/_build'
gmake: *** [check] Error 2


(At least as far as the test infrastructure is concerned!)


--Daniel


Thanks for the report.  I agree with the spirit of your fix, but
unfortunately the $(MAKE_VERSION) macro seem present also in non-GNU
implementations of make (e.g., FreeBSD's).  Let me look for a better
variable...





reply via email to

[Prev in Thread] Current Thread [Next in Thread]