-
-
Notifications
You must be signed in to change notification settings - Fork 17.9k
lib.extendMkDerivation: init #234651
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.extendMkDerivation: init #234651
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| # Fixed-point arguments of build helpers {#chap-build-helpers-finalAttrs} | ||
|
|
||
| As mentioned in the beginning of this part, `stdenv.mkDerivation` could alternatively accept a fixed-point function. The input of such function, typically named `finalAttrs`, is expected to be the final state of the attribute set. | ||
| A build helper like this is said to accept **fixed-point arguments**. | ||
|
||
|
|
||
| Build helpers don't always support fixed-point arguments yet, as support in [`stdenv.mkDerivation`](#mkderivation-recursive-attributes) was first included in Nixpkgs 22.05. | ||
|
|
||
| ## Defining a build helper with `lib.extendMkDerivation` {#sec-build-helper-extendMkDerivation} | ||
|
|
||
| Developers can use the Nixpkgs library function [`lib.customisation.extendMkDerivation`](#function-library-lib.customisation.extendMkDerivation) to define a build helper supporting fixed-point arguments from an existing one with such support, with an attribute overlay similar to the one taken by [`<pkg>.overrideAttrs`](#sec-pkg-overrideAttrs). | ||
|
|
||
| Beside overriding, `lib.extendMkDerivation` also supports `excludeDrvArgNames` to optionally exclude some arguments in the input fixed-point argumnts from passing down the base build helper (specified as `constructDrv`). | ||
|
|
||
| :::{.example #ex-build-helpers-extendMkDerivation} | ||
|
|
||
| # Example definition of `mkLocalDerivation` extended from `stdenv.mkDerivation` with `lib.extendMkDerivation` | ||
|
|
||
| We want to define a build helper named `mkLocalDerivation` that builds locally without using substitutes by default. | ||
|
|
||
| Instead of taking a plain attribute set, | ||
|
|
||
| ```nix | ||
| { | ||
| preferLocalBuild ? true, | ||
| allowSubstitute ? false, | ||
| specialArg ? (_: false), | ||
| ... | ||
| }@args: | ||
|
|
||
| stdenv.mkDerivation ( | ||
| removeAttrs [ | ||
| # Don't pass specialArg into mkDerivation. | ||
| "specialArg" | ||
| ] args | ||
| // { | ||
| # Arguments to pass | ||
| inherit preferLocalBuild allowSubstitute; | ||
| # Some expressions involving specialArg | ||
| greeting = if specialArg "hi" then "hi" else "hello"; | ||
| } | ||
| ) | ||
| ``` | ||
|
|
||
| we could define with `lib.extendMkDerivation` an attribute overlay to make the result build helper also accepts the the attribute set's fixed point passing to the underlying `stdenv.mkDerivation`, named `finalAttrs` here: | ||
|
|
||
| ```nix | ||
| lib.extendMkDerivation { | ||
| constructDrv = stdenv.mkDerivation; | ||
| excludeDrvArgNames = [ | ||
| # Don't pass specialArg into mkDerivation. | ||
| "specialArg" | ||
| ]; | ||
| extendDrvArgs = | ||
| finalAttrs: | ||
| { | ||
| preferLocalBuild ? true, | ||
| allowSubstitute ? false, | ||
| specialArg ? (_: false), | ||
| ... | ||
| }@args: | ||
| { | ||
| # Arguments to pass | ||
| inherit | ||
| preferLocalBuild | ||
| allowSubstitute | ||
| ; | ||
| # Some expressions involving specialArg | ||
| greeting = if specialArg "hi" then "hi" else "hello"; | ||
| }; | ||
| } | ||
| ``` | ||
| ::: | ||
|
|
||
| If one needs to apply extra changes to the result derivation, pass the derivation transformation function to `lib.extendMkDerivation` as `lib.customisation.extendMkDerivation { transformDrv = drv: ...; }`. | ||
Uh oh!
There was an error while loading. Please reload this page.