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解析:
在构建环境中测试域名解析:
若解析失败,手动指定DNS服务器后再构建:nslookup github.comexport 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
相关产品推荐
相关产品推荐

