1# Global configuration {#chap-packageconfig} 2 3Nix comes with certain defaults about what packages can and cannot be installed, based on a package's metadata. By default, Nix will prevent installation if any of the following criteria are true: 4 5- The package is thought to be broken, and has had its `meta.broken` set to `true`. 6 7- The package isn't intended to run on the given system, as none of its `meta.platforms` match the given system. 8 9- The package's `meta.license` is set to a license which is considered to be unfree. 10 11- The package has known security vulnerabilities but has not or can not be updated for some reason, and a list of issues has been entered in to the package's `meta.knownVulnerabilities`. 12 13Note that all this is checked during evaluation already, and the check includes any package that is evaluated. In particular, all build-time dependencies are checked. `nix-env -qa` will (attempt to) hide any packages that would be refused. 14 15Each of these criteria can be altered in the nixpkgs configuration. 16 17The nixpkgs configuration for a NixOS system is set in the `configuration.nix`, as in the following example: 18 19```nix 20{ 21 nixpkgs.config = { 22 allowUnfree = true; 23 }; 24} 25``` 26 27However, this does not allow unfree software for individual users. Their configurations are managed separately. 28 29A user's nixpkgs configuration is stored in a user-specific configuration file located at `~/.config/nixpkgs/config.nix`. For example: 30 31```nix 32{ 33 allowUnfree = true; 34} 35``` 36 37Note that we are not able to test or build unfree software on Hydra due to policy. Most unfree licenses prohibit us from either executing or distributing the software. 38 39## Installing broken packages {#sec-allow-broken} 40 41There are two ways to try compiling a package which has been marked as broken. 42 43- For allowing the build of a broken package once, you can use an environment variable for a single invocation of the nix tools: 44 45 ```ShellSession 46 $ export NIXPKGS_ALLOW_BROKEN=1 47 ``` 48 49- For permanently allowing broken packages to be built, you may add `allowBroken = true;` to your user's configuration file, like this: 50 51 ```nix 52 { 53 allowBroken = true; 54 } 55 ``` 56 57 58## Installing packages on unsupported systems {#sec-allow-unsupported-system} 59 60There are also two ways to try compiling a package which has been marked as unsupported for the given system. 61 62- For allowing the build of an unsupported package once, you can use an environment variable for a single invocation of the nix tools: 63 64 ```ShellSession 65 $ export NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 66 ``` 67 68- For permanently allowing unsupported packages to be built, you may add `allowUnsupportedSystem = true;` to your user's configuration file, like this: 69 70 ```nix 71 { 72 allowUnsupportedSystem = true; 73 } 74 ``` 75 76The difference between a package being unsupported on some system and being broken is admittedly a bit fuzzy. If a program *ought* to work on a certain platform, but doesn't, the platform should be included in `meta.platforms`, but marked as broken with e.g. `meta.broken = !hostPlatform.isWindows`. Of course, this begs the question of what \"ought\" means exactly. That is left to the package maintainer. 77 78## Installing unfree packages {#sec-allow-unfree} 79 80There are several ways to tweak how Nix handles a package which has been marked as unfree. 81 82- To temporarily allow all unfree packages, you can use an environment variable for a single invocation of the nix tools: 83 84 ```ShellSession 85 $ export NIXPKGS_ALLOW_UNFREE=1 86 ``` 87 88- It is possible to permanently allow individual unfree packages, while still blocking unfree packages by default using the `allowUnfreePredicate` configuration option in the user configuration file. 89 90 This option is a function which accepts a package as a parameter, and returns a boolean. The following example configuration accepts a package and always returns false: 91 92 ```nix 93 { 94 allowUnfreePredicate = (pkg: false); 95 } 96 ``` 97 98 For a more useful example, try the following. This configuration only allows unfree packages named roon-server and visual studio code: 99 100 ```nix 101 { 102 allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ 103 "roon-server" 104 "vscode" 105 ]; 106 } 107 ``` 108 109- It is also possible to allow and block licenses that are specifically acceptable or not acceptable, using `allowlistedLicenses` and `blocklistedLicenses`, respectively. 110 111 The following example configuration allowlists the licenses `amd` and `wtfpl`: 112 113 ```nix 114 { 115 allowlistedLicenses = with lib.licenses; [ amd wtfpl ]; 116 } 117 ``` 118 119 The following example configuration blocklists the `gpl3Only` and `agpl3Only` licenses: 120 121 ```nix 122 { 123 blocklistedLicenses = with lib.licenses; [ agpl3Only gpl3Only ]; 124 } 125 ``` 126 127 Note that `allowlistedLicenses` only applies to unfree licenses unless `allowUnfree` is enabled. It is not a generic allowlist for all types of licenses. `blocklistedLicenses` applies to all licenses. 128 129A complete list of licenses can be found in the file `lib/licenses.nix` of the nixpkgs tree. 130 131## Installing insecure packages {#sec-allow-insecure} 132 133There are several ways to tweak how Nix handles a package which has been marked as insecure. 134 135- To temporarily allow all insecure packages, you can use an environment variable for a single invocation of the nix tools: 136 137 ```ShellSession 138 $ export NIXPKGS_ALLOW_INSECURE=1 139 ``` 140 141- It is possible to permanently allow individual insecure packages, while still blocking other insecure packages by default using the `permittedInsecurePackages` configuration option in the user configuration file. 142 143 The following example configuration permits the installation of the hypothetically insecure package `hello`, version `1.2.3`: 144 145 ```nix 146 { 147 permittedInsecurePackages = [ 148 "hello-1.2.3" 149 ]; 150 } 151 ``` 152 153- It is also possible to create a custom policy around which insecure packages to allow and deny, by overriding the `allowInsecurePredicate` configuration option. 154 155 The `allowInsecurePredicate` option is a function which accepts a package and returns a boolean, much like `allowUnfreePredicate`. 156 157 The following configuration example only allows insecure packages with very short names: 158 159 ```nix 160 { 161 allowInsecurePredicate = pkg: builtins.stringLength (lib.getName pkg) <= 5; 162 } 163 ``` 164 165 Note that `permittedInsecurePackages` is only checked if `allowInsecurePredicate` is not specified. 166 167## Modify packages via `packageOverrides` {#sec-modify-via-packageOverrides} 168 169You can define a function called `packageOverrides` in your local `~/.config/nixpkgs/config.nix` to override Nix packages. It must be a function that takes pkgs as an argument and returns a modified set of packages. 170 171```nix 172{ 173 packageOverrides = pkgs: rec { 174 foo = pkgs.foo.override { ... }; 175 }; 176} 177``` 178 179## Declarative Package Management {#sec-declarative-package-management} 180 181### Build an environment {#sec-building-environment} 182 183Using `packageOverrides`, it is possible to manage packages declaratively. This means that we can list all of our desired packages within a declarative Nix expression. For example, to have `aspell`, `bc`, `ffmpeg`, `coreutils`, `gdb`, `nixUnstable`, `emscripten`, `jq`, `nox`, and `silver-searcher`, we could use the following in `~/.config/nixpkgs/config.nix`: 184 185```nix 186{ 187 packageOverrides = pkgs: with pkgs; { 188 myPackages = pkgs.buildEnv { 189 name = "my-packages"; 190 paths = [ 191 aspell 192 bc 193 coreutils 194 gdb 195 ffmpeg 196 nixUnstable 197 emscripten 198 jq 199 nox 200 silver-searcher 201 ]; 202 }; 203 }; 204} 205``` 206 207To install it into our environment, you can just run `nix-env -iA nixpkgs.myPackages`. If you want to load the packages to be built from a working copy of `nixpkgs` you just run `nix-env -f. -iA myPackages`. To explore what's been installed, just look through `~/.nix-profile/`. You can see that a lot of stuff has been installed. Some of this stuff is useful some of it isn't. Let's tell Nixpkgs to only link the stuff that we want: 208 209```nix 210{ 211 packageOverrides = pkgs: with pkgs; { 212 myPackages = pkgs.buildEnv { 213 name = "my-packages"; 214 paths = [ 215 aspell 216 bc 217 coreutils 218 gdb 219 ffmpeg 220 nixUnstable 221 emscripten 222 jq 223 nox 224 silver-searcher 225 ]; 226 pathsToLink = [ "/share" "/bin" ]; 227 }; 228 }; 229} 230``` 231 232`pathsToLink` tells Nixpkgs to only link the paths listed which gets rid of the extra stuff in the profile. `/bin` and `/share` are good defaults for a user environment, getting rid of the clutter. If you are running on Nix on MacOS, you may want to add another path as well, `/Applications`, that makes GUI apps available. 233 234### Getting documentation {#sec-getting-documentation} 235 236After building that new environment, look through `~/.nix-profile` to make sure everything is there that we wanted. Discerning readers will note that some files are missing. Look inside `~/.nix-profile/share/man/man1/` to verify this. There are no man pages for any of the Nix tools! This is because some packages like Nix have multiple outputs for things like documentation (see section 4). Let's make Nix install those as well. 237 238```nix 239{ 240 packageOverrides = pkgs: with pkgs; { 241 myPackages = pkgs.buildEnv { 242 name = "my-packages"; 243 paths = [ 244 aspell 245 bc 246 coreutils 247 ffmpeg 248 nixUnstable 249 emscripten 250 jq 251 nox 252 silver-searcher 253 ]; 254 pathsToLink = [ "/share/man" "/share/doc" "/bin" ]; 255 extraOutputsToInstall = [ "man" "doc" ]; 256 }; 257 }; 258} 259``` 260 261This provides us with some useful documentation for using our packages. However, if we actually want those manpages to be detected by man, we need to set up our environment. This can also be managed within Nix expressions. 262 263```nix 264{ 265 packageOverrides = pkgs: with pkgs; rec { 266 myProfile = writeText "my-profile" '' 267 export PATH=$HOME/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/sbin:/bin:/usr/sbin:/usr/bin 268 export MANPATH=$HOME/.nix-profile/share/man:/nix/var/nix/profiles/default/share/man:/usr/share/man 269 ''; 270 myPackages = pkgs.buildEnv { 271 name = "my-packages"; 272 paths = [ 273 (runCommand "profile" {} '' 274 mkdir -p $out/etc/profile.d 275 cp ${myProfile} $out/etc/profile.d/my-profile.sh 276 '') 277 aspell 278 bc 279 coreutils 280 ffmpeg 281 man 282 nixUnstable 283 emscripten 284 jq 285 nox 286 silver-searcher 287 ]; 288 pathsToLink = [ "/share/man" "/share/doc" "/bin" "/etc" ]; 289 extraOutputsToInstall = [ "man" "doc" ]; 290 }; 291 }; 292} 293``` 294 295For this to work fully, you must also have this script sourced when you are logged in. Try adding something like this to your `~/.profile` file: 296 297```ShellSession 298#!/bin/sh 299if [ -d $HOME/.nix-profile/etc/profile.d ]; then 300 for i in $HOME/.nix-profile/etc/profile.d/*.sh; do 301 if [ -r $i ]; then 302 . $i 303 fi 304 done 305fi 306``` 307 308Now just run `source $HOME/.profile` and you can starting loading man pages from your environment. 309 310### GNU info setup {#sec-gnu-info-setup} 311 312Configuring GNU info is a little bit trickier than man pages. To work correctly, info needs a database to be generated. This can be done with some small modifications to our environment scripts. 313 314```nix 315{ 316 packageOverrides = pkgs: with pkgs; rec { 317 myProfile = writeText "my-profile" '' 318 export PATH=$HOME/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/sbin:/bin:/usr/sbin:/usr/bin 319 export MANPATH=$HOME/.nix-profile/share/man:/nix/var/nix/profiles/default/share/man:/usr/share/man 320 export INFOPATH=$HOME/.nix-profile/share/info:/nix/var/nix/profiles/default/share/info:/usr/share/info 321 ''; 322 myPackages = pkgs.buildEnv { 323 name = "my-packages"; 324 paths = [ 325 (runCommand "profile" {} '' 326 mkdir -p $out/etc/profile.d 327 cp ${myProfile} $out/etc/profile.d/my-profile.sh 328 '') 329 aspell 330 bc 331 coreutils 332 ffmpeg 333 man 334 nixUnstable 335 emscripten 336 jq 337 nox 338 silver-searcher 339 texinfoInteractive 340 ]; 341 pathsToLink = [ "/share/man" "/share/doc" "/share/info" "/bin" "/etc" ]; 342 extraOutputsToInstall = [ "man" "doc" "info" ]; 343 postBuild = '' 344 if [ -x $out/bin/install-info -a -w $out/share/info ]; then 345 shopt -s nullglob 346 for i in $out/share/info/*.info $out/share/info/*.info.gz; do 347 $out/bin/install-info $i $out/share/info/dir 348 done 349 fi 350 ''; 351 }; 352 }; 353} 354``` 355 356`postBuild` tells Nixpkgs to run a command after building the environment. In this case, `install-info` adds the installed info pages to `dir` which is GNU info's default root node. Note that `texinfoInteractive` is added to the environment to give the `install-info` command.