ocamlPackages.buildDunePackage: support fixed point args with lib.extendMkDerivation

This commit is contained in:
Yifei Sun
2025-09-25 14:59:57 +02:00
parent 5c16210423
commit 73432f59e1
2 changed files with 80 additions and 77 deletions
+12 -10
View File
@@ -75,7 +75,7 @@ Here is a simple package example.
ppx_let,
}:
buildDunePackage rec {
buildDunePackage (finalAttrs: {
pname = "angstrom";
version = "0.15.0";
@@ -84,20 +84,22 @@ buildDunePackage rec {
src = fetchFromGitHub {
owner = "inhabitedtype";
repo = "angstrom";
tag = version;
tag = finalAttrs.version;
hash = "sha256-MK8o+iPGANEhrrTc1Kz9LBilx2bDPQt7Pp5P2libucI=";
};
checkInputs = [
alcotest
ppx_let
];
buildInputs = [ ocaml-syntax-shims ];
propagatedBuildInputs = [
bigstringaf
result
];
doCheck = lib.versionAtLeast ocaml.version "4.05";
checkInputs = [
alcotest
ppx_let
];
meta = {
homepage = "https://github.com/inhabitedtype/angstrom";
@@ -105,7 +107,7 @@ buildDunePackage rec {
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [ sternenseemann ];
};
}
})
```
Here is a second example, this time using a source archive generated with `dune-release`. It is a good idea to use this archive when it is available as it will usually contain substituted variables such as a `%%VERSION%%` field. This library does not depend on any other OCaml library and no tests are run after building it.
@@ -117,14 +119,14 @@ Here is a second example, this time using a source archive generated with `dune-
buildDunePackage,
}:
buildDunePackage rec {
buildDunePackage (finalAtts: {
pname = "wtf8";
version = "1.0.2";
minimalOCamlVersion = "4.02";
src = fetchurl {
url = "https://github.com/flowtype/ocaml-wtf8/releases/download/v${version}/wtf8-v${version}.tbz";
url = "https://github.com/flowtype/ocaml-wtf8/releases/download/v${finalAtts.version}/wtf8-v${finalAtts.version}.tbz";
hash = "sha256-d5/3KUBAWRj8tntr4RkJ74KWW7wvn/B/m1nx0npnzyc=";
};
@@ -134,7 +136,7 @@ buildDunePackage rec {
license = lib.licenses.mit;
maintainers = [ lib.maintainers.eqyiel ];
};
}
})
```
The build will automatically fail if two distinct versions of the same library
+68 -67
View File
@@ -8,82 +8,83 @@
dune_3,
}:
{
pname,
version,
nativeBuildInputs ? [ ],
enableParallelBuilding ? true,
...
}@args:
lib.extendMkDerivation {
constructDrv = stdenv.mkDerivation;
excludeDrvArgNames = [
"minimalOCamlVersion"
"duneVersion"
];
extendDrvArgs =
finalAttrs:
{
pname,
version,
nativeBuildInputs ? [ ],
enableParallelBuilding ? true,
...
}@args:
let
Dune =
let
dune-version = args.duneVersion or "3";
Dune =
let
dune-version = args.duneVersion or "3";
in
{
"1" = dune_1;
"2" = dune_2;
"3" = dune_3;
}
."${dune-version}";
in
{
"1" = dune_1;
"2" = dune_2;
"3" = dune_3;
}
."${dune-version}";
stdenv' = args.stdenv or stdenv;
in
if args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion then
throw "${pname}-${version} is not available for OCaml ${ocaml.version}"
else
if args ? minimalOCamlVersion && lib.versionOlder ocaml.version args.minimalOCamlVersion then
throw "${pname}-${version} is not available for OCaml ${ocaml.version}"
else
{
name = "ocaml${ocaml.version}-${pname}-${version}";
stdenv'.mkDerivation (
{
strictDeps = true;
inherit enableParallelBuilding;
dontAddStaticConfigureFlags = true;
configurePlatforms = [ ];
inherit enableParallelBuilding;
dontAddStaticConfigureFlags = true;
configurePlatforms = [ ];
buildPhase = ''
runHook preBuild
dune build -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postBuild
'';
checkPhase = ''
runHook preCheck
dune runtest -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postCheck
'';
installPhase = ''
runHook preInstall
dune install --prefix $out --libdir $OCAMLFIND_DESTDIR ${pname} \
${
if lib.versionAtLeast Dune.version "2.9" then
"--docdir $out/share/doc --mandir $out/share/man"
else
""
}
runHook postInstall
'';
nativeBuildInputs = [
ocaml
Dune
findlib
]
++ nativeBuildInputs;
strictDeps = true;
buildPhase =
args.buildPhase or ''
runHook preBuild
dune build -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postBuild
'';
}
// (builtins.removeAttrs args [
"minimalOCamlVersion"
"duneVersion"
])
// {
installPhase =
args.installPhase or ''
runHook preInstall
dune install --prefix $out --libdir $OCAMLFIND_DESTDIR ${pname} \
${
if lib.versionAtLeast Dune.version "2.9" then
"--docdir $out/share/doc --mandir $out/share/man"
else
""
}
runHook postInstall
'';
name = "ocaml${ocaml.version}-${pname}-${version}";
checkPhase =
args.checkPhase or ''
runHook preCheck
dune runtest -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
runHook postCheck
'';
nativeBuildInputs = [
ocaml
Dune
findlib
]
++ nativeBuildInputs;
meta = (args.meta or { }) // {
platforms = args.meta.platforms or ocaml.meta.platforms;
meta = (args.meta or { }) // {
platforms = args.meta.platforms or ocaml.meta.platforms;
};
};
}
)
}