nixpkgs/lib
Sam Pointon 4a3079eda3 systems: set rust.platform.env as rustc does
rustc allows code to perform compile-time tests against target_env [0], 
which is a function of the target triple. There isn't provision in 
Nixpkgs for learning target_env, however. That doesn't affect rustc's 
evaluation of cfg guards in Rust code - rustc knows perfectly well what 
target_env is - but it _does_ affect the env vars passed to a build 
script set by buildRustCrate, which is presently hard-coded to gnu, and 
also affects any Nix code looking to branch on target_env.

Being able to access target_env is very relevant to, for example, WASI 
as (using Rust terminology) wasm32-wasip1 and wasm32-wasip2 differ only 
by target_env, with identical target_arch and target_os values. Properly 
reflecting target_env may also fix some random musl issues if you're a 
bit lucky.

This commit adds a new attr, rust.platform.env, which reflects the 
target_env that rustc will set for the target, and wires it up in 
buildRustCrate. In isolation, this change mostly only affects build 
scripts checking target_env, but crate2nix will greatly benefit from 
being able to accurately resolve the dep graph (which can also vary 
depending on target_env).

The target triple -> target_env function resists Kolmogorov compression: 
it's irregular and, though there are some patterns, there are lots of 
special cases. So, I have done the stupidest possible thing and scraped 
out all of the targets with non-empty target_env values and dumped that 
into an attrset. This attrset will progressively get out of date as 
rustc adds new platforms, but updating it should be simple enough - I've 
included the generation script as a comment.

There are some other configuration options not being reflected in Nix. I 
have left those alone, but, in the future, maybe this can be extended to 
just dumping all of them into an attrset and then reflecting them in 
rust.platform. It might even make sense to convert the existing code 
producing rust.platform to just looking up from an attrset and to 'do 
what rustc does'.

I would have liked to have added a test targetting a platform with a 
non-empty non-GNU target_env, but all of the yaks were quite hairy.

Fixes https://github.com/NixOS/nixpkgs/issues/436832

