ocamlPackages.buildDunePackage: support fixed point args with lib.extendMkDerivation
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user