diff --git a/doc/languages-frameworks/ocaml.section.md b/doc/languages-frameworks/ocaml.section.md index 875c1fcad5bda..9b20a8ab32f52 100644 --- a/doc/languages-frameworks/ocaml.section.md +++ b/doc/languages-frameworks/ocaml.section.md @@ -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 diff --git a/pkgs/build-support/ocaml/dune.nix b/pkgs/build-support/ocaml/dune.nix index cc550775dd3e6..55d14c68af974 100644 --- a/pkgs/build-support/ocaml/dune.nix +++ b/pkgs/build-support/ocaml/dune.nix @@ -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 ( - { - - inherit enableParallelBuilding; - dontAddStaticConfigureFlags = true; - configurePlatforms = [ ]; + strictDeps = true; - 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 - ''; + inherit enableParallelBuilding; + dontAddStaticConfigureFlags = true; + configurePlatforms = [ ]; - strictDeps = true; + nativeBuildInputs = [ + ocaml + Dune + findlib + ] + ++ nativeBuildInputs; - } - // (builtins.removeAttrs args [ - "minimalOCamlVersion" - "duneVersion" - ]) - // { + buildPhase = + args.buildPhase or '' + runHook preBuild + dune build -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES} + runHook postBuild + ''; - name = "ocaml${ocaml.version}-${pname}-${version}"; + 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 + ''; - nativeBuildInputs = [ - ocaml - Dune - findlib - ] - ++ nativeBuildInputs; + checkPhase = + args.checkPhase or '' + runHook preCheck + dune runtest -p ${pname} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES} + runHook postCheck + ''; - meta = (args.meta or { }) // { - platforms = args.meta.platforms or ocaml.meta.platforms; + meta = (args.meta or { }) // { + platforms = args.meta.platforms or ocaml.meta.platforms; + }; }; - - } - ) +} diff --git a/pkgs/development/ocaml-modules/linol/default.nix b/pkgs/development/ocaml-modules/linol/default.nix index 7b41c28b9d6a6..15262d3386de1 100644 --- a/pkgs/development/ocaml-modules/linol/default.nix +++ b/pkgs/development/ocaml-modules/linol/default.nix @@ -9,7 +9,7 @@ yojson, }: -buildDunePackage rec { +buildDunePackage (finalAttrs: { pname = "linol"; version = "0.10"; @@ -18,7 +18,7 @@ buildDunePackage rec { src = fetchFromGitHub { owner = "c-cube"; repo = "linol"; - tag = "v${version}"; + tag = "v${finalAttrs.version}"; hash = "sha256-G/5nTJd+MxPgNObKW2Hmmwn4HejQ81c3f4oVXjpNSZg="; }; @@ -33,11 +33,11 @@ buildDunePackage rec { meta = { description = "LSP server library"; homepage = "https://github.com/c-cube/linol"; - changelog = "https://raw.githubusercontent.com/c-cube/linol/refs/tags/v${version}/CHANGES.md"; + changelog = "https://raw.githubusercontent.com/c-cube/linol/refs/tags/v${finalAttrs.version}/CHANGES.md"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ stepbrobd ulrikstrid ]; }; -} +})