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鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create (experimental) outputOf primop. #8813

Merged
merged 3 commits into from
Aug 14, 2023
Merged

Commits on Aug 14, 2023

  1. Rename optOutputPath to optStaticOutputPath

    This choice of variable name makes it more clear what is going on.
    
    Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
    Ericson2314 and roberth committed Aug 14, 2023
    Configuration menu
    Copy the full SHA
    a04720e View commit details
    Browse the repository at this point in the history
  2. Rework evaluator SingleDerivedPath infra

    `EvalState::mkSingleDerivedPathString` previously contained its own
    inverse (printing, rather than parsing) in order to validate what was
    parsed. Now that is pulled out into its own separate function:
    `EvalState::coerceToSingleDerivedPath`.
    
    In additional that pulled out logic is deduplicated with
    `EvalState::mkOutputString` via `EvalState::mkOutputStringRaw`, which is
    itself deduplicated (and generalized) with
    `DownstreamPlaceholder::mkOutputStringRaw`.
    
    All these changes make the unit tests simpler.
    
    (We would ideally write more unit tests for `mkSingleDerivedPathString`
    `coerceToSingleDerivedPath` directly, but we cannot yet do that because
    the IO in reading the store path won't work when the dummy store cannot
    hold anything. Someday we'll have a proper in-memory store which will
    work for this.)
    
    Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
    Ericson2314 and roberth committed Aug 14, 2023
    Configuration menu
    Copy the full SHA
    e7c39ff View commit details
    Browse the repository at this point in the history
  3. Create outputOf primop.

    In the Nix language, given a drv path, we should be able to construct
    another string referencing to one of its output. We can do this today
    with `(import drvPath).output`, but this only works for derivations we
    already have.
    
    With dynamic derivations, however, that doesn't work well because the
    `drvPath` isn't yet built: importing it like would need to trigger IFD,
    when the whole point of this feature is to do "dynamic build graph"
    without IFD!
    
    Instead, what we want to do is create a placeholder value with the right
    string context to refer to the output of the as-yet unbuilt derivation.
    A new primop in the language, analogous to `builtins.placeholder` can be
    used to create one. This will achieve all the right properties. The
    placeholder machinery also will match out the `outPath` attribute for CA
    derivations works.
    
    In 60b7121 we added that type of
    placeholder, and the derived path and string holder changes necessary to
    support it. Then in the previous commit we cleaned up the code
    (inspiration finally hit me!) to deduplicate the code and expose exactly
    what we need. Now, we can wire up the primop trivally!
    
    Part of RFC 92: dynamic derivations (tracking issue NixOS#6316)
    
    Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
    Ericson2314 and roberth committed Aug 14, 2023
    Configuration menu
    Copy the full SHA
    44c8d83 View commit details
    Browse the repository at this point in the history