seems to work better when it comes from the same nixpkgs that we use for building, it seems. And is plain convenient.
98 lines
4 KiB
Nix
98 lines
4 KiB
Nix
{
|
|
description = "Lean interactive theorem prover";
|
|
|
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
|
# old nixpkgs used for portable release with older glibc (2.27)
|
|
inputs.nixpkgs-old.url = "github:NixOS/nixpkgs/nixos-19.03";
|
|
inputs.nixpkgs-old.flake = false;
|
|
inputs.flake-utils.url = "github:numtide/flake-utils";
|
|
inputs.nix.url = "github:NixOS/nix";
|
|
inputs.lean4-mode = {
|
|
url = "github:leanprover/lean4-mode";
|
|
flake = false;
|
|
};
|
|
# used *only* by `stage0-from-input` below
|
|
#inputs.lean-stage0 = {
|
|
# url = github:leanprover/lean4;
|
|
# inputs.nixpkgs.follows = "nixpkgs";
|
|
# inputs.flake-utils.follows = "flake-utils";
|
|
# inputs.nix.follows = "nix";
|
|
# inputs.lean4-mode.follows = "lean4-mode";
|
|
#};
|
|
|
|
outputs = { self, nixpkgs, nixpkgs-old, flake-utils, nix, lean4-mode, ... }@inputs: flake-utils.lib.eachDefaultSystem (system:
|
|
let
|
|
pkgs = import nixpkgs {
|
|
inherit system;
|
|
# for `vscode-with-extensions`
|
|
config.allowUnfree = true;
|
|
};
|
|
# An old nixpkgs for creating releases with an old glibc
|
|
pkgsDist-old = import nixpkgs-old { inherit system; };
|
|
# An old nixpkgs for creating releases with an old glibc
|
|
pkgsDist-old-aarch = import nixpkgs-old { localSystem.config = "aarch64-unknown-linux-gnu"; };
|
|
|
|
lean-packages = pkgs.callPackage (./nix/packages.nix) { src = ./.; inherit nix lean4-mode; };
|
|
|
|
devShellWithDist = pkgsDist: pkgs.mkShell.override {
|
|
stdenv = pkgs.overrideCC pkgs.stdenv lean-packages.llvmPackages.clang;
|
|
} ({
|
|
buildInputs = with pkgs; [
|
|
cmake gmp ccache
|
|
lean-packages.llvmPackages.llvm # llvm-symbolizer for asan/lsan
|
|
gdb
|
|
# TODO: only add when proven to not affect the flakification
|
|
#pkgs.python3
|
|
tree # for CI
|
|
];
|
|
# https://github.com/NixOS/nixpkgs/issues/60919
|
|
hardeningDisable = [ "all" ];
|
|
# more convenient `ctest` output
|
|
CTEST_OUTPUT_ON_FAILURE = 1;
|
|
} // pkgs.lib.optionalAttrs pkgs.stdenv.isLinux {
|
|
GMP = pkgsDist.gmp.override { withStatic = true; };
|
|
GLIBC = pkgsDist.glibc;
|
|
GLIBC_DEV = pkgsDist.glibc.dev;
|
|
GCC_LIB = pkgsDist.gcc.cc.lib;
|
|
ZLIB = pkgsDist.zlib;
|
|
GDB = pkgsDist.gdb;
|
|
});
|
|
in {
|
|
packages = lean-packages // rec {
|
|
debug = lean-packages.override { debug = true; };
|
|
stage0debug = lean-packages.override { stage0debug = true; };
|
|
asan = lean-packages.override { extraCMakeFlags = [ "-DLEAN_EXTRA_CXX_FLAGS=-fsanitize=address" "-DLEANC_EXTRA_FLAGS=-fsanitize=address" "-DSMALL_ALLOCATOR=OFF" "-DSYMBOLIC=OFF" ]; };
|
|
asandebug = asan.override { debug = true; };
|
|
tsan = lean-packages.override {
|
|
extraCMakeFlags = [ "-DLEAN_EXTRA_CXX_FLAGS=-fsanitize=thread" "-DLEANC_EXTRA_FLAGS=-fsanitize=thread" "-DCOMPRESSED_OBJECT_HEADER=OFF" ];
|
|
stage0 = (lean-packages.override {
|
|
# Compressed headers currently trigger data race reports in tsan.
|
|
# Turn them off for stage 0 as well so stage 1 can read its own stdlib.
|
|
extraCMakeFlags = [ "-DCOMPRESSED_OBJECT_HEADER=OFF" ];
|
|
}).stage1;
|
|
};
|
|
tsandebug = tsan.override { debug = true; };
|
|
stage0-from-input = lean-packages.override {
|
|
stage0 = pkgs.writeShellScriptBin "lean" ''
|
|
exec ${inputs.lean-stage0.packages.${system}.lean}/bin/lean -Dinterpreter.prefer_native=false "$@"
|
|
'';
|
|
};
|
|
inherit self;
|
|
};
|
|
defaultPackage = lean-packages.lean-all;
|
|
|
|
# The default development shell for working on lean itself
|
|
devShells.default = devShellWithDist pkgs;
|
|
devShells.oldGlibc = devShellWithDist pkgsDist-old;
|
|
devShells.oldGlibcAArch = devShellWithDist pkgsDist-old-aarch;
|
|
|
|
checks.lean = lean-packages.test;
|
|
}) // rec {
|
|
templates.pkg = {
|
|
path = ./nix/templates/pkg;
|
|
description = "A custom Lean package";
|
|
};
|
|
|
|
defaultTemplate = templates.pkg;
|
|
};
|
|
}
|