You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nix构建失败:编译solc-0.8.25时fmtlib获取出错

解决方案:Nix构建solc-0.8.25时fmtlib下载失败问题

问题核心是构建沙箱内无法解析github.com域名,导致CMake的FetchContent无法下载fmt-9.1.0依赖。以下是针对性解决步骤:

1. 调整Nix沙箱与网络配置

  • 临时关闭沙箱:构建时禁用沙箱以允许网络访问(注意:仅临时使用,存在安全风险):
    NIX_BUILD_SANDBOX=0 nix-build <你的构建表达式>
    
    或永久修改/etc/nix/nix.conf:
    sandbox = false
    
  • 检查并修复DNS解析:
    在构建环境中测试域名解析:
    nslookup github.com
    
    若解析失败,手动指定DNS服务器后再构建:
    export NIX_ENFORCE_PURITY=0
    export DNS_SERVER=8.8.8.8
    nix-build <你的构建表达式>
    

2. 用本地预下载包替换网络下载

  • 先手动下载fmt-9.1.0包:
    wget https://github.com/fmtlib/fmt/archive/9.1.0.tar.gz
    
  • 修改solc的Nix构建配置,让CMake读取本地包:
    使用overrideAttrs注入预配置步骤:
    pkgs.solc_0_8_25.overrideAttrs (old: {
      preConfigure = ''
        # 复制本地包到构建目录的下载路径
        cp /path/to/fmt-9.1.0.tar.gz $sourceRoot/deps/downloads/
        # 强制CMake使用本地解压后的目录(先手动解压到指定路径)
        echo "set(FETCHCONTENT_SOURCE_DIR_FMTLIB /path/to/fmt-9.1.0)" >> cmake/fmtlib.cmake
      '';
    })
    

3. 复用Nixpkgs中的fmt库替代内置构建

直接依赖Nixpkgs已编译好的fmt包,禁用CMake的FetchContent流程:

pkgs.solc_0_8_25.overrideAttrs (old: {
  buildInputs = old.buildInputs ++ [ pkgs.fmt ];
  preConfigure = ''
    # 移除FetchContent相关代码
    sed -i '/FetchContent_MakeAvailable(fmtlib)/d' CMakeLists.txt
    # 替换依赖引用为系统fmt库
    sed -i 's/fmtlib/fmt/' CMakeLists.txt
  '';
})

4. 代理环境配置(若需代理访问网络)

如果你的网络需要代理,确保Nix构建环境能读取代理设置:

  • 修改/etc/nix/nix.conf添加代理:
    http-proxy = http://your-proxy-address:port
    https-proxy = http://your-proxy-address:port
    
  • 或构建时临时传递代理变量:
    http_proxy=http://your-proxy-address:port https_proxy=http://your-proxy-address:port nix-build <你的构建表达式>
    

内容的提问来源于stack exchange,提问作者Aakash Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:43:11