#49648 [Opn->Fbk]: Broken Macro in acinclude.m4
| From: | jani@php.net | Date: | Thu, 24 Sep 2009 08:42:00 +0000 |
| Subject: | #49648 [Opn->Fbk]: Broken Macro in acinclude.m4 | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-142804@lists.php.net to get a copy of this message | ||
ID: 49648
Updated by: jani@php.net
Reported By: sven at whgl dot uni-frankfurt dot de
-Status: Open
+Status: Feedback
-Bug Type: Unknown/Other Function
+Bug Type: Compile Failure
Operating System: Linux
PHP Version: 5.2.11
New Comment:
Not enough information. And there's nothing wrong with the macro
either, it's been used in dozens of places without any problems.
Previous Comments:
------------------------------------------------------------------------
[2009-09-24 03:59:12] sven at whgl dot uni-frankfurt dot de
Description:
------------
It seems the PHP_CHEC_LIBRARY Macro wrapping AC_CHECK_LIBRARY is broken
for all cases where extra-libs is needed. I'll be quoting directly from
the following svn link:
http://svn.php.net/viewvc/php/php-src/trunk/acinclude.m4?revision=287126&view=markup
--- snip --- Macro Prototype ---
1822 dnl
1823 dnl PHP_CHECK_LIBRARY(library, function [, action-found [,
action-not-found [, extra-libs]]])
1824 dnl
1825 dnl Wrapper for AC_CHECK_LIB
1826 dnl
--- snip --- End Proto ---
Last Parameter ($5) is extra libs, now we look into the Macro:
1827 AC_DEFUN([PHP_CHECK_LIBRARY], [
1828 save_old_LDFLAGS=$LDFLAGS
1829 ac_stuff="$5"
1830
1831 save_ext_shared=$ext_shared
1832 ext_shared=yes
1833 PHP_EVAL_LIBLINE([$]ac_stuff, LDFLAGS)
1834 AC_CHECK_LIB([$1],[$2],[
1835 LDFLAGS=$save_old_LDFLAGS
1836 ext_shared=$save_ext_shared
1837 $3
1838 ],[
1839 LDFLAGS=$save_old_LDFLAGS
1840 ext_shared=$save_ext_shared
1841 unset ac_cv_lib_$1[]_$2
1842 $4
1843 ])dnl
1844 ])
Instead of passing $5 into $5 of AC_CHECK_LIB some preprocessing is
obviously done, LDFLAGS is stored and PHP_EVAL_LIBLINE is called with $5
and $LDFLAGS. This is indeed completely wrong. When we look at the inner
workings of PHP_EVAL_LIBLINE, we can see the following:
403 -l*[)]
404 ac_ii=
echo $ac_i|cut -c 3-
405 PHP_ADD_LIBRARY($ac_ii,1,$2)
406 ;;
407 -L*[)]
408 ac_ii=echo $ac_i|cut -c 3-
409 PHP_ADD_LIBPATH($ac_ii,$2)
Though libs and and lib includes are treated by different Macros, they
both operate on $2 and indeed, when using the Macro, libs are added to
LDFLAGS, which is not right.
The autoconf manual states that: -l<libname> Parameters go into LIBS
and only all other linker flags go into LDFLAGS. This is important for
the ordering of libs, because AC_CHECK_LIB will prepend the lib to be
tested to LIBS, so other-libs, need to be in LIBS, because otherwise the
ordering in the call to gcc for the conftest will be wrong and fail.
Reproduce code:
---------------
PHP_CHECK_LIB(libname,libsymbol,,,other-libs) where libname references
symbols from other-libs.
Expected result:
----------------
The check should succeed if the libs are in place and gcc should be
called properly.
Actual result:
--------------
The ordering will be wrong, gcc will fail to compile the conftest.c and
thus the macro fails although it should net.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=49648&edit=1