mte/unikernel/duniverse/dune_/flake.nix
2025-11-11 02:07:51 +01:00

302 lines
9.7 KiB
Nix

{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
flake-utils.url = "github:numtide/flake-utils";
melange = {
url = "github:melange-re/melange/refs/tags/5.1.0-53";
inputs.nixpkgs.follows = "nixpkgs";
};
ocaml-overlays = {
url = "github:nix-ocaml/nix-overlays";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{ self
, flake-utils
, nixpkgs
, melange
, ocaml-overlays
}:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system}.appendOverlays [
ocaml-overlays.overlays.default
(self: super: {
ocamlPackages = super.ocaml-ng.ocamlPackages_5_3.overrideScope (oself: osuper: {
mdx = osuper.mdx.override {
logs = oself.logs;
};
utop = osuper.utop.overrideAttrs {
dontGzipMan = true;
};
});
})
melange.overlays.default
(self: super: {
coq_8_16_native = super.coq_8_16.overrideAttrs (a: {
configureFlags = [ "-native-compiler" "yes" ];
});
})
];
dune-static-overlay = self: super: {
ocamlPackages = super.ocaml-ng.ocamlPackages_5_3.overrideScope (oself: osuper: {
dune_3 = osuper.dune_3.overrideAttrs (a: {
src = ./.;
preBuild = "ocaml boot/bootstrap.ml --static";
});
});
};
pkgs-static = nixpkgs.legacyPackages.${system}.appendOverlays [
ocaml-overlays.overlays.default
dune-static-overlay
];
add-experimental-configure-flags = pkg: pkg.overrideAttrs {
configureFlags =
[
"--pkg-build-progress" "enable"
"--lock-dev-tool" "enable"
"--portable-lock-dir" "enable"
];
};
ocamlformat =
let
ocamlformat_version =
let
lists = pkgs.lib.lists;
strings = pkgs.lib.strings;
ocamlformat_config = strings.splitString "\n" (builtins.readFile ./.ocamlformat);
prefix = "version=";
ocamlformat_version_pred = line: strings.hasPrefix prefix line;
version_line = lists.findFirst ocamlformat_version_pred "not_found" ocamlformat_config;
version = strings.removePrefix prefix version_line;
in
builtins.replaceStrings [ "." ] [ "_" ] version;
in
builtins.getAttr ("ocamlformat_" + ocamlformat_version) pkgs;
testBuildInputs = with pkgs;
[ file mercurial unzip ]
++ lib.optionals stdenv.isLinux [ strace ];
testNativeBuildInputs = pkgs: with pkgs; [
nodejs-slim
pkg-config
opam
ocamlformat
];
docInputs = with pkgs.python3.pkgs; [
sphinx-autobuild
furo
sphinx-copybutton
sphinx-design
myst-parser
];
in
{
formatter = pkgs.nixpkgs-fmt;
packages = {
default = with pkgs; stdenv.mkDerivation {
pname = "dune";
version = "3.x-n/a";
src =
let fs = lib.fileset; in
fs.toSource {
root = ./.;
fileset = fs.unions [
./bin
./boot
./configure
./dune-project
./dune-file
./src
./plugin
./vendor
./otherlibs
./Makefile
(fs.fileFilter (file: file.hasExt "opam" || file.hasExt "template") ./.)
];
};
nativeBuildInputs = with ocamlPackages; [ ocaml findlib ];
buildInputs = lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.CoreServices
];
strictDeps = true;
buildFlags = [ "release" ];
dontAddPrefix = true;
dontAddStaticConfigureFlags = true;
configurePlatforms = [ ];
installFlags = [ "PREFIX=${placeholder "out"}" "LIBDIR=$(OCAMLFIND_DESTDIR)" ];
};
dune = self.packages.${system}.default;
dune-static = pkgs-static.pkgsCross.musl64.ocamlPackages.dune;
dune-experimental = add-experimental-configure-flags self.packages.${system}.dune;
dune-static-experimental = add-experimental-configure-flags self.packages.${system}.dune-static;
};
devShells =
let
INSIDE_NIX = "true";
makeDuneDevShell =
{ extraBuildInputs ? (pkgs: [ ])
, meta ? null
, duneFromScope ? false
}:
let
pkgs' =
if duneFromScope then
pkgs.extend
(pself: psuper: {
ocamlPackages = psuper.ocamlPackages.overrideScope (oself: osuper: {
dune_3 = self.packages.${system}.default;
});
})
else pkgs;
inherit (pkgs') writeScriptBin stdenv;
duneScript =
writeScriptBin "dune" ''
#!${stdenv.shell}
"$DUNE_SOURCE_ROOT"/_boot/dune.exe $@
'';
in
pkgs'.mkShell {
shellHook = ''
export DUNE_SOURCE_ROOT=$PWD
'';
inherit meta;
nativeBuildInputs = (testNativeBuildInputs pkgs')
++ docInputs
++ [ duneScript ];
inputsFrom = [ pkgs'.ocamlPackages.dune_3 ];
buildInputs = testBuildInputs ++ (with pkgs'.ocamlPackages; [
ocaml-lsp
merlin
ocaml-index
ppx_expect
spawn
ctypes
integers
mdx
cinaps
menhir
odoc
lwt
patdiff
] ++ (extraBuildInputs pkgs'));
inherit INSIDE_NIX;
};
in
{
doc =
pkgs.mkShell {
inherit INSIDE_NIX;
buildInputs = docInputs;
meta.description = ''
Provides a shell environment suitable for building the Dune
documentation website (e.g. `make doc`).
'';
};
fmt =
pkgs.mkShell {
inherit INSIDE_NIX;
nativeBuildInputs = [ ocamlformat ];
inputsFrom = [ pkgs.dune_3 ];
meta.description = ''
Provides a shell environment suitable for formatting the Dune
codebase source code (e.g. with `make fmt`).
'';
};
slim = makeDuneDevShell {
meta.description = ''
Provides a minimal shell environment built purely from nixpkgs
that can run the testsuite (except the coq / melange tests).
'';
};
slim-melange = makeDuneDevShell {
extraBuildInputs = pkgs: [
pkgs.ocamlPackages.melange
];
meta.description = ''
Provides a minimal shell environment built purely from nixpkgs
that can run the testsuite (except the coq tests).
'';
};
slim-opam = with pkgs; mkShell {
inherit INSIDE_NIX;
nativeBuildInputs = lib.remove pkgs.ocamlformat (testNativeBuildInputs pkgs);
buildInputs = lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.CoreServices
];
meta.description = ''
provides a shell with just `opam` and minimal (external)
dependencies to run the testsuite.";
'';
};
coq =
pkgs.mkShell {
inherit INSIDE_NIX;
nativeBuildInputs = (testNativeBuildInputs pkgs);
# Coq requires OCaml 4.x
inputsFrom = [ pkgs.ocaml-ng.ocamlPackages_4_14.dune_3 ];
buildInputs = with pkgs; [
coq_8_16_native
coq_8_16_native.ocamlPackages.findlib
];
meta.description = ''
Provides a minimal shell environment built purely from nixpkgs
that can build Dune and the Coq testsuite.
'';
};
microbench = makeDuneDevShell {
extraBuildInputs = pkgs: [
pkgs.ocamlPackages.core_bench
];
meta.description = ''
Provides a minimal shell environment that can build the
microbenchmarks.
'';
};
scope = makeDuneDevShell {
duneFromScope = true;
meta.description = ''
Provides a minimal shell environment built purely from nixpkgs
that replaces the Dune executable in the `ocamlPackages` scope by
the Dune binary built by from the repo.
'';
};
default =
makeDuneDevShell {
extraBuildInputs = pkgs: (with pkgs; [
# dev tools
ccls
# test dependencies
git
which
curl
procps
]) ++ (with pkgs.ocamlPackages; [
pkgs.ocamlPackages.ocaml-lsp
pkgs.ocamlPackages.melange
js_of_ocaml-compiler
js_of_ocaml
utop
core_bench
]);
meta.description = ''
Provides a shell environment where `dune` is provided and built
using the source code in this repo.
'';
};
};
});
}