Files
nixpkgs/pkgs/development/lean-modules/lean4/default.nix
Archit Gupta 8babb02766 lean4: fix install prefix for CMake 4.4
`lean4` failed to build with CMake 4.4 since CMake started putting help
strings for known variables set from the command line. Lean was using
the presence of the generic help string to determine if a variable was
passed from the command line. For CMAKE_* variables, it considers them
as platform variables if they were not passed on the command line. Those
variables are then passed only to its stage0 and not stage1. This caused
CMAKE_INSTALL_PREFIX to be dropped, since previously the nixpkgs command
line override resulted in the generic help string, and with CMake 4.4 it
no longer does.

This works around this insanity by passing STAGE1_CMAKE_INSTALL_PREFIX
which Lean understands for passing CMAKE_INSTALL_PREFIX to its stage1
build.
2026-09-14 02:38:45 -07:00

166 lines
4.4 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lean 4 toolchain for the leanPackages set (independent of pkgs.lean4).
{
lib,
stdenv,
symlinkJoin,
cmake,
cctools,
fetchFromGitHub,
git,
gmp,
cadical,
cadical' ? cadical.override { version = "2.1.3"; },
leangz,
pkg-config,
libuv,
perl,
runCommand,
writeText,
testers,
}:
let
lean4 = stdenv.mkDerivation (finalAttrs: {
pname = "lean4";
version = "4.30.0";
mimalloc-src = fetchFromGitHub {
owner = "microsoft";
repo = "mimalloc";
tag = "v2.2.3";
hash = "sha256-B0gngv16WFLBtrtG5NqA2m5e95bYVcQraeITcOX9A74=";
};
src = fetchFromGitHub {
owner = "leanprover";
repo = "lean4";
tag = "v${finalAttrs.version}";
hash = "sha256-YTsfIppd6km7wOjAxRH5KMPsW++ztFDCJT2up72J86Q=";
};
# Vendor mimalloc. Upstream has since partially adopted FetchContent:
# https://github.com/leanprover/lean4/commit/a145b9c11a0fe38fd4c921024a7376c99cc34bd2
#
# Dynamically adjust the source tree to maintain a healthy boundary
# with Nix and avoid overstepping on its jurisdiction over cache coherence.
postPatch =
let
pattern = "\${LEAN_BINARY_DIR}/../mimalloc/src/mimalloc";
in
''
substituteInPlace src/CMakeLists.txt \
--replace-fail 'set(GIT_SHA1 "")' 'set(GIT_SHA1 "${finalAttrs.src.tag}")'
rm -rf src/lake/examples/git/
substituteInPlace CMakeLists.txt \
--replace-fail 'GIT_REPOSITORY https://github.com/microsoft/mimalloc' \
'SOURCE_DIR "${finalAttrs.mimalloc-src}"' \
--replace-fail 'GIT_TAG ${finalAttrs.mimalloc-src.tag}' ""
for file in stage0/src/CMakeLists.txt stage0/src/runtime/CMakeLists.txt src/CMakeLists.txt src/runtime/CMakeLists.txt; do
substituteInPlace "$file" \
--replace-fail '${pattern}' '${finalAttrs.mimalloc-src}'
done
substituteInPlace src/lake/Lake/Load/Lean/Elab.lean \
--replace-fail \
'let upToDate := (← olean.pathExists) ∧' \
'let upToDate := cfg.pkgDir.toString.startsWith "/nix/store/" ∨ (← olean.pathExists) ∧'
'';
preConfigure = ''
patchShebangs stage0/src/bin/ src/bin/
'';
nativeBuildInputs = [
cmake
leangz
pkg-config
]
++ lib.optionals stdenv.hostPlatform.isDarwin [ cctools.libtool ];
buildInputs = [
gmp
libuv
cadical'
];
nativeCheckInputs = [
git
perl
];
cmakeFlags = [
"-DUSE_GITHASH=OFF"
"-DINSTALL_LICENSE=OFF"
"-DINSTALL_CADICAL=OFF"
"-DINSTALL_LEANTAR=OFF"
"-DSTAGE1_CMAKE_INSTALL_PREFIX=${placeholder "out"}"
"-DUSE_MIMALLOC=ON"
];
passthru.tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
version = "v${finalAttrs.version}";
};
};
meta = {
description = "Automatic and interactive theorem prover";
homepage = "https://leanprover.github.io/";
changelog = "https://github.com/leanprover/lean4/blob/${finalAttrs.src.tag}/RELEASES.md";
license = lib.licenses.asl20;
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [ nadja-y ];
mainProgram = "lean";
};
});
oldStorePath = builtins.substring 0 43 (toString lean4);
# Binary-patched for correct runtime discovery in wrapped environments.
wrapped = symlinkJoin {
inherit (lean4) name pname;
paths = [
lean4
cadical'
leangz
];
nativeBuildInputs = [ perl ];
postBuild = ''
newStorePath=$(echo "$out" | head -c 43)
for bin in ${lean4}/bin/*; do
test -f "$bin" || continue
install -m755 "$bin" "$out/bin/"
perl -pi -e "s|\Q${oldStorePath}\E|$newStorePath|g" "$out/bin/$(basename "$bin")"
done
'';
inherit (lean4) version src meta;
passthru = {
inherit (lean4) version src;
tests =
let
src = writeText "smoke.lean" ''
import Std
example : 1 + 1 = 2 := by decide
example : ∀ (x y : BitVec 8), x &&& y = y &&& x := by bv_decide
'';
in
{
version = testers.testVersion {
package = wrapped;
version = "v${lean4.version}";
};
smoke = runCommand "lean4-test-smoke" { } ''
${wrapped}/bin/lean ${src}
touch $out
'';
};
};
};
in
wrapped