You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@couchdb.apache.org by "Michael Marino (JIRA)" <ji...@apache.org> on 2014/04/15 13:58:19 UTC

[jira] [Created] (COUCHDB-2225) configure should fail if system cannot generate shared libraries (in LT_INIT)

Michael Marino created COUCHDB-2225:
---------------------------------------

             Summary: configure should fail if system cannot generate shared libraries (in LT_INIT)
                 Key: COUCHDB-2225
                 URL: https://issues.apache.org/jira/browse/COUCHDB-2225
             Project: CouchDB
          Issue Type: Bug
      Security Level: public (Regular issues)
          Components: Build System
            Reporter: Michael Marino


The LT_INIT autoconf macro checks if the system can build shared libraries, which couch needs:

{code:title=configure.ac}
...
AC_ENABLE_SHARED                                                           
AC_DISABLE_STATIC     

AC_PROG_CC
LT_INIT([win32-dll])     
LT_INIT             
AC_PROG_LN_S   
...
{code}

The AC_DISABLE/ENABLE_* requests that the system builds shared libraries and not static libraries, but does not enforce it.  It should.  

An example of a failure mode is the observed configure output on a Synology (linux-based) system: 

{code}
...
checking whether the gcc linker (/usr/local/x86_64-linux-gnu/x86_64-linux-gnu/x86_64-linux-gnu/bin/ld -m elf_x86_64) supports shared libraries... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... unsupported
checking whether stripping libraries is possible... no
checking if libtool supports shared libraries... no
checking whether to build shared libraries... no
checking whether to build static libraries... yes
...
{code}

In this case, gcc returns a broken path to ld, but configure succeeds even though no shared libraries will/can be built.  'make' does fail later, but not in a way that makes the source of the failure obvious:

{code}
cp .libs/ejson.so priv/ejson.so
cp: can't stat '.libs/ejson.so': No such file or directory
{code}

which arises because the so files are not built.  In this case, configuration and make succeed when the correct path to ld is given (e.g. ./configure LD=/path/to/ld).  However, generally, configure should die with an appropriate error if the system can not build shared libraries.  

Solution:

Change of the above lines in configure.ac:

{code:title=configure.ac}
...
LT_INIT
AS_IF([test x"${enable_shared}" = "xno"], [
  AC_MSG_ERROR([System as configured cannot build shared libraries.])
])
...
{code}

And regeneration of configure.  I'm happy to produce a pull request for this.  



--
This message was sent by Atlassian JIRA
(v6.2#6252)