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

lib.evalModules: init transformImport, allow users to preprocess imports #344874

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

hsjobeki
Copy link
Contributor

@hsjobeki hsjobeki commented Sep 27, 2024

Description of changes

Fyi: i am not sure about the name. Feel free to suggest other ones.

  • transformImport
  • prepareImport
  • processImport
  • importHandler

Fixes: #196584

Add transformImport to evalModules.

This allows users to:

  • Check imports.
  • Transform imports.
  • Use imports not supported natively, by downcasting/transforming their custom modules
  • Improve ergonomics as shown in the linked issue.

Also note:

How NOT to use the preprocessing:

  eval = lib.evalModules {
    transformImport = module: if eval.config.foo == 42 then module else {};

This causes infinite recursion. Imports cannot depend on config results.

Other considerations

  • This adds another attribute to evalModules. (Performance impact should be minimal, as this is only a single pointer)
  • Adds a little complexity.
  • When using this for custom Modules, will always require their specific transform, which makes them less portable.

Implementation Notes:

I needed to add more arguments to collectModules. I didn't know how to pass the options to collectModules otherwise.

Maybe a better approach would be to preserve compatibility of collectModules outside of evalModules / nixpkgs. I dont know if anyone uses it.

collectModules = collectModulesWith { };

collectModulesWith = {
  transformImport ? ...
}: ...

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 6.topic: module system About "NixOS" module system internals 6.topic: lib The Nixpkgs function library labels Sep 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
6.topic: lib The Nixpkgs function library 6.topic: module system About "NixOS" module system internals 10.rebuild-darwin: 0 10.rebuild-linux: 1-10
Projects
None yet
Development

Successfully merging this pull request may close these issues.

imports preprocessing function
1 participant