Hi Hiroyuki Sato,

On Wednesday 02 of September 2015 16:00:34 Hiroyuki Sato wrote:
> This configure.ac is extreme slow on libtool-2.4.6.
> But It run smoothly on libtool-2.4.2.
> https://github.com/groonga/groonga/blob/master/configure.ac

thanks for reproducer!

This _really_ looks like issue mentioned [1], though the thread is
believed to be resolved (with existing small slowdown between
libtool-2.4.5 and 2.4.2).  Let me CC Robert whether this patch does not
actually fix the "1 sec" slowdown of libtoolize.

> Could you tell me how to fix this problem?.

You can workaround/fix this by:
-m4_define([nginx_version], m4_include(nginx_version))
-NGINX_VERSION=nginx_version
+NGINX_VERSION=m4_include([nginx_version])

See the "recursion" in 'nginx_version' definition.  Its not recursion
usually (because nginx_version is not defined in the time of m4_define)
-- but libtoolize script does 'm4_undefine(m4_include)' before
evaluating configure.ac.

> Is this libtool's Bug?

I would say so, see the attached patch I'll push very soon (if there are
no objections).

> * OS OSX 10.10.5. and CentOS7

Should be IMO reproducible everywhere.

[1] http://lists.gnu.org/archive/html/libtool/2015-02/msg00000.html

Thanks, Pavel
------

> Thanks.
> 
> libtool-2.4.6
> 
>   time /tmp/libtool246/bin/libtoolize --verbose --copy --force
>   libtoolize: found 'configure.ac'
>   libtoolize: export M4='/usr/bin/gm4'
> 
>   It takes around 10 minutes.
> 
> libtool-2.4.2
> 
>   time /tmp/libtool242/bin/libtoolize --verbose --copy --force
>   libtoolize: rm -f './ltmain.sh'
>   libtoolize: putting auxiliary files in `.'.
>   libtoolize: copying file from 
> `/tmp/libtool242/share/libtool/config/ltmain.sh'
>   libtoolize: rm -f './libtool.m4'
>   libtoolize: rm -f './ltoptions.m4'
>   libtoolize: rm -f './ltsugar.m4'
>   libtoolize: rm -f './ltversion.m4'
>   libtoolize: rm -f './lt~obsolete.m4'
>   libtoolize: Not copying `./argz.m4', libltdl not used.
>   libtoolize: putting macros in `.'.
>   libtoolize: copying file from `/tmp/libtool242/share/aclocal/libtool.m4'
>   libtoolize: Not copying `./ltdl.m4', libltdl not used.
>   libtoolize: copying file from `/tmp/libtool242/share/aclocal/ltoptions.m4'
>   libtoolize: copying file from `/tmp/libtool242/share/aclocal/ltsugar.m4'
>   libtoolize: copying file from `/tmp/libtool242/share/aclocal/ltversion.m4'
>   libtoolize: copying file from `/tmp/libtool242/share/aclocal/lt~obsolete.m4'
>   libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
>   libtoolize: rerunning libtoolize, to keep the correct libtool macros 
> in-tree.
> 
>   real 0m1.003s
>   user 0m0.364s
>   sys 0m0.540s
> 
> 
> 
>From 40d297de7502f93a546126ff69d3f687f3d3ca1a Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <prais...@redhat.com>
Date: Fri, 18 Sep 2015 23:17:07 +0200
Subject: [PATCH] libtoolize: fix infinite recursion in m4

Some projects use this construct in configure.ac:

  m4_define([version], m4_include([version])
  pkg_version=version

When the m4_include builtin is undefined (as is done in libtoolize
and extract-trace scripts), the call to 'version' macro goes to
infinite recursion (until ENOMEM).  Due to theirs usual
semantics/evaluation, other undefined macros/builtins should not
cause troubles here.

References:
http://lists.gnu.org/archive/html/libtool/2015-09/msg00000.html

* gl/build-aux/extract-trace (_G_mini): Redefine m4_include to
empty string rather than undefine it completely.
* NEWS: Document.
* NO-THANKS: Mention Hiroyuki Sato.
---
 NEWS                       | 4 ++++
 NO-THANKS                  | 1 +
 gl/build-aux/extract-trace | 5 ++++-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index c5c9023..e68c38c 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ NEWS - list of user-visible changes between releases of GNU Libtool
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes:
+
+  - Fix significant slowdown of libtoolize for certain projects (regression
+    introduced in 2.4.3 release).
 
 * Noteworthy changes in release 2.4.6 (2015-02-15) [stable]
 
diff --git a/NO-THANKS b/NO-THANKS
index 10de16b..51ec8eb 100644
--- a/NO-THANKS
+++ b/NO-THANKS
@@ -82,6 +82,7 @@ Donn Washburn			n5...@comcast.net
 Erik van Pienbroek		erik-...@vanpienbroek.nl
 Ethan Mallove			ethan.mall...@sun.com
 Fred Cox			sailorf...@yahoo.com
+Hiroyuki Sato			hiroys...@gmail.com
 Jakub Bogusz			qbo...@pld-linux.org
 James Su			james...@gmail.com
 Jay Krell			jay.kr...@cornell.edu
diff --git a/gl/build-aux/extract-trace b/gl/build-aux/extract-trace
index 315a32a..ebbf42a 100755
--- a/gl/build-aux/extract-trace
+++ b/gl/build-aux/extract-trace
@@ -336,10 +336,13 @@ func_extract_trace ()
 
         # Disable these macros.
         m4_undefine([m4_dnl])
-        m4_undefine([m4_include])
         m4_undefine([m4_m4exit])
         m4_undefine([m4_m4wrap])
         m4_undefine([m4_maketemp])
+        # Rather do not use undefine here because people tend to define
+        # macros of the same name as file included in their bodies - which
+        # results in infinite recursion.
+        m4_define([m4_include], [])
 
         # Copy and rename macros not handled by "m4 --prefix".
         m4_define([dnl],         [m4_builtin([dnl])])
-- 
2.1.0

_______________________________________________
https://lists.gnu.org/mailman/listinfo/libtool

Reply via email to