如何让Cabal识别Nix安装的alex和happy,避免重复构建
Cabal v2在nix-shell中识别Nix安装的alex/happy解决方案
问题根因
Cabal v2(new-build)默认会自行管理所有构建依赖,包括build-tool-depends中声明的构建工具,即使系统PATH中存在符合版本要求的对应工具,默认也会尝试重新构建,这和直接读取PATH的v1构建逻辑不同。你之前配置的extra-prog-path写法有误,该配置接受的是目录路径而非可执行文件全路径,所以也没有生效。
调整步骤
1. 简化shell.nix配置
移除重复的alex、happy声明,无需手动设置ALEX、HAPPY环境变量,只要将两个工具加入buildInputs即可,进入nix-shell时它们的二进制路径会自动加入系统PATH:
{ pkgs ? import <nixpkgs> {}}: let ghc = pkgs.haskellPackages.ghcWithPackages (p:[ p.array p.base p.bound p.containers p.deriving-compat p.haskeline p.logict p.mtl p.text p.unification-fd p.BNFC p.cabal-install ]); in pkgs.mkShell { buildInputs = [ ghc pkgs.haskellPackages.alex pkgs.haskellPackages.happy pkgs.pkg-config ]; }
2. 配置cabal.project跳过工具构建
在你的cabal.project中添加system-build-tools配置,明确告诉Cabal这两个构建工具已经在系统中安装,无需自行构建:
packages: simple.cabal system-build-tools: alex >= 3.2.6, happy >= 1.20.0
验证
执行nix-shell --pure shell.nix进入环境后运行cabal build,Cabal将直接识别Nix安装的alex和happy,不会再尝试重新构建这两个工具。
如果不想修改cabal.project,也可以在构建时临时指定工具路径:
cabal build --with-alex=$(which alex) --with-happy=$(which happy)
内容的提问来源于stack exchange,提问作者Jonathan Gallagher
相关产品推荐
相关产品推荐

