OpenAFS Master Repository branch, master, updated. BP-openafs-stable-1_8_x-467-g0f1e54c

Gerrit Code Review gerrit@openafs.org
Fri, 27 Sep 2019 10:52:20 -0400


The following commit has been merged in the master branch:
commit 0f1e54c47c179bdbd69799170d9740e3e58e86db
Author: Andrew Deason <adeason@sinenomine.net>
Date:   Fri Aug 16 12:48:21 2019 -0500

    Pass -shared when linking some shared libraries
    
    Currently, we use $(LT_LDLIB_shlib) to build most of our shared
    libraries. This invokes libtool, passing our various flags like
    PTH_LDFLAGS and PTH_CFLAGS (since all of our shared-library code is for
    pthreads). Notably, we do NOT pass the -shared flag; the -shared flag
    tells libtool to only build a shared library, and to not also build a
    static library (on systems where libtool supports building shared and
    static libraries simultaneously). Because of this, our LT_LDLIB_shlib
    invocations build both, which is reasonably correct for our per-module
    convenience libraries (that end up getting linked statically into the
    binaries that we install), but is not entirely correct for the public
    libraries that we install.  Specifically, for ABI compatibility
    purposes, we must provide both shared and static libraries of the public
    libraries that we install, and since libtool on AIX does not build (or
    install) a static library at all with --mode-link unless -static is
    passed, we have separate rules to build the shared and static libraries
    for final installation.
    
    This can cause install errors with parallel make (on non-AIX systems),
    and possibly other errors, when we go to install the relevant library
    into TOP_LIBDIR.  For example, in src/kopenafs, we have the following
    rules:
    
        ${TOP_LIBDIR}/libkopenafs.${SHLIB_SUFFIX}: libkopenafs.la
                ${LT_INSTALL_DATA} libkopenafs.la ${TOP_LIBDIR}/libkopenafs.la
                ${RM} ${TOP_LIBDIR}/libkopenafs.la
    
        ${TOP_LIBDIR}/libkopenafs.a: libkopenafs.a
                ${INSTALL_DATA} libkopenafs.a $@
    
    The rule to install libkopenafs.so will invoke libtool to do the
    install, which will install libkopenafs.so, libkopenafs.so.X.Y, and
    libkopenafs.a (from .libs/libkopenafs.a, not the libkopenafs.a we
    built separately). If we are running the rule to install libkopenafs.a
    in parallel, it may fail with an error like so:
    
        /usr/bin/install -c -m 644 libkopenafs.a /home/buildbot/openafs/fedora26-x86_64/build/lib/libkopenafs.a
        /usr/bin/install: cannot create regular file '/home/buildbot/openafs/fedora26-x86_64/build/lib/libkopenafs.a': File exists
        make[3]: *** [Makefile:35: /home/buildbot/openafs/fedora26-x86_64/build/lib/libkopenafs.a] Error 1
    
    Even without that error, this confusion means that the libkopenafs.a
    installed into TOP_LIBDIR may be the one from
    src/kopenafs/libkopenafs.a, or the one from libtool's
    src/kopenafs/.libs/libkopenafs.a; it depends on what order the rules
    are run. If those libraries are different, that could potentially
    cause all sorts of other problems.
    
    To avoid this, we can pass -shared to libtool when building our shared
    libraries. We used to pass -shared when building shared libraries,
    since -shared is almost always one our SHLIB_LDFLAGS set in
    src/osconf.m4. However, ever since commit 2c3a517e (Retire
    Makefile.shared), SHD_CFLAGS, SHD_LDFLAGS, and SHD_CCRULE have all
    been unused, and SHD_LDFLAGS was the only place where we used
    SHLIB_LDFLAGS. As a result, we never use SHLIB_LDFLAGS anywhere, and
    so we never pass -shared to anything.
    
    However, we cannot pass -shared to libtool when building all of our
    shared libraries, since we do need the static library for our per-module
    convenience libraries. For example, liboafs_rx.la has no
    separately-built static library (librx.a is for LWP, liboafs_rx.{so,a}
    is for pthreads), but liboafs_rx needs to be linked statically into all
    of our command-line tools.
    
    So to fix this, introduce a new linking rule, called
    LT_LDLIB_shlib_only, which causes the given library to be built only
    as a shared library (by giving -shared to libtool), and not as a
    static library. Update the build rules to use this new linking rule
    for the libraries that need it, and leave the others alone. Since the
    only use of LT_LDLIB_shlib_missing is also used for a public library
    (afshcrypto), also pass -shared in that rule.
    
    Also remove SHD_* and SHLIB_LDFLAGS variables, since they are unused.
    
    Change-Id: Ia9e040afa3819f1ff70d050a400fecb9624bb9ba
    Reviewed-on: https://gerrit.openafs.org/13786
    Reviewed-by: Andrew Deason <adeason@sinenomine.net>
    Tested-by: BuildBot <buildbot@rampaginggeek.com>
    Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

 src/cf/osconf.m4               |   23 -----------------------
 src/config/Makefile.config.in  |   11 +++--------
 src/crypto/hcrypto/Makefile.in |    2 +-
 src/kopenafs/Makefile.in       |    2 +-
 src/libafsauthent/Makefile.in  |    2 +-
 src/libafsrpc/Makefile.in      |    4 ++--
 src/libuafs/Makefile.common.in |    2 +-
 7 files changed, 9 insertions(+), 37 deletions(-)

-- 
OpenAFS Master Repository