Uploaded image for project: 'CouchDB'
  1. CouchDB
  2. COUCHDB-2225

configure should fail if system cannot generate shared libraries (in LT_INIT)

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.7.0
    • Component/s: Build System
    • Labels:
      None

      Description

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

      configure.ac
      ...
      AC_ENABLE_SHARED                                                           
      AC_DISABLE_STATIC     
      
      AC_PROG_CC
      LT_INIT([win32-dll])     
      LT_INIT             
      AC_PROG_LN_S   
      ...
      

      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:

      ...
      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
      ...
      

      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:

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

      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:

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

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

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              mmarino Michael Marino
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: