From: Stefano Lattarini Date: Fri, 19 Dec 2014 14:10:09 +0000 (+0100) Subject: Improve detection of GNU make, avoiding "Arg list too long" errors. X-Git-Tag: v1.15~8^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7c14d967b5bfa587c4a9fc847126b39198b7463;p=thirdparty%2Fautomake.git Improve detection of GNU make, avoiding "Arg list too long" errors. Such errors could take place when the main makefile included too many sub-makefiles, making $(MAKEFILE_LIST) too long and causing the recipes $(am__is_gnu_make) to exceed the shell's command-line length limits. This is not a theoretical issue: it could happen for projects having lots of C/C++ sources and using automatic dependency tracking, which created an included .Po sub-makefile for each of such sources. Fixes http://debbugs.gnu.org/18744 * lib/am/header-vars.am (am__is_gnu_make): Fix the logic to avoid the use of $(MAKEFILE_LIST). * NEWS: Update. Signed-off-by: Stefano Lattarini --- diff --git a/NEWS b/NEWS index 626d295ac..bdc9bb9ab 100644 --- a/NEWS +++ b/NEWS @@ -111,6 +111,11 @@ New in 1.14.2: - The expansion of AM_INIT_AUTOMAKE ends once again with a trailing newline (bug#16841). Regression introduced in Automake 1.14. + - The code used to detect whether the currently used make is GNU make + or not (relying on the private macro 'am__is_gnu_make') no longer + risks causing "Arg list too long" for projects using automatic + dependency tracking and having a ton of source files (bug#18744). + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ New in 1.14.1: diff --git a/lib/am/header-vars.am b/lib/am/header-vars.am index d25efa612..9283903a1 100644 --- a/lib/am/header-vars.am +++ b/lib/am/header-vars.am @@ -1,5 +1,5 @@ ## automake - create Makefile.in from Makefile.am -## Copyright (C) 1994-2013 Free Software Foundation, Inc. +## Copyright (C) 1994-2014 Free Software Foundation, Inc. ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -27,9 +27,36 @@ VPATH = @srcdir@ ## DESTDIR = ## Shell code that determines whether we are running under GNU make. -## This is somewhat of an hack, and might be improved, but is good -## enough for now. -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +## +## Why the this needs to be so convoluted? +## +## (1) We can't unconditionally use make functions or special variables +## starting with a dot, as those cause non-GNU implmentations to +## crash hard. +## +## (2) We can't use $(MAKE_VERSION) here, as it is also defined in some +## non-GNU make implementations (e.g., FreeBSD make). But at least +## BSD make does *not* define the $(CURDIR) variable -- it uses +## $(.CURDIR) instead. +## +## (3) We can't use $(MAKEFILE_LIST) here, as in some situations it +## might cause the shell to die with "Arg list too long" (see +## automake bug#18744). +## +## (4) We can't use $(MAKE_HOST) unconditionally, as it is only +## defined in GNU make 4.0 or later. +## +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} ## Shell code that determines whether the current make instance is ## running with a given one-letter option (e.g., -k, -n) that takes