ID:               49648
 Updated by:       j...@php.net
 Reported By:      sven at whgl dot uni-frankfurt dot de
-Status:           Open
+Status:           Wont fix
 Bug Type:         Compile Failure
 Operating System: Linux
 PHP Version:      5.2.11
 New Comment:

This macro was created as quick'n'dirty solution. And your problem is 
easily solved by simply passing the libs like this: -L$OMAPI_DIR/lib -
l$LIBNAME -lomapi -ldst




Previous Comments:
------------------------------------------------------------------------

[2009-09-25 11:17:36] sven at whgl dot uni-frankfurt dot de

Here's the corresponding call from the config.m4, whre extra-libs is
not placed where it should be:

LIBNAME=dhcpctl
LIBSYMBOL=dhcpctl_initialize

PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,[
      PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $OMAPI_DIR/lib,
OMAPI_STATIC_LIBADD)
      AC_DEFINE(HAVE_OMAPILIB,1,we have the DHCPCTL lib.[])
  ],[
      AC_MSG_ERROR([dhcpctl lib not found.])
  ],[
      -L$OMAPI_DIR/lib -lomapi -ldst
    ])
PHP_SUBST(OMAPI_STATIC_LIBADD)

------------------------------------------------------------------------

[2009-09-25 07:20:27] j...@php.net

Where is the faulty config.m4 of yours or at least the call to the
macro which you obviously did wrong. There's nothing wrong with the
macro itself, it works exactly how it's supposed to..

------------------------------------------------------------------------

[2009-09-25 03:07:31] sven at whgl dot uni-frankfurt dot de

Here is a thread on the PECL mailing list showing more details,
including the wrong call to gcc.

http://marc.info/?t=125226693200002&r=1&w=2

Esp.:

http://marc.info/?l=pecl-dev&m=125324886632523&w=2

when PHP_CHECK_LIB is called with [dhcpctl, libsym, pass, fail, -lomapi
-ldst] will call gcc with:

cc -o conftest -g -O2   -lomapi -ldst conftest.c -ldhcpctl
                      [LDFLAGS, wrong placing!]     [LIBS]

other-libs need to be appended after -ldhcpctl and this is cleary the
macro's fault, since passing $5 as 5th parameter to AC_CHECK_LIB (and
removing the call to PHP_EVAL_LIBLINE restores the correct ordering of
the parameters, as expected)

And, to quote from the autoconf manual!:

"Variable: LDFLAGS

    Options for the linker. If it is not set in the environment when
configure runs, the default value is empty. configure uses this variable
when linking programs to test for C, C++, Objective C, and Fortran
features.

    This variable's contents should contain options like -s and -L that
affect only the behavior of the linker. Please see the explanation of
CFLAGS for what you can do if an option also affects other phases of the
compiler.

    *Don't use this variable to pass library names (-l) to the linker;
use LIBS instead. *
"

---

"Variable: LIBS

    -l options to pass to the linker. The default value is empty, but
some Autoconf macros may prepend extra libraries to this variable if
those libraries are found and provide necessary functions, see
Libraries. configure uses this variable when linking programs to test
for C, C++, and Fortran features. "

--- From AC_CHECK_LIB desc: --- 

If linking with library results in unresolved symbols that would be
resolved by linking with additional libraries, give those libraries as
the other-libraries argument, separated by spaces: e.g., -lXt -lX11.
Otherwise, this macro fails to detect that library is present, because
linking the test program always fails with unresolved symbols. The
other-libraries argument should be limited to cases where it is
desirable to test for one library in the presence of another that is not
already in LIBS. 

------------------
Since the dpendant libs are not in LIBS yet, PHP_CHECK_LIB needs to
take care of either putting them there, or pushing them down into the
5th parameter of AC_CHECK_LIB. (which is not done either).

------------------------------------------------------------------------

[2009-09-24 08:41:56] j...@php.net

Not enough information. And there's nothing wrong with the macro
either, it's been used in dozens of places without any problems. 

------------------------------------------------------------------------

[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

Reply via email to