Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stdenv: warn about duplicate programs in PATH #329117

Draft
wants to merge 1 commit into
base: staging
Choose a base branch
from

Conversation

tie
Copy link
Member

@tie tie commented Jul 22, 2024

Description of changes

When adding packages to build inputs, multiple packages may provide the same program. This is not always intentional, e.g. for Darwin, adding cctools package partially overrides tools from stdenv’s cc attribute (that is provided to derivations as a default native build input and hence is lower on the search path). Note that we don’t currently set CC/AR/etc to absolute paths.

This change adds checks right after the PATH is constructed in stdenv’s setup.sh to warn about duplicate programs on the PATH search path.

Example output
$ PATH= $(type -P nix) develop --file . gcc

$ _checkDuplicateProgramsInUnixPATH
WARNING: final PATH contains 2 instances of patchelf executable (the first is /nix/store/3928df2h57zwvm6gxin5iswwdhdfmxal-patchelf-0.15.0/bin/patchelf)
WARNING: final PATH contains 2 instances of xz executable (the first is /nix/store/d1ycvz1j109k5i62kdpp9d8w38nq2fhj-xz-5.6.2-bin/bin/xz)

$ NIX_DEBUG=1 _checkDuplicateProgramsInUnixPATH
WARNING: final PATH contains 2 instances of patchelf executable
  patchelf ⇒
    /nix/store/3928df2h57zwvm6gxin5iswwdhdfmxal-patchelf-0.15.0/bin/patchelf
    /nix/store/jkh2cpc9h2pyaayi0pyxb1sw641wk7l8-bootstrap-tools/bin/patchelf
WARNING: final PATH contains 2 instances of xz executable
  xz ⇒
    /nix/store/d1ycvz1j109k5i62kdpp9d8w38nq2fhj-xz-5.6.2-bin/bin/xz
    /nix/store/jkh2cpc9h2pyaayi0pyxb1sw641wk7l8-bootstrap-tools/bin/xz

The implementation currently focuses on Unix-like PATH. Windows has a bit more rules for PATH lookups, but we don’t support Windows as a build platform. If Nix and Nixpkgs eventually get ported to Windows, the name of the function should hopefully hint that it should be updated to match the platform semantics.

For convenience, this change also adds isExecutable function to the stdenv that checks whether a file has executable file mode bit set.

Things done

  • Built on platform(s)
    • x86_64-linux
    • aarch64-linux
    • x86_64-darwin
    • aarch64-darwin
  • For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)
    • sandbox = relaxed
    • sandbox = true
  • Tested, as applicable:
  • Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
  • Tested basic functionality of all binary files (usually in ./result/bin/)
  • 24.11 Release Notes (or backporting 23.11 and 24.05 Release notes)
    • (Package updates) Added a release notes entry if the change is major or breaking
    • (Module updates) Added a release notes entry if the change is significant
    • (Module addition) Added a release notes entry if adding a new NixOS module
  • Fits CONTRIBUTING.md.

Add a 👍 reaction to pull requests you find important.

@github-actions github-actions bot added the 6.topic: stdenv Standard environment label Jul 22, 2024
When adding packages to nativeBuildInputs, multiple packages may
provide the same program. This is not always intentional, e.g. for
Darwin, adding cctools package partially overrides tools from stdenv’s
cc attribute (that is provided to derivations as a default native build
input and hence is lower on the search path). Note that we don’t
currently set CC/AR/etc to absolute paths.

This change adds checks right after the PATH is constructed in stdenv’s
setup.sh to warn about duplicate programs on the PATH search path.

Example output:
```console
$ PATH= $(type -P nix) develop --file . gcc

devshell$ _checkDuplicateProgramsInUnixPATH
WARNING: final PATH contains 2 instances of patchelf executable (the first is /nix/store/3928df2h57zwvm6gxin5iswwdhdfmxal-patchelf-0.15.0/bin/patchelf)
WARNING: final PATH contains 2 instances of xz executable (the first is /nix/store/d1ycvz1j109k5i62kdpp9d8w38nq2fhj-xz-5.6.2-bin/bin/xz)

devshell$ NIX_DEBUG=1 _checkDuplicateProgramsInUnixPATH
WARNING: final PATH contains 2 instances of patchelf executable
  patchelf ⇒
    /nix/store/3928df2h57zwvm6gxin5iswwdhdfmxal-patchelf-0.15.0/bin/patchelf
    /nix/store/jkh2cpc9h2pyaayi0pyxb1sw641wk7l8-bootstrap-tools/bin/patchelf
WARNING: final PATH contains 2 instances of xz executable
  xz ⇒
    /nix/store/d1ycvz1j109k5i62kdpp9d8w38nq2fhj-xz-5.6.2-bin/bin/xz
    /nix/store/jkh2cpc9h2pyaayi0pyxb1sw641wk7l8-bootstrap-tools/bin/xz
```

The implementation currently focuses on Unix-like PATH. Windows has a
bit more rules for PATH lookups, but we don’t support Windows as a build
platform. If Nix and Nixpkgs eventually get ported to Windows, the name
of the function should hopefully hint that it should be updated to match
the platform semantics.

For convenience, this change also adds isExecutable function to the
stdenv that checks whether a file has executable file mode bit set.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant