[PATCH] Re: libtool-2.4.2 is fine but libtool-2.4.6 very slow.

Pavel Raiskup <[email protected]>
Newsgroups gmane.comp.gnu.libtool.general,gmane.comp.gnu.libtool.patches
Message-ID <[email protected]>
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
> 
> 
>

_______________________________________________
https://lists.gnu.org/mailman/listinfo/libtool
0001-libtoolize-fix-infinite-recursion-in-m4.patch (text/x-patch, 2.5 KB)
From 40d297de7502f93a546126ff69d3f687f3d3ca1a Mon Sep 17 00:00:00 2001
From: Pavel Raiskup <[email protected]>
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			[email protected]
 Erik van Pienbroek		[email protected]
 Ethan Mallove			[email protected]
 Fred Cox			[email protected]
+Hiroyuki Sato			[email protected]
 Jakub Bogusz			[email protected]
 James Su			[email protected]
 Jay Krell			[email protected]
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.