[0]: https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.target_env
2026-06-15 16:21:13 +01:00
..
deprecated lib: don't inherit unused functions 2026-03-04 00:10:00 +03:00
fileset lib: remove unused let bindings and args@{} uses 2026-04-30 18:43:56 -04:00
licenses python3Packages.emmiai-noether: init at 2026.4.0 (#525203) 2026-05-28 16:28:27 +00:00
network lib: remove unused let bindings and args@{} uses 2026-04-30 18:43:56 -04:00
path lib: update type signatures 2026-03-04 00:10:00 +03:00
services lib/services: improve configure function documentation 2026-04-09 09:09:47 +02:00
systems systems: set rust.platform.env as rustc does 2026-06-15 16:21:13 +01:00
tests lib/types: remove functor.wrapped after deprecation phase of 2 full releases 2026-06-10 21:24:53 +02:00
.version 26.11 is Zokor 2026-05-24 15:07:40 +02:00
ascii-table.nix
asserts.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
attrsets.nix lib.attrsets.mergeAttrsList: check equality instead of comparing 2026-06-10 12:22:39 -04:00
cli.nix lib/cli: document toCommandLine 2025-12-27 15:26:38 +01:00
customisation.nix various: reduce // merges, optimize ++ chains across hot paths (#506793) 2026-05-27 22:06:37 +00:00
debug.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
default.nix lib.licenses: add compound licenses 2026-04-19 12:22:11 +02:00
derivations.nix lib: make warnOnInstantiate recurse into overrideAttrs result (#488797) 2026-03-28 21:39:56 +00:00
fetchers.nix lib.fetchers.withNormalizedHash: share removed attributes for every call 2026-05-19 22:07:17 -04:00
filesystem.nix lib: remove unused let bindings and args@{} uses 2026-04-30 18:43:56 -04:00
fixed-points.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
flake-version-info.nix
flake.nix
flakes.nix lib: re-export missing pure builtins in lib 2026-01-24 11:10:58 +01:00
generators.nix lib.generators.toGitINI: only recurse into necessary attributes 2026-05-21 18:16:47 -04:00
gvariant.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
kernel.nix
lists.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
meta.nix stdenv/check-meta: various performance cleanups (#514492) 2026-05-03 17:26:37 +00:00
minfeatures.nix lib/minfeatures: init from minver.nix 2025-08-22 12:47:13 +02:00
modules.nix lib/types: remove functor.wrapped after deprecation phase of 2 full releases 2026-06-10 21:24:53 +02:00
options.nix lib: remove unused let bindings and args@{} uses 2026-04-30 18:43:56 -04:00
README.md lib/minfeatures: init from minver.nix 2025-08-22 12:47:13 +02:00
source-types.nix lib.sourceTypes: add obfuscatedCode 2026-04-02 20:42:34 -07:00
sources.nix treewide: drop unnecessary toString calls 2026-06-04 13:11:56 +02:00
strings-with-deps.nix lib: update type signatures 2026-03-04 00:10:00 +03:00
strings.nix Reapply "lib/strings.concatLines: call concatStringsSep directly" 2026-04-28 20:19:04 +01:00
trivial.nix 26.11 is Zokor 2026-05-24 15:07:40 +02:00
types.nix lib/types: remove functor.wrapped after deprecation phase of 2 full releases 2026-06-10 21:24:53 +02:00
versions.nix lib: update type signatures 2026-03-04 00:10:00 +03:00

Nixpkgs lib

This directory contains the implementation, documentation and tests for the Nixpkgs lib library.

Overview

The evaluation entry point for lib is default.nix. This file evaluates to an attribute set containing two separate kinds of attributes:

  • Sub-libraries: Attribute sets grouping together similar functionality. Each sub-library is defined in a separate file usually matching its attribute name.

    Example: lib.lists is a sub-library containing list-related functionality such as lib.lists.take and lib.lists.imap0. These are defined in the file lists.nix.

  • Aliases: Attributes that point to an attribute of the same name in some sub-library.

    Example: lib.take is an alias for lib.lists.take.

Most files in this directory are definitions of sub-libraries, but there are a few others:

  • minfeatures.nix: A list of conditions for the used Nix version to match that are required to evaluate Nixpkgs.
  • tests: Tests, see Running tests
    • release.nix: A derivation aggregating all tests
    • misc.nix: Evaluation unit tests for most sub-libraries
    • *.sh: Bash scripts that run tests for specific sub-libraries
    • All other files in this directory exist to support the tests
  • systems: The lib.systems sub-library, structured into a directory instead of a file due to its complexity
  • path: The lib.path sub-library, which includes tests as well as a document describing the design goals of lib.path
  • All other files in this directory are sub-libraries

Module system

The module system spans multiple sub-libraries:

  • modules.nix: lib.modules for the core functions and anything not relating to option definitions
  • options.nix: lib.options for anything relating to option definitions
  • types.nix: lib.types for module system types

PR Guidelines

Follow these guidelines for proposing a change to the interface of lib.

Provide a Motivation

Clearly describe why the change is necessary and its use cases.

Make sure that the change benefits the user more than the added mental effort of looking it up and keeping track of its definition. If the same can reasonably be done with the existing interface, consider just updating the documentation with more examples and links. This is also known as the Fairbairn Threshold.

Through this principle we avoid the human cost of duplicated functionality in an overly large library.

Make one PR for each change

Don't have multiple changes in one PR, instead split it up into multiple ones.

This keeps the conversation focused and has a higher chance of getting merged.

Name the interface appropriately

When introducing new names to the interface, such as new function, or new function attributes, make sure to name it appropriately.

Names should be self-explanatory and consistent with the rest of lib. If there's no obvious best name, include the alternatives you considered.

Write documentation

Update the reference documentation to reflect the change.

Be generous with links to related functionality.

Write tests

Add good test coverage for the change, including:

  • Tests for edge cases, such as empty values or lists.

  • Tests for tricky inputs, such as a string with string context or a path that doesn't exist.

  • Test all code paths, such as if-then-else branches and returned attributes.

  • If the tests for the sub-library are written in bash, test messages of custom errors, such as throw or abortMsg,

    At the time this is only not necessary for sub-libraries tested with tests/misc.nix.

See running tests for more details on the test suites.

Write tidy code

Name variables well, even if they're internal. The code should be as self-explanatory as possible. Be generous with code comments when appropriate.

As a baseline, follow the Nixpkgs code conventions.

Write efficient code

Nix generally does not have free abstractions. Be aware that seemingly straightforward changes can cause more allocations and a decrease in performance. That said, don't optimise prematurely, especially in new code.

Reference documentation

Reference documentation for library functions is written above each function as a multi-line comment. These comments are processed using nixdoc and rendered in the Nixpkgs manual. The nixdoc README describes the comment format.

See doc/README.md for how to build the manual.

Running tests

All library tests can be run by building the derivation in tests/release.nix:

nix-build tests/release.nix

Some commands for quicker iteration over parts of the test suite are also available:

# Run all evaluation unit tests in tests/misc.nix
# if the resulting list is empty, all tests passed
nix-instantiate --eval --strict tests/misc.nix

# Run the module system tests
tests/modules.sh

# Run the lib.sources tests
tests/sources.sh

# Run the lib.filesystem tests
tests/filesystem.sh

# Run the lib.path property tests
path/tests/prop.sh

# Run the lib.fileset tests
fileset/tests.sh

Commit conventions

  • Make sure you read about the commit conventions common to Nixpkgs as a whole.

  • Format the commit messages in the following way:

    lib.(section): (init | add additional argument | refactor | etc)
    
    (Motivation for change. Additional information.)
    

    Examples:

    • lib.getExe': check arguments

    • lib.fileset: Add an additional argument in the design docs

      Closes #264537