【问题标题】:Build all static svn client on Mac OSX, error on mod_dav_svn.so在 Mac OSX 上构建所有静态 svn 客户端,mod_dav_svn.so 上的错误
【发布时间】:2025-12-27 21:20:19
【问题描述】:

我正在尝试在 Mac OS 10.7.5 上构建 svn 客户端。我的目标是构建完全静态的 svn 客户端,因此它不依赖于要安装的任何 dylib。这个想法是 svn 客户端可以复制到密钥上的磁盘,或下载并且无需安装或配置任何东西即可工作。

我下载了 svn 源代码 (subversion-1.7.8) 和所有必需的依赖项(apr、par-util、neon、sqlite-amalgamation)并说明了配置 - 制作 - 制作安装周期。

Svn 的配置选项有 --enable-all-static 标志,可以创建不依赖外部 dylib 的 svn 客户端。但是,构建总是失败并显示以下消息:

Warning!  dlname not found in /Volumes/mydisk/build/svn/libexec/mod_dav_svn.la.
Assuming installing a .so rather than a libtool archive.
chmod 755 /Volumes/mydisk/build/svn/libexec/mod_dav_svn.so
chmod: /Volumes/mydisk/wsvn/build/svn/libexec/mod_dav_svn.so: No such file or directory
apxs:Error: Command failed with rc=65536
.
make: *** [install-mods-shared] Error 1

似乎构建正在寻找 mod_dav_svn.so,即使它不需要并且一切都编译为静态。

有趣的是,构建的 svn 客户端实际上运行了!但是,我想正确完成构建和安装。

我的问题是:

  1. 这个构建错误是真实的还是我可以忽略的?
  2. 如何避免此构建错误以完成构建?

谢谢

【问题讨论】:

    标签: macos svn configure mod-dav-svn


    【解决方案1】:

    根据我的经验,编译使用 3rd 方库和/或系统库(如 glibc 等)的应用程序可能会很棘手。问题在于,除了您的应用程序是静态构建的之外,所有这些库都需要同时提供动态 (.so) 版本和静态版本 (.a) 和一些库就是不提供这个,至少不容易。所以你不得不自己编译依赖堆栈中的所有内容,这可能很困难。

    说到这里,礼貌Rick Vanderzwet's Blog

    % curl -O wget http://archive.apache.org/dist/subversion/subversion-1.7.8.tar.gz
    % tar zxvf subversion-1.7.8.tar.gz
    % cd subversion-1.7.8/
    % ./get-deps.sh
    % ./configure --with-ssl --without-gssapi --without-swig --enable-all-static
    % make
    

    使用以下命令确认:

    可执行文件的大小?

    % ls -lh subversion/svn/svn
    -rwxrwxr-x 1 saml saml 11M Jan 19 22:09 subversion/svn/svn
    

    可执行运行?

    % subversion/svn/svn --version
    svn, version 1.7.8 (r1419691)
       compiled Jan 19 2013, 22:03:50
    
    Copyright (C) 2012 The Apache Software Foundation.
    This software consists of contributions made by many people; see the NOTICE
    file for more information.
    Subversion is open source software, see http://subversion.apache.org/
    
    The following repository access (RA) modules are available:
    
    * ra_svn : Module for accessing a repository using the svn network protocol.
      - with Cyrus SASL authentication
      - handles 'svn' scheme
    * ra_local : Module for accessing a repository on local disk.
      - handles 'file' scheme
    * ra_serf : Module for accessing a repository via WebDAV protocol using serf.
      - handles 'http' scheme
      - handles 'https' scheme
    

    可执行文件依赖什么?

    %  ldd subversion/svn/svn
        linux-vdso.so.1 =>  (0x00007fffd7463000)
        libsasl2.so.2 => /usr/lib64/libsasl2.so.2 (0x00000034fc600000)
        libm.so.6 => /lib64/libm.so.6 (0x00000034e7600000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003210800000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x000000399a000000)
        libz.so.1 => /lib64/libz.so.1 (0x00000034e8600000)
        libmagic.so.1 => /usr/lib64/libmagic.so.1 (0x00000034ef600000)
        libexpat.so.1 => /lib64/libexpat.so.1 (0x00000034eb200000)
        libuuid.so.1 => /lib64/libuuid.so.1 (0x00000034eda00000)
        librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00000034f5e00000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
        libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00000034ea200000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x000000320f800000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003210000000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003d3ce00000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003210400000)
        /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00000034f6200000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x000000320fc00000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00000034f3a00000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    

    最后一点表明这个可执行文件仍然依赖于几个动态库,但它比典型的动态构建的颠覆要少得多!

    编辑 #1

    如果您不需要mod_dav_svn 支持,您可以通过使用--without-serf 切换到configure 来禁用此功能。

    注意 #1: 禁用此支持将禁用您的 svn 客户端通过 httphttps 访问 SVN 存储库的能力!

    注意#2:如果您查看svn --version 命令的输出,您可以看到哪些存储库访问(RA) 模块已编译到您的svn客户。

    【讨论】:

    • 感谢您第一个回复!如问题中所述,我能够编译和运行 svn 客户端。问题是我留下了一个总是以错误结尾的编译过程。这不好,因为:a) 可能存在我看不到的真正错误。 b) 我团队中的其他人可能会尝试编译 svn 并认为他失败了。 c) 我无法自动构建 svn,因为它总是以错误结束。所以我的问题仍然存在:这个构建错误是真实的还是我可以忽略的?为了完成构建,如何避免此构建错误?
    • 我确实需要 WebSVN 支持。
    • 使用 --without-apxs 编译确实没有错误地完成。但是我不确定我是否需要 mod_dav_svn。哪个构建产品(svn svnadmin svndumpfilter svnlook svnrdump svnserve svnsync svnversion)是需要mod_dav_svn的?它会缺少什么功能?
    • 我希望服务器使用 http/https 公开存储库,所以我确实需要 mod_dav_svn。但是,也许我们可以缩小问题的范围。哪些产品会实际使用 mod_dav_svn?我确定 svn 线索不需要它。
    • svnserve 不做 http/https,它只做 svn 协议。因此存在mod_dav_svn*.com/questions/3727474/subversion-svnhttp-access 没有其他工具使用mod_dav_svn,它纯粹是供 Apache 使用的,仅当您希望 http/https 访问您的 SVN 存储库时。