1
0
Fork 0
forked from NixOS/nixpkgs
nixpkgs/lib
Emily 98dbc7cc58 Revert "lib.meta.availableOn: Return false if pkg parameter is null"
I believe this change is wrong both theoretically and practically.

Theoretically, `null` is available on every platform, because
`buildInputs = [ null ];` always succeeds and never throws a platform
availability error. `null` should be handled consistently with packages
that have no explicit list of supported platforms, as it of course
has no such list itself.

Practically, we use `null` to represent libraries that are always
present on a platform and do not require a library (for instance,
because they are part of `libc` or the macOS SDK). This has been
used for a long time by `libintl` (on all non‐glibc platforms),
and is also now used by `libGL` and friends on Darwin. This change
broke the check SDL3 does for OpenGL availability on Darwin, causing
<https://github.com/NixOS/nixpkgs/issues/407056>, which had to be
worked around by <https://github.com/NixOS/nixpkgs/pull/409525>.

Both `libintl` and `libGL` should count as available on platforms
where their functionality is part of the standard build environment,
and a package that is completely unavailable and whose functionality
cannot be expected should not use `null`, as it should result in
errors if used in a dependency list on an unsupported platform.

I accept that overriding with `null` is often a useful way to disable
dependencies that don’t have explicit feature flags, but I do not
think that making it work better with feature flags conditioned on
availability is worth the inconsistency and problems caused by this
change. Packages can instead expose the relevant feature flags as
arguments that default to the `lib.meta.availableOn` check or, if they
want to keep an “override the dependency to `null`” interface,
insert an explicit `pkg != null && …` check.

Additionally, the pull request was merged over a week after all
breaking changes were restricted for the 25.05 release. I believe that
the potential problems of dealing with the effects of this change for
an entire release cycle – the first release cycle where `libGL` is
`null` on Darwin, a change I made before the deadline and before this
change to `lib.meta.availableOn` – offset the risks of backporting
this revert at such a late stage.

It will cause overrides to backwards‐incompatibly revert to the
behaviour they had before the change, but since such overrides were
not possible until a few weeks ago, I hope that is an acceptable risk
compared to the potential issues leaving this in the release can
cause, given that it was merged after the deadline and has already
broken an existing construction in Nixpkgs.

This reverts commit 9338d924db.
2025-05-23 15:09:41 +01:00
..
deprecated treewide: Format all Nix files 2025-04-01 20:10:43 +02:00
fileset Format: lib/fileset/internal.nix 2025-02-12 15:01:45 +07:00
network Docs: migrate format of comments to doc-comments 2025-02-12 15:01:43 +07:00
path docs: fix typo: readDir -> dirOf 2025-05-12 00:36:30 -07:00
systems lib.systems: raise minimum loongarch64 feature support (#403201) 2025-05-23 10:00:37 +08:00
tests treewide: maintainers-list.nix -> maintainer-list.nix (#409585) 2025-05-22 15:42:16 +05:30
.version lib/.version: Fix version file formatting 2025-05-16 19:53:23 +02:00
ascii-table.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
asserts.nix lib/asserts: Factor out NixOS's toplevel assertion / warning logic. 2025-05-14 01:21:10 -04:00
attrsets.nix lib: refactor lib.attrsets.{mapAttrs', mapAttrsToList} and mapAttrs'' in the strongswan-swanctl module 2025-05-08 13:58:54 +08:00
cli.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
customisation.nix lib.extendMkDerivation: init 2025-01-18 14:20:45 +08:00
debug.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
default.nix lib.strings: init toCamelCase 2025-05-11 20:24:56 -03:00
derivations.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
fetchers.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
filesystem.nix treewide: Format all Nix files 2025-04-01 20:10:43 +02:00
fixed-points.nix
flake-version-info.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
flake.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
generators.nix treewide: Format all Nix files 2025-04-01 20:10:43 +02:00
gvariant.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
kernel.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
licenses.nix licenses: add gpl2UBDLPlus 2025-05-13 16:49:21 +00:00
lists.nix lib.takeEnd: init 2025-04-13 17:37:35 +03:00
meta.nix Revert "lib.meta.availableOn: Return false if pkg parameter is null" 2025-05-23 15:09:41 +01:00
minver.nix
modules.nix lib.modules.importApply: Fix doc typo; _keykey 2025-05-08 17:48:50 +01:00
options.nix lib.options.mkPackageOption: use lib.showAttrPath 2025-04-13 20:54:13 +01:00
README.md
source-types.nix treewide: format all inactive Nix files 2024-12-10 20:26:33 +01:00
sources.nix Format: lib/sources.nix 2025-02-12 15:01:45 +07:00
strings-with-deps.nix treewide: Format all Nix files 2025-04-01 20:10:43 +02:00
strings.nix lib.strings: init toCamelCase 2025-05-11 20:24:56 -03:00
trivial.nix 25.11 is Xantusia 2025-05-16 19:21:55 +02:00
types.nix lib/types: check paths in pathWith with hasStorePathPrefix (#387304) 2025-04-21 10:45:23 +02:00
versions.nix Format: lib/versions.nix 2025-02-12 15:01:45 +07: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:

  • minver.nix: A string of the minimum version of Nix that is 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