Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
None
-
None
Description
The LT_INIT autoconf macro checks if the system can build shared libraries, which couch needs:
... 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:
... 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.