mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-11-10 01:33:11 +01:00
Fixes all code blocks with "nix" language in markdown files for syntax errors to be able to run nixfmt in the next step.
122 lines
3.3 KiB
Markdown
122 lines
3.3 KiB
Markdown
# Adding Custom Packages {#sec-custom-packages}
|
|
|
|
It's possible that a package you need is not available in NixOS. In that
|
|
case, you can do two things. Either you can package it with Nix, or you can try
|
|
to use prebuilt packages from upstream. Due to the peculiarities of NixOS, it
|
|
is important to note that building software from source is often easier than
|
|
using pre-built executables.
|
|
|
|
## Building with Nix {#sec-custom-packages-nix}
|
|
|
|
This can be done either in-tree or out-of-tree. For an in-tree build, you can
|
|
clone the Nixpkgs repository, add the package to your clone, and (optionally)
|
|
submit a patch or pull request to have it accepted into the main Nixpkgs
|
|
repository. This is described in detail in the [Nixpkgs
|
|
manual](https://nixos.org/nixpkgs/manual). In short, you clone Nixpkgs:
|
|
|
|
```ShellSession
|
|
$ git clone https://github.com/NixOS/nixpkgs
|
|
$ cd nixpkgs
|
|
```
|
|
|
|
Then you write and test the package as described in the Nixpkgs manual.
|
|
Finally, you add it to [](#opt-environment.systemPackages), e.g.
|
|
|
|
```nix
|
|
{
|
|
environment.systemPackages = [ pkgs.my-package ];
|
|
}
|
|
```
|
|
|
|
and you run `nixos-rebuild`, specifying your own Nixpkgs tree:
|
|
|
|
```ShellSession
|
|
# nixos-rebuild switch -I nixpkgs=/path/to/my/nixpkgs
|
|
```
|
|
|
|
The second possibility is to add the package outside of the Nixpkgs
|
|
tree. For instance, here is how you specify a build of the
|
|
[GNU Hello](https://www.gnu.org/software/hello/) package directly in
|
|
`configuration.nix`:
|
|
|
|
```nix
|
|
{
|
|
environment.systemPackages =
|
|
let
|
|
my-hello = with pkgs; stdenv.mkDerivation rec {
|
|
name = "hello-2.8";
|
|
src = fetchurl {
|
|
url = "mirror://gnu/hello/${name}.tar.gz";
|
|
hash = "sha256-5rd/gffPfa761Kn1tl3myunD8TuM+66oy1O7XqVGDXM=";
|
|
};
|
|
};
|
|
in
|
|
[ my-hello ];
|
|
}
|
|
```
|
|
|
|
Of course, you can also move the definition of `my-hello` into a
|
|
separate Nix expression, e.g.
|
|
|
|
```nix
|
|
{
|
|
environment.systemPackages = [ (import ./my-hello.nix) ];
|
|
}
|
|
```
|
|
|
|
where `my-hello.nix` contains:
|
|
|
|
```nix
|
|
with import <nixpkgs> {}; # bring all of Nixpkgs into scope
|
|
|
|
stdenv.mkDerivation rec {
|
|
name = "hello-2.8";
|
|
src = fetchurl {
|
|
url = "mirror://gnu/hello/${name}.tar.gz";
|
|
hash = "sha256-5rd/gffPfa761Kn1tl3myunD8TuM+66oy1O7XqVGDXM=";
|
|
};
|
|
}
|
|
```
|
|
|
|
This allows testing the package easily:
|
|
|
|
```ShellSession
|
|
$ nix-build my-hello.nix
|
|
$ ./result/bin/hello
|
|
Hello, world!
|
|
```
|
|
|
|
## Using pre-built executables {#sec-custom-packages-prebuilt}
|
|
|
|
Most pre-built executables will not work on NixOS. There are two notable
|
|
exceptions: flatpaks and AppImages. For flatpaks see the [dedicated
|
|
section](#module-services-flatpak). AppImages can run "as-is" on NixOS.
|
|
|
|
First you need to enable AppImage support: add to `/etc/nixos/configuration.nix`
|
|
|
|
```nix
|
|
{
|
|
programs.appimage.enable = true;
|
|
programs.appimage.binfmt = true;
|
|
}
|
|
```
|
|
|
|
Then you can run the AppImage "as-is" or with `appimage-run foo.appimage`.
|
|
|
|
If there are shared libraries missing add them with
|
|
|
|
```nix
|
|
{
|
|
programs.appimage.package = pkgs.appimage-run.override {
|
|
extraPkgs = pkgs: [
|
|
# missing libraries here, e.g.: `pkgs.libepoxy`
|
|
];
|
|
};
|
|
}
|
|
```
|
|
|
|
To make other pre-built executables work on NixOS, you need to package them
|
|
with Nix and special helpers like `autoPatchelfHook` or `buildFHSEnv`. See
|
|
the [Nixpkgs manual](https://nixos.org/nixpkgs/manual) for details. This
|
|
is complex and often doing a source build is easier.
|