summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Lattarini <stefano.lattarini@gmail.com>2014-12-19 15:10:09 +0100
committerStefano Lattarini <stefano.lattarini@gmail.com>2014-12-19 21:00:19 +0100
commite7c14d967b5bfa587c4a9fc847126b39198b7463 (patch)
treea7e0d4558e4cdecb6079ddc779dc184f8a8a3cb3
parent26aaa1c22db47d2a0ffdb4de79d196164c1e3b18 (diff)
downloadautomake-e7c14d967b5bfa587c4a9fc847126b39198b7463.tar.gz
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 <stefano.lattarini@gmail.com>
-rw-r--r--NEWS5
-rw-r--r--lib/am/header-vars.am35
2 files changed, 36 insertions, 4 deletions
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