diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ec4222a0d4fb..396e227bfa66 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -225,3 +225,8 @@ # Cinnamon /pkgs/desktops/cinnamon @mkg20001 + +#nim +/pkgs/development/compilers/nim @ehmry +/pkgs/development/nim-packages @ehmry +/pkgs/top-level/nim-packages.nix @ehmry diff --git a/.github/labeler.yml b/.github/labeler.yml index ff831042461c..780843a2a553 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -72,6 +72,12 @@ - nixos/**/* - pkgs/os-specific/linux/nixos-rebuild/**/* +"6.topic: nim": + - doc/languages-frameworks/nim.section.md + - pkgs/development/compilers/nim/* + - pkgs/development/nim-packages/**/* + - pkgs/top-level/nim-packages.nix + "6.topic: ocaml": - doc/languages-frameworks/ocaml.section.md - pkgs/development/compilers/ocaml/**/* diff --git a/doc/languages-frameworks/index.xml b/doc/languages-frameworks/index.xml index 49cdf94a44ab..b4706e7dfa5d 100644 --- a/doc/languages-frameworks/index.xml +++ b/doc/languages-frameworks/index.xml @@ -23,6 +23,7 @@ + diff --git a/doc/languages-frameworks/nim.section.md b/doc/languages-frameworks/nim.section.md new file mode 100644 index 000000000000..16dce61d71c9 --- /dev/null +++ b/doc/languages-frameworks/nim.section.md @@ -0,0 +1,91 @@ +# Nim {#nim} + +## Overview {#nim-overview} + +The Nim compiler, a builder function, and some packaged libraries are available +in Nixpkgs. Until now each compiler release has been effectively backwards +compatible so only the latest version is available. + +## Nim program packages in Nixpkgs {#nim-program-packages-in-nixpkgs} + +Nim programs can be built using `nimPackages.buildNimPackage`. In the +case of packages not containing exported library code the attribute +`nimBinOnly` should be set to `true`. + +The following example shows a Nim program that depends only on Nim libraries: + +```nix +{ lib, nimPackages, fetchurl }: + +nimPackages.buildNimPackage rec { + pname = "hottext"; + version = "1.4"; + + nimBinOnly = true; + + src = fetchurl { + url = "https://git.sr.ht/~ehmry/hottext/archive/v${version}.tar.gz"; + sha256 = "sha256-hIUofi81zowSMbt1lUsxCnVzfJGN3FEiTtN8CEFpwzY="; + }; + + buildInputs = with nimPackages; [ + bumpy + chroma + flatty + nimsimd + pixie + sdl2 + typography + vmath + zippy + ]; +} + +``` + +## Nim library packages in Nixpkgs {#nim-library-packages-in-nixpkgs} + + +Nim libraries can also be built using `nimPackages.buildNimPackage`, but +often the product of a fetcher is sufficient to satisfy a dependency. +The `fetchgit`, `fetchFromGitHub`, and `fetchNimble` functions yield an +output that can be discovered during the `configurePhase` of `buildNimPackage`. + +Nim library packages are listed in +[pkgs/top-level/nim-packages.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/nim-packages.nix) and implemented at +[pkgs/development/nim-packages](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/nim-packages). + +The following example shows a Nim library that propagates a dependency on a +non-Nim package: +```nix +{ lib, buildNimPackage, fetchNimble, SDL2 }: + +buildNimPackage rec { + pname = "sdl2"; + version = "2.0.4"; + src = fetchNimble { + inherit pname version; + hash = "sha256-Vtcj8goI4zZPQs2TbFoBFlcR5UqDtOldaXSH/+/xULk="; + }; + propagatedBuildInputs = [ SDL2 ]; +} +``` + +## `buildNimPackage` parameters {#buildnimpackage-parameters} + +All parameters from `stdenv.mkDerivation` function are still supported. The +following are specific to `buildNimPackage`: + +* `nimBinOnly ? false`: If `true` then build only the programs listed in + the Nimble file in the packages sources. +* `nimbleFile`: Specify the Nimble file location of the package being built + rather than discover the file at build-time. +* `nimRelease ? true`: Build the package in *release* mode. +* `nimDefines ? []`: A list of Nim defines. Key-value tuples are not supported. +* `nimFlags ? []`: A list of command line arguments to pass to the Nim compiler. + Use this to specify defines with arguments in the form of `-d:${name}=${value}`. +* `nimDoc` ? false`: Build and install HTML documentation. + +* `buildInputs` ? []: The packages listed here will be searched for `*.nimble` + files which are used to populate the Nim library path. Otherwise the standard + behavior is in effect